
그래프 데이터베이스(GraphDB)는 데이터 자체보다 데이터 간의 관계를 주요 연산 단위로 다루는 데이터베이스이다.
최근 여러 서비스들에서는 다음과 같은 요구사항이 빈번하다.
이러한 요구사항을 JOIN 중심의 RDBMS 로 처리할 경우,
등과 같이 성능/확장성 측면에서 한계가 있다
GraphDB는 이를 해결하기 위해,
한 방식으로 설계되었다.
즉, 관계 탐색이 주요 요구사항인 경우 GraphDB가 적합하다.
그래프 데이터는 다음 요소로 구성된다.
:User , :Location , :Residence , :Business동일한 노드에 여러 레이블을 부여할 수 있어 다형적 모델링(유연한 타입 확장)이 가능하다.
(User)-[:MARRIED]->(User)(User)-[:OWNS]->(Location)(User)-[:LIVES_AT]->(Location) 
개념 대응
| RDBMS | GraphDB |
|---|---|
| 테이블(Table) | 레이블(Label) |
| 행(Row) | 노드(Node) |
| 열(Column) | 속성(Property) |
| JOIN | 순회(Traversal) |
구조적 차이
| 관계형 DB | 그래프 DB |
|---|---|
| 모든 행은 동일한 스키마를 가짐 | 같은 레이블이라도 속성 집합이 달라도 됨 |
| JOIN은 쿼리 시점에 계산 | 관계는 저장 시점에 디스크에 기록 |
| JOIN 수 증가 → 성능 급락 | 관계 깊이와 성능이 거의 무관 |
| 정형 데이터에 강함 | 관계 중심 데이터에 최적 |

RDBMS
JOIN으로 계산GraphDB
포인터로 직접 연결| RDBMS | GraphDB |
|---|---|
| 스키마 선설계 | 스키마가 애플리케이션과 함께 진화 |
| 클래스/테이블 중심 | 실제 데이터 항목 중심 |
| 변경 비용 큼 | 변경 비용 낮음 |

Neo4j는 대표적인 Graph DBMS 이다.
Neo4j는 단일 DB가 아니라 그래프 중심 플랫폼 형태로 제공된다.

| 영역 | 구성 요소 | 역할 |
|---|---|---|
| Core Graph DB | Neo4j Graph Database | 연결된 데이터를 노드와 관계로 저장하고, Cypher 기반으로 탐색 및 트랜잭션 처리 (Community / Enterprise) |
| Developer & Admin | Neo4j Desktop | 로컬 Neo4j 인스턴스 관리 및 개발 및 테스트 환경 제공 (Enterprise 라이선스 포함) |
| Query & Basic Visualization | Neo4j Browser | Cypher 쿼리 실행과 기본적인 그래프 시각화를 제공하는 웹 인터페이스 |
| Business Visualization | Neo4j Bloom | 코드 없이 그래프를 탐색하고 분석할 수 있는 비즈니스 사용자용 시각화 도구 |
| Graph Analytics | Graph Data Science (GDS) | PageRank, Community Detection 등 그래프 알고리즘을 실행하기 위한 공식 분석 라이브러리 |
| Cloud Service | Neo4j AuraDB | 설치/운영 없이 사용할 수 있는 관리형 클라우드 그래프 데이터베이스 |
| Integration Layer | Drivers & APIs / Data Integration | 다양한 언어 드라이버와 ETL 파이프라인을 통해 외부 시스템과 그래프를 연결 |

| 구문 | 설명 |
|---|---|
| MATCH | 그래프에서 일치시킬 패턴을 지정함. 그래프 데이터 조회에 가장 일반적으로 사용되는 구문 |
| WHERE | 독립적인 구문이 아니라 MATCH, OPTIONAL MATCH, WITH와 함께 사용됨. 패턴에 조건을 추가하거나 WITH를 통해 전달되는 중간 결과를 필터링함 |
| RETURN | 조회 결과를 반환함 |
| CREATE / DELETE | 노드와 관계를 생성하거나 삭제함 |
| SET / REMOVE | SET은 속성 값을 설정하거나 노드에 레이블을 추가하는 데 사용되며, REMOVE는 속성이나 레이블을 제거하는 데 사용됨 |
| MERGE | 기존 노드나 패턴이 있으면 이를 사용하고, 없으면 새로 생성함. 고유 제약 조건과 함께 사용할 때 특히 유용함 |
ex) “Alice가 알고 있는 사람”을 관계 자체로 표현
MATCH (u:User)-[:KNOWS]->(f:User)
WHERE u.name = "Alice"
RETURN f
목적 : 그래프 DB에서 관계 탐색이 어떻게 모델링/쿼리로 이어지는지를 직접 확인해보겠다.






이번 실습에서는 SNS 형태의 간단한 그래프를 사용한다.
User , Post(:User)-[:FOLLOWS]->(:User) // 방향성이 중요한 관계 (팔로우)
(:User)-[:LIKES]->(:Post) // 사용자 - 콘텐츠 간 관계CREATE
(:User {name:"Alice"}),
(:User {name:"Bob"}),
(:User {name:"Charlie"}),
(:User {name:"David"});CREATE
(:Post {id:1, title:"Graph DB is fun"}),
(:Post {id:2, title:"Neo4j is cool"});MATCH
(a:User {name:"Alice"}),
(b:User {name:"Bob"}),
(c:User {name:"Charlie"}),
(d:User {name:"David"}),
(p1:Post {id:1}),
(p2:Post {id:2})
CREATE
(a)-[:FOLLOWS]->(b),
(b)-[:FOLLOWS]->(c),
(c)-[:FOLLOWS]->(d),
(a)-[:LIKES]->(p1),
(b)-[:LIKES]->(p1),
(c)-[:LIKES]->(p2);MATCH (n)-[r]->(m)
RETURN n, r, m;

내가 팔로우한 사람
MATCH (me:User {name:"Alice"})-[:FOLLOWS]->(u)
RETURN u;

친구의 친구 (2-hop)
MATCH (me:User {name:"Alice"})-[:FOLLOWS]->()-[:FOLLOWS]->(fof)
RETURN DISTINCT fof;

같은 게시글을 좋아한 사람
MATCH (me:User {name:"Alice"})-[:LIKES]->(p)<-[:LIKES]-(other)
RETURN other;

방향 무시 탐색
MATCH (a:User {name:"Bob"})-[:FOLLOWS]-(u)
RETURN u;

Reference
https://wikidocs.net/book/3724
https://1004jonghee.tistory.com/entry/Neo4j%EB%9E%80
https://www.en-core.com/resource/event?viewMode=view&ca=+tech&sel_search=&txt_search=&page=&idx=98
https://liz09045.tistory.com/143
https://1004jonghee.tistory.com/entry/Neo4j-Desktop-%EC%84%A4%EC%B9%98