2025년 11월 9일 일요일

그래프 데이터베이스란?

그래프 DB 통합 가이드 — Neo4j 모델, ETL, 추천 시스템 아키텍처

그래프 DB 통합 가이드 — Neo4j 모델 · ETL · 추천 시스템 아키텍처

관계 중심 문제에 그래프를 적용하는 방법을 Neo4j 예제, 관계형→그래프 ETL(파이썬 코드 포함), 실전 추천 시스템 아키텍처까지 한 페이지로 정리했습니다.

1. Neo4j 데이터 모델 & 핵심 Cypher 예제

모델: 사용자(User), 상품(Product), 카테고리(Category), 이벤트(예: PURCHASED, VIEWED, RATED).

스키마 제약(권장)

CREATE CONSTRAINT unique_user_id IF NOT EXISTS
  FOR (u:User) REQUIRE u.user_id IS UNIQUE;

CREATE CONSTRAINT unique_product_id IF NOT EXISTS
  FOR (p:Product) REQUIRE p.product_id IS UNIQUE;
      

샘플 데이터 생성

/* 예제: 사용자·상품·구매 관계 생성 */
CREATE (u1:User {user_id:'u1', name:'홍길동'})
CREATE (u2:User {user_id:'u2', name:'김영희'})
CREATE (p1:Product {product_id:'p100', title:'무선이어폰'})
CREATE (p2:Product {product_id:'p200', title:'블루투스 스피커'})
CREATE (p3:Product {product_id:'p300', title:'보조배터리'})
CREATE (u1)-[:PURCHASED {ts: datetime('2025-11-01T09:12:00')}]->(p1)
CREATE (u1)-[:VIEWED {ts: datetime('2025-11-02T10:00:00')}]->(p2)
CREATE (u2)-[:PURCHASED {ts: datetime('2025-10-30T14:20:00')}]->(p1)
CREATE (u2)-[:PURCHASED {ts: datetime('2025-11-03T11:05:00')}]->(p3);
      

기본 추천 쿼리 (협업 필터링, 간단한 동료 기반)

사용자와 비슷한 사용자가 구매한 상품을 추천(해당 사용자가 아직 구매하지 않은 상품 우선)

MATCH (u:User {user_id:'u1'})-[:PURCHASED]->(p:Product)
WITH u, collect(p) AS myProducts
MATCH (u)-[:PURCHASED]->(p)<-[:PURCHASED]-(other:User)-[:PURCHASED]->(rec:Product)
WHERE NOT (u)-[:PURCHASED]->(rec)
RETURN rec.product_id AS product_id, rec.title AS title, count(*) AS score
ORDER BY score DESC, title
LIMIT 10;
      

간단한 그래프 알고리즘 예 — 공통 이웃 기반 유사도 (Neo4j Graph Data Science 사용)

사전 설치된 GDS 라이브러리 가정. 사용자 유사도 계산 예시(간단)

/* 예: 사용자 노드로 프로젝트 생성 후 commonNeighbors 유사도 계산 */
CALL gds.graph.project(
  'userProductGraph',
  ['User','Product'],
  { PURCHASED: { orientation: 'UNDIRECTED' } }
);

CALL gds.nodeSimilarity.stream('userProductGraph')
YIELD node1, node2, similarity
WHERE gds.util.asNode(node1).user_id = 'u1' OR gds.util.asNode(node2).user_id = 'u1'
RETURN gds.util.asNode(node1).user_id AS userA,
       gds.util.asNode(node2).user_id AS userB,
       similarity
ORDER BY similarity DESC LIMIT 10;
      
참고: 실제 서비스에서는 '구매 가중치', '최근성 가중', '카테고리 필터' 등을 결합하면 추천 품질이 크게 향상됩니다.

2. 관계형 DB → 그래프 DB(Neo4j) ETL 가이드

목표: 기존 RDB(예: PostgreSQL)의 users, products, orders 테이블을 그래프 모델(노드·관계)로 적재.

1) 매핑(데이터 모델 변환)

RDB 테이블/컬럼그래프 모델
users(id, name, email)(:User {user_id:id, name, email})
products(id, title, category_id)(:Product {product_id:id, title}), (:Category {category_id})
orders(id, user_id, product_id, created_at)(User)-[:PURCHASED {ts:created_at}]->(Product)

2) ETL 전략(권장)

  • 1) 스키마 제약(Unique constraints) 먼저 생성
  • 2) 배치 처리: 큰 테이블은 청크(예: 1,000~50,000 row)로 나눠 적재
  • 3) idempotency 확보: MERGE 사용 또는 tx별 중복 체크
  • 4) 에러 로깅 및 재시도 정책
  • 5) 초기 로드 후 점진적 동기화(CDC 또는 변경 로그 사용)

3) 파이썬 ETL 예시 (Postgres → Neo4j)

설명: psycopg2로 Postgres에서 데이터를 읽어 neo4j 드라이버로 쓰는 간단한 예제. 실제 환경에서는 커넥션 풀·병렬화·재시도 로직을 추가하세요.

# Python 3 예시 (간단한 흐름)
# 필요 패키지: psycopg2, neo4j
# pip install psycopg2-binary neo4j

import psycopg2
from neo4j import GraphDatabase
from datetime import datetime

# --- 설정 ---
pg_conf = {"host":"PG_HOST","port":5432,"dbname":"db","user":"pguser","password":"pgpass"}
neo4j_uri = "neo4j+s://NEO4J_HOST:7687"
neo4j_auth = ("neo4j_user","neo4j_password")

# --- Postgres 연결 및 사용자 배치 로드 ---
pg_conn = psycopg2.connect(**pg_conf)
pg_cur = pg_conn.cursor(name='user_cursor')  # server-side cursor for batching
pg_cur.itersize = 1000
pg_cur.execute("SELECT id, name, email FROM users;")

driver = GraphDatabase.driver(neo4j_uri, auth=neo4j_auth, encrypted=True)

def upsert_user(tx, user_id, name, email):
    tx.run("""
      MERGE (u:User {user_id: $user_id})
      SET u.name = $name, u.email = $email
    """, user_id=str(user_id), name=name, email=email)

with driver.session() as session:
    for row in pg_cur:
        uid, name, email = row
        session.write_transaction(upsert_user, uid, name, email)

# --- orders 적재 예 (관계 생성) ---
pg_cur2 = pg_conn.cursor()
pg_cur2.execute("SELECT user_id, product_id, created_at FROM orders ORDER BY created_at;")
batch = []
with driver.session() as session:
    for user_id, product_id, created_at in pg_cur2:
        session.write_transaction(
          lambda tx, u,p,ts: tx.run(
            "MATCH (u:User {user_id:$u}),(p:Product {product_id:$p}) "
            "MERGE (u)-[:PURCHASED {ts:$ts}]->(p)",
            u=str(user_id), p=str(product_id), ts=str(created_at)
          ), user_id, product_id, created_at
        )

pg_cur.close(); pg_cur2.close(); pg_conn.close(); driver.close()
      

4) CDC(변경 데이터 캡처) 연동 아이디어

  • Debezium + Kafka → Kafka Connect → Neo4j Kafka Connector(또는 사용자 커넥터)로 실시간 반영
  • 단순한 경우: DB trigger → 변경 로그 테이블 → 주기적 ETL(빠른 반영 불가)
운영 팁: 초기 대량 적재는 배치로, 그 이후 실시간 동기화는 CDC 기반이 가장 안정적입니다. Neo4j에서는 MERGE 사용 시 성능 주의(대량 MERGE는 인덱스 활용과 청크 나눔 필수).

3. 추천 시스템 아키텍처 (그래프 기반) — 다이어그램 + 설명

데이터 소스 RDB(orders, users) 로그(views, clicks) 실시간 이벤트 Kafka / Kinesis (Clickstream) ETL / Stream Processor Batch (Python ETL) Streaming (Kafka Connect / Debezium) Graph DB (Neo4j) 노드: User, Product, Category 관계: PURCHASED, VIEWED, RATED Analytics / GDS 유사도, 개인화 점수, 임시 그래프 Serving / API Recommendation API (REST) Cache: Redis Client 웹/앱 (상품 추천 호출) Batch / Stream GDS (Graph Data Science) Cache & Low-latency

아키텍처 핵심 포인트

  • 데이터 수집층: 기존 RDB는 정기 배치 ETL로 초기 로드, 이후 변경은 CDC(Debezium)로 스트리밍 연동.
  • 그래프 저장소: Neo4j에 사용자·상품·행동(조회·구매)을 적재. 관계 중심 쿼리에 최적화.
  • 분석층: GDS(Neo4j Graph Data Science)로 유사도·페이지랭크·퍼스널라이즈 점수 산출. 무거운 배치 작업은 별도의 분석 클러스터에서 수행 후 결과(추천 후보)를 다시 Neo4j나 별도 테이블에 저장.
  • 서빙층: API 서버가 Neo4j를 직접 쿼리하거나, 사전 계산된 추천(또는 후보 + 랭킹)을 Redis에 캐시해 저지연 응답 제공.

실전용 추천 흐름 (예)

  1. 사용자 페이지 로드 → 캐시(Redis)에 추천있으면 반환
  2. 캐시에 없으면: API가 Neo4j에 아래 쿼리 요청 → 결과 반환 후 캐시
  3. 정기 배치: GDS로 상위 후보(예: Top-100) 계산 → 개인화 랭킹 적용 → Redis/DB에 저장

실전용 저지연 Cypher (캐시 미존재 시 대체 쿼리)

/* 1) 동일 제품을 구매한 다른 사용자가 구매한 상품 추천 (간단, 캐시 백업용) */
MATCH (u:User {user_id:$userId})-[:PURCHASED]->(p:Product)
MATCH (p)<-[:PURCHASED]-(other:User)-[:PURCHASED]->(rec:Product)
WHERE NOT (u)-[:PURCHASED]->(rec)
RETURN rec.product_id AS id, rec.title AS title, count(*) AS score
ORDER BY score DESC LIMIT 20;

/* 2) 카테고리·최근성 가중치 추가(간단 가중치 적용 예) */
MATCH (u:User {user_id:$userId})-[r:PURCHASED]->(p:Product)
WITH u, collect(p) AS myProducts
MATCH (u)-[:PURCHASED]->()<-[:PURCHASED]-(other:User)-[r2:PURCHASED]->(rec:Product)
WHERE NOT (u)-[:PURCHASED]->(rec)
WITH rec, count(*) AS cfScore, sum(CASE WHEN r2.ts > datetime().epochMillis - 30*24*3600*1000 THEN 2 ELSE 1 END) AS recentBoost
RETURN rec.product_id AS id, rec.title AS title, (cfScore * 0.7 + recentBoost * 0.3) AS score
ORDER BY score DESC LIMIT 20;
      
운영 팁: Neo4j에 직접적인 복잡·무거운 쿼리를 자주 호출하면 비용이 커집니다. 가능한 후보 생성은 배치·GDS에서 처리하고, 실시간 랭킹·필터만 API 레이어에서 수행하세요.
실행 제안

원하시면 이 HTML을 기반으로 (1) Neo4j용 PoC 데이터셋(샘플 CSV), (2) Debezium+Kafka→Neo4j 예제 설정 파일, (3) API 서버(Flask/Node) 샘플 코드를 추가로 만들어 드리겠습니다.

댓글 없음:

댓글 쓰기

태그

2025년 가열재생방식 가치기반 가치기반학습 가치이터레이션 강화학습 강화학습기초이론 강화학습방법 강화학습종류 개나리 개념 개발업무 최적화 건강 건식전극코팅 검사 검사기 검사장비 검사장비 양산라인 투입 절차 검색엔진최적화 검색키워드 검출율 경쟁력 경험재플레이 고체전해질적용 공부방법 공정간 에너지 흐름 공정내 에너지 절감 기술 과검율 관절 구글검색키워드 군마트 극초박형 셀제조 기계학습 기내반입 기대값 기초용어 나스닥 남녀사랑 냉각시스템 네이버 네이버 검색 키워드 분석 단백질 답변거부능력 더 원씽 덕담 동적계획법 듀얼브레인 드로스 딥시크 레이저노칭 문제점 로봇산업 롤투롤 생산공정 리액트히터 리튬산업 마르코프과정 마르코프의사결정 막걸리 말을 잘하는 방법 멀티 스텝 모델링 메모리 메인내용 메주콩 메주콩파종 멧돌호박 모델기반학습 모델종류 모델프리학습 모듈 모바일 몬테카를로 방법 몬테카를로방법 물류 및 공급망 최적화 물성의 성질 미국 오하이오 미국주가 미국주식 미래기술전망 미래전망 미세플라스틱 미중경쟁 밀도범함수이론 반도체 가격 상승 반사율 방수 배터리 배터리 주요불량 배터리공정 배터리기술 배터리불량 배터리소재 배터리신뢰성 배터리와인공지능 배터리정책 배터리제조 배터리제조신기술 백주 뱀때 버거체인 벨만방정식 병역명문가 보조배터리 보조배터리 기내반입 분석솔루션 불량원인분석 비례적분미분제어 비전 비지도학습 사랑 삼성반도체 새피해 새해인사 새해인사말 생각정리 생각정리기술 생마늘 생산계획 생수 생수페트병 설계최적화 설날인사말 설비고장예측 성심당 성심당온라인 구매 성심당추천빵 셀 스웰링 셀스웰링 셀투팩 소매업 소재개발 소프트뱅크 쇠뜨기 수명예측 수요예측 스마트팩토리 스웰링불량 시간차학습 시계열분석 시뮬레이션 신뢰성 액터-크리틱 양배추 양자컴퓨터 어텐션 어텐션메커니즘 에너지 절감 에너지 절감방법 에너지사용최적화 에너지절감 에너지절감방안 에어드라이어 에피소드 기반 학습 엘지전자 영어 영어 리스닝 예제 오버행불량 오버행불량원인 오프폴리시 온누리상품권 온폴리시 용접 워런버핏 원달러 변화패턴 원달러 환율전망 원엔환율 원인 원자간 상호작용 학습 및 예측 웬디스버거 을사 인간피드백을 통한 강화학습 인공지능 인공지능경쟁 인생 일본금리 일본환율 자발적DR 자이가르닉 효과 장마 재고관리 재생시스템 재활용소재활용 저전압 저축 전자분포 전자의 움직임 전자의분포 전자의움직임 전통시장통통 정식방법 정책기반 정책기반 이터레이션 정책기반학습 정책이터레이션 제사상 제습공조설비 제습효율 제조업 제조에너지절감 제품개발 젠슨황 조합최적화 주식 중국공급과잉 중요샘플링 지도학습 지도학습미세조정 지붕방수 지수평활법 창신메모리테크놀로지 책줄거리 청주 최신배터리기술 최신이슈 최적제어 추정 추천빵 코스모스 콜드 스타트 키워드 분석 탁주 통계적 방법 투자 투자가 투자철학 트럼프2.0 트루시니스 파종 패키징공정 페트병 페트병두께 푸른뱀때 품질관리 피엑스 필요기술 필요지식 하이닉스 학습항목 한국반도체 행복 행위적인공지능 현대차 화합물 물성 확률 효능 효율적인 업무방법 휴머노이드로봇 흡착식 에너 드라이어 흡착식에어드라이어 흡착제 힘의교환 Actor Actor-Critic 강화학습 Actor-Critic학습 Agentic AI AI AI기반품질관리 Air Dryer ARIMA AS재고관리 Attention Attention Algorithm Battery Manufacturing Battery Manufaturing Battery Material Books Books for Beginners to Learn About LLM CATL Cell to Pack confusion matrix Critic CTC CTP CXMT DDR5 Deep Learning Deep Seek DeepSeek Demand Response DFT DIO Double DQN DP DPO DQN Dross DSO Dueling DQN dumplings Dynamic Programming ESS ESS솔루션 EV FFC FFC체결여부 검사 garlic genesis Gongi Graph Enhanced RAG Health Horsetail Hot Areas how to speak well Human Feedback importance sampling Kitchen hoods Korean dumplings Korean Rice Cake Soup Korean Traditional Game Large Language Models LLM LSTM Machine Learning Interatomic Potential Mandy Material Development MDP MLIP MMFF94 Multi-step Modeling New Battery Materials NMP Recovery Nuts PCU Physical AI PID제어 ppm PPO Pre Cooling Unit pre training Precooling Unit Prophet Protein Q-Learning Quality Inspection Data Quality Management RAG Raw Garlic RCU React Heater REINFORCE REINFORCE학습 Reinforcement Learning Reliability Return cooling Unit RL RLHF RORL RUL방법 SARIMA SARSA SCM SCM 핵심 재무 지표 SEO SFT SHAP SHAP로직 small kitchen hoods squd Squid Game Stacking TD학습 Temporal Difference Tener Stack Time Difference Learning truthiness Ttakji Tteokguk VAR ventilations for small spaces Vision Water Z-Stacking