GraphDB with Neo4j

김소은·2025년 6월 4일
  • GraphDb 이론
  • Neo4j 설치하기
  • Neo4j 기본컨셉 이해
  • CQL 이해하기
  • 리팩토링

🔏 1. Cypher(Cypher Query Language aka CQL)

🧾 용어 정리

용어설명비고
CypherNeo4j에서 사용하는 그래프 질의 언어SQL에 대응되는 Neo4j 전용 언어
CQL (Cypher Query Language)Cypher의 공식 명칭 또는 별칭Cypher = CQL

즉, Cypher = CQL이고, 둘 다 같은 것을 가리킵니다. Neo4j 문서에서도 혼용되지만, "Cypher"라는 이름이 더 널리 쓰입니다.


🧠 Cypher (또는 CQL)의 특징

  • SQL처럼 읽기 쉬운 문법을 가지고 있음
  • 그래프 데이터를 탐색하거나 조작하는 데 최적화됨
  • 선언형 언어 (what to do, not how to do it)

📌 Cypher vs SQL 간단 비교

SQLCypher
SELECT * FROM usersMATCH (u:User) RETURN u
JOIN 사용()-[]->()로 관계 탐색
테이블 기반노드와 관계 기반

🔵➼🔴 2. Neo4j란?

Neo4j는 **그래프 데이터베이스(Graph Database)**로, 관계형 데이터베이스(RDBMS)와는 다른 구조로 데이터를 저장하고 조회합니다. 핵심 개념만 먼저 간단히 설명하면 다음과 같습니다:


🔑 Neo4j의 기본 컨셉

구성요소설명예시
노드(Node)데이터의 주체 (객체)사람, 제품, 회사 등
관계(Relationship)노드 간의 연결 및 방향성 있는 관계친구이다(FRIEND), 일한다(WORKS_AT)
속성(Properties)노드나 관계에 부여된 키-값 쌍의 정보이름: "Alice", 나이: 30
레이블(Label)노드의 유형을 분류하는 태그:Person, :Company

📌 예시 모델

(:Person {name: "Alice"}) -[:FRIEND]-> (:Person {name: "Bob"})
(:Person {name: "Alice"}) -[:WORKS_AT]-> (:Company {name: "Neo4j"})

이 구조는 다음과 같은 의미를 가집니다:

  • "Alice"라는 사람이 "Bob"과 친구이다.
  • "Alice"는 "Neo4j"라는 회사에 다닌다.

🧠 주요 특징

특징설명
직접 연결된 관계 탐색이 빠름조인(Join) 없이 관계를 따라가므로 빠름
스키마 유연함RDB처럼 테이블 구조 강제 없음
Cypher 언어 사용그래프 질의 언어 (SQL 유사)

🔍 간단한 Cypher 예제

// 노드 생성
CREATE (:Person {name: "Alice", age: 30})
CREATE (:Person {name: "Bob", age: 25})

// 관계 생성
MATCH (a:Person {name: "Alice"}), (b:Person {name: "Bob"})
CREATE (a)-[:FRIEND]->(b)

// 관계 조회
MATCH (a:Person)-[:FRIEND]->(b:Person)
RETURN a.name, b.name


💡 이해 포인트

  • 관계형 DB가 "행-열 테이블"이라면, 그래프 DB는 "점과 선" 기반.
  • JOIN 대신 "노드 → 관계 → 노드"로 관계를 빠르게 추적.
  • 소셜 네트워크, 추천 시스템, 조직도, 경로 탐색 등에 적합.

3. 실습! : 리팩토링

🔧 "리팩토링"이란?

**리팩토링(Refactoring)**은 **코드나 쿼리의 "기능은 그대로 유지하면서 구조나 표현을 더 깔끔하고 효율적으로 바꾸는 것"**임.

  • 결과(동작)는 같음 ✅
  • 코드(혹은 쿼리)는 더 읽기 좋고, 재사용 가능하고, 성능도 좋게 개선됨 💡

🧭 과제 방향성: Neo4j & CQL로 리팩토링

🎯 관계형 모델(SQL 기반)을 Neo4j 그래프 모델(Cypher 기반)로 리팩토링하라


🔗 SQLite 예제 요약 (링크에 있는 DB 구조)

Download SQLite sample database

  • Tables (관계형 DB):
    chinook.db에 있는 주요 테이블들:
테이블 이름설명 (추정)
albums앨범 정보
artists아티스트 정보
customers고객
employees직원
genres장르
invoices인보이스 (청구서)
invoice_items청구 내역 항목
media_types미디어 타입
playlists재생 목록
playlist_track재생 목록과 트랙 간 관계
tracks트랙 (노래 등)
sqlite_sequence / sqlite_stat1SQLite 내부 메타 정보 (사용 안 함)

🔁 리팩토링 목표 요약 (SQL → Cypher)

  1. Node로 바꿀 테이블:

    • Artist, Album, Track, Genre, Customer, Invoice, Playlist
  2. Relationship으로 바꿀 외래키 연결:

    • (:Artist)-[:CREATED]->(:Album)
    • (:Album)-[:CONTAINS]->(:Track)
    • (:Track)-[:HAS_GENRE]->(:Genre)
    • (:Customer)-[:MADE]->(:Invoice)
    • (:Invoice)-[:INCLUDES]->(:Track) (invoice_items 통해 연결)
    • (:Playlist)-[:HAS]->(:Track)

🛠 다음 단계

  1. 각 테이블 샘플 데이터를 확인해서 구조를 파악
  2. 이를 기반으로 *Cypher로 변환

🎵 테이블 간 관계 예시 (리팩토링 모델)

  • artists(ArtistId)albums(ArtistId)
  • albums(AlbumId)tracks(AlbumId)

✅ Cypher로 변환 예시

1. Artist 노드 만들기

CREATE (:Artist {id: 1, name: "AC/DC"});

2. Album 노드 및 관계

CREATE (:Album {id: 1, title: "For Those About To Rock We Salute You"});
MATCH (a:Artist {id: 1}), (b:Album {id: 1})
CREATE (a)-[:CREATED]->(b);

3. Track 노드 및 관계

CREATE (:Track {
  id: 1,
  name: "For Those About To Rock (We Salute You)",
  composer: "Angus Young, Malcolm Young, Brian Johnson",
  milliseconds: 343719,
  bytes: 11170334,
  price: 0.99
});
MATCH (al:Album {id: 1}), (t:Track {id: 1})
CREATE (al)-[:CONTAINS]->(t);

profile
개발자

0개의 댓글