튜토리얼
Week 5: Neo4j

Week 5. 그래프 데이터베이스 (Neo4j)

LPG 모델링, Cypher 쿼리, 인덱싱, 성능 최적화


학습 목표

이 튜토리얼을 완료하면 다음을 할 수 있습니다:

  • LPG(Labeled Property Graph) 모델 이해
  • Cypher 쿼리 언어 마스터
  1. Neo4j Python 드라이버 사용
  2. 인덱싱과 성능 최적화

핵심 개념

1. LPG vs RDF

이론 vs 실전: "에스페란토" vs "모국어"

Week 1-4에서 배운 RDF/OWL은 W3C 표준으로, 데이터 교환을 위해 설계되었습니다.

RDF에스페란토(국제 공용어) 라면, Neo4j모국어와 같습니다.

  • RDF: 서로 다른 조직 간에 데이터를 공유할 때 완벽합니다 (형식적, 표준적).
  • Neo4j: 실제 애플리케이션을 빠르게 구축하고 실행하는 데 최적화되어 있습니다 (실용적, 고성능).

실시간 추천 시스템을 만들 때는 '국제 표준 준수'보다 '밀리초 단위의 응답 속도'가 더 중요합니다. 그래서 실무에서는 Neo4j 같은 LPG 모델을 많이 사용합니다.

특성LPG (Neo4j)RDF
노드라벨 + 속성URI
엣지타입 + 속성Predicate만
쿼리CypherSPARQL
추론직접 구현내장 지원

2. Cypher 기본

// 노드 생성
CREATE (m:Movie {title: "Inception", year: 2010})
CREATE (d:Director {name: "Christopher Nolan"})
 
// 관계 생성
CREATE (d)-[:DIRECTED]->(m)
 
// 조회
MATCH (d:Director)-[:DIRECTED]->(m:Movie)
WHERE d.name = "Christopher Nolan"
RETURN m.title, m.year

3. Python 연동

from neo4j import GraphDatabase
 
class MovieGraph:
    def __init__(self, uri, user, password):
        self.driver = GraphDatabase.driver(uri, auth=(user, password))
 
    def add_movie(self, title, year, director):
        with self.driver.session() as session:
            session.run("""
                MERGE (d:Director {name: $director})
                MERGE (m:Movie {title: $title, year: $year})
                MERGE (d)-[:DIRECTED]->(m)
            """, title=title, year=year, director=director)
 
    def find_movies_by_director(self, director):
        with self.driver.session() as session:
            result = session.run("""
                MATCH (d:Director {name: $director})-[:DIRECTED]->(m:Movie)
                RETURN m.title AS title, m.year AS year
            """, director=director)
            return [dict(record) for record in result]
 
# 사용
graph = MovieGraph("bolt://localhost:7687", "neo4j", "password")
graph.add_movie("Inception", 2010, "Christopher Nolan")
movies = graph.find_movies_by_director("Christopher Nolan")

4. 고급 Cypher

경로 탐색

// 2단계 관계 탐색
MATCH path = (a:Actor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coactor:Actor)
WHERE a.name = "Tom Hanks"
RETURN DISTINCT coactor.name
 
// 최단 경로
MATCH path = shortestPath(
    (a:Actor {name: "Kevin Bacon"})-[*]-(b:Actor {name: "Tom Hanks"})
)
RETURN length(path), [n IN nodes(path) | n.name]

집계와 정렬

// 감독별 영화 수
MATCH (d:Director)-[:DIRECTED]->(m:Movie)
RETURN d.name, count(m) AS movieCount
ORDER BY movieCount DESC
LIMIT 10

5. 인덱싱

// 인덱스 생성
CREATE INDEX movie_title FOR (m:Movie) ON (m.title)
CREATE INDEX director_name FOR (d:Director) ON (d.name)
 
// 복합 인덱스
CREATE INDEX movie_year_title FOR (m:Movie) ON (m.year, m.title)
 
// 전문 검색 인덱스
CREATE FULLTEXT INDEX movie_search FOR (m:Movie) ON EACH [m.title, m.plot]

면접 질문 맛보기

Q: Neo4j에서 MERGE와 CREATE의 차이점은?

  • CREATE: 항상 새 노드/관계 생성
  • MERGE: 존재하면 조회, 없으면 생성 (UPSERT)

더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.


🎬 프로젝트: 영화 추천 지식그래프

진행 현황

Week주제프로젝트 마일스톤
1온톨로지 입문✅ 영화 도메인 설계 완료
2RDF & RDFS✅ 영화 10편 RDF 변환 완료
3OWL & 추론✅ 추론 규칙 적용 완료
4지식 추출✅ 영화 100편 자동 수집 완료
5Neo4j그래프 DB에 저장 및 쿼리
6GraphRAG자연어 질의
7온톨로지 에이전트새 영화 자동 업데이트
8도메인 확장의료/법률/금융 케이스
9서비스 배포API + 대시보드

Week 5 마일스톤: Neo4j에 영화 지식그래프 저장

RDF 데이터를 Neo4j 그래프 DB로 마이그레이션하고 Cypher로 추천 쿼리를 작성합니다.

Neo4j 스키마:

// 노드
(:Movie {title, releaseDate, rating, runtime})
(:Person {name, birthDate})
(:Genre {name})
 
// 관계
(:Person)-[:DIRECTED]->(:Movie)
(:Person)-[:ACTED_IN]->(:Movie)
(:Movie)-[:HAS_GENRE]->(:Genre)

추천 쿼리 예시:

// 인셉션과 같은 장르 + 같은 배우 영화 추천
MATCH (m:Movie {title: "Inception"})-[:HAS_GENRE]->(g:Genre),
      (m)<-[:ACTED_IN]-(a:Person)-[:ACTED_IN]->(rec:Movie)
WHERE rec <> m AND (rec)-[:HAS_GENRE]->(g)
RETURN rec.title, count(*) as score
ORDER BY score DESC LIMIT 5

성능 최적화:

  • 인덱스: CREATE INDEX ON :Movie(title)
  • 제약조건: CREATE CONSTRAINT ON (m:Movie) ASSERT m.title IS UNIQUE

프로젝트 노트북에서 영화 데이터를 그래프 DB에 저장하고 추천 쿼리를 작성합니다.

프로젝트 노트북에서는 다음을 직접 구현합니다:

  • Docker로 Neo4j 실행 및 Python 연결
  • 영화 100편 + 감독/배우 노드 생성
  • "인셉션과 비슷한 영화" 추천 Cypher 쿼리
  • 인덱스 생성으로 쿼리 성능 10배 향상

9주 후 완성되는 것: "놀란 감독 스타일의 SF 영화 추천해줘"라고 물으면, 지식그래프에서 감독-장르-평점 관계를 추론하고 자연어로 답변하는 AI 에이전트


실습 노트북

이론을 더 깊이 탐구하고 싶다면:

실습 노트북에서는 추가로 다음 내용을 다룹니다:

  • Neo4j Aura 클라우드 설정
  • APOC 라이브러리 활용
  • EXPLAIN/PROFILE로 쿼리 최적화
  • 그래프 알고리즘 (PageRank, Community Detection)

다음: Week 6: GraphRAG