GraphDB와 Neo4j 정리

수정 Soojung·2025년 12월 22일

GraphDB

목록 보기
1/1

Graph DB란?

그래프 데이터베이스(GraphDB)는 데이터 자체보다 데이터 간의 관계를 주요 연산 단위로 다루는 데이터베이스이다.

최근 여러 서비스들에서는 다음과 같은 요구사항이 빈번하다.

  • 다수의 엔티티 간 연결 관계 탐색
  • n-hop 관계(친구의 친구, 연관 엔티티 등)
  • 관계를 기준으로 한 추천, 필터링, 추론

이러한 요구사항을 JOIN 중심의 RDBMS 로 처리할 경우,

  • JOIN depth 증가에 따른 쿼리 복잡도 증가
  • 실행 계획 최적화 한계
  • 스키마 변경 비용 증가

등과 같이 성능/확장성 측면에서 한계가 있다

GraphDB는 이를 해결하기 위해,

  • 관계를 계산(JOIN) 하지 않고 저장
  • 관계 탐색을 순회(traversal) 로 수행
  • 탐색 깊이가 늘어나도 쿼리 구조는 동일

한 방식으로 설계되었다.

즉, 관계 탐색이 주요 요구사항인 경우 GraphDB가 적합하다.

그래프 데이터 모델 구성

그래프 데이터는 다음 요소로 구성된다.

1) 노드(Node)

  • 엔티티(Entity)를 표현
  • 사람, 장소, 상품, 문서 등
  • 속성(Property)을 key-value 형태로 가짐

2) 레이블(Label)

  • 노드의 유형(Type)
  • 하나의 노드는 여러 레이블을 가질 수 있음
  • ex) :User , :Location , :Residence , :Business

동일한 노드에 여러 레이블을 부여할 수 있어 다형적 모델링(유연한 타입 확장)이 가능하다.

3) 관계(Relationship)

  • 두 노드 사이의 연결
  • 일반적으로 동사/행동을 표현
  • 항상 방향(Direction) 을 가짐 (단, 쿼리 시에는 방향을 무시하고 탐색 가능)
  • ex)
    • (User)-[:MARRIED]->(User)
    • (User)-[:OWNS]->(Location)
    • (User)-[:LIVES_AT]->(Location)
  • 어떤 도메인에서는 관계의 방향이 의미적으로 매우 중요
    • ex) SNS에서 누가 누구를 팔로우했는가

RDBMS vs GraphDB

모델링 관점

  • 개념 대응

    RDBMSGraphDB
    테이블(Table)레이블(Label)
    행(Row)노드(Node)
    열(Column)속성(Property)
    JOIN순회(Traversal)
  • 구조적 차이

    관계형 DB그래프 DB
    모든 행은 동일한 스키마를 가짐같은 레이블이라도 속성 집합이 달라도 됨
    JOIN은 쿼리 시점에 계산관계는 저장 시점에 디스크에 기록
    JOIN 수 증가 → 성능 급락관계 깊이와 성능이 거의 무관
    정형 데이터에 강함관계 중심 데이터에 최적

데이터 탐색 방법

  • RDBMS

    • 관계를 JOIN으로 계산
    • JOIN depth ↑ → 비용 기하급수적 증가
  • GraphDB

    • 관계를 포인터로 직접 연결
    • 탐색 비용이 O(관계 수) 에 가까움

스키마와 모델링

RDBMSGraphDB
스키마 선설계스키마가 애플리케이션과 함께 진화
클래스/테이블 중심실제 데이터 항목 중심
변경 비용 큼변경 비용 낮음

Neo4j

Neo4j는 대표적인 Graph DBMS 이다.

개요

  • GDBMS(Graph Database Management System)의 한 종류
  • 노드(Node)와 관계(Relationship)를 중심으로 데이터를 저장
  • 각 노드는 속성 (Properties)을 가질 수 있음
  • 관계 탐색이 많은 도메인에 최적화

활용 사례

  • SNS, 추천 시스템, 권한/조직도, Knowledge Graph, 네트워크 분석

주요 특징

  • 네이티브 그래프 스토리지
  • ACID 트랜잭션 지원
  • Cypher 그래프 쿼리 언어
  • Java 기반 (JVM)
  • 다양한 언어 클라이언트 (Java, Python, Go 등)
  • Community(OSS) / Enterprise(상용) 제공

등장 배경

  • 기존 RDB로는 해결하기 어려운 복잡한 관계 데이터의 증가
  • JOIN 기반 모델의 성능 한계
  • 그래프 중심 데이터 처리를 위해 전용 그래프 DB로 발전
    • 관계를 부가 정보가 아닌 핵심 데이터로 취급하기 위해 탄생

Jdk dependency

  • Neo4j 3.X : jdk 8
  • Neo4j 4.X : jdk 11 (runtime, memory, module 구조 전환)
  • Neo4j 5.x : jdk 17 (JVM 최적화, 내부 API 정리, 스토리지/트랜잭션 성능 개선)

Neo4j Graph Platform Architecture

Neo4j는 단일 DB가 아니라 그래프 중심 플랫폼 형태로 제공된다.

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

Cypher Query Language

Cypher란?

  • Neo4j 전용 선언적 그래프 쿼리 언어
  • SQL보다 그래프 구조 표현에 직관적
  • 어떻게가 아니라 무엇을 찾을지 기술

기본 문법 구성

구문설명
MATCH그래프에서 일치시킬 패턴을 지정함. 그래프 데이터 조회에 가장 일반적으로 사용되는 구문
WHERE독립적인 구문이 아니라 MATCH, OPTIONAL MATCH, WITH와 함께 사용됨. 패턴에 조건을 추가하거나 WITH를 통해 전달되는 중간 결과를 필터링함
RETURN조회 결과를 반환함
CREATE / DELETE노드와 관계를 생성하거나 삭제함
SET / REMOVESET은 속성 값을 설정하거나 노드에 레이블을 추가하는 데 사용되며, REMOVE는 속성이나 레이블을 제거하는 데 사용됨
MERGE기존 노드나 패턴이 있으면 이를 사용하고, 없으면 새로 생성함. 고유 제약 조건과 함께 사용할 때 특히 유용함

예시

ex) “Alice가 알고 있는 사람”을 관계 자체로 표현

MATCH (u:User)-[:KNOWS]->(f:User)
WHERE u.name = "Alice"
RETURN f

Neo4j 찍먹하기

목적 : 그래프 DB에서 관계 탐색이 어떻게 모델링/쿼리로 이어지는지를 직접 확인해보겠다.

1) Neo4j Desktop 설치

  • Neo4j 홈페이지(https://neo4j.com/download/) 접속
  • Neo4j Desktop 선택 후 OS에 맞게 설치
  • 다운로드 완료 후 라이선스 동의

2) 로컬 인스턴스 생성

  • Data services > Local instances > Create instance
  • DB 이름과 비밀번호 설정 후 생성
  • 생성된 모습 (여기서 생성된 인스턴스는 단일 노드 Neo4j 서버, 로컬 파일 시스템 기반 스토리지)

3) Neo4j Browser 열기

  • Open을 선택하여 Browser 활성화
  • Browser는 Cypher 쿼리를 실행하는 기본 콘솔 UI이다.

4) 데이터 모델

이번 실습에서는 SNS 형태의 간단한 그래프를 사용한다.

  • 노드 → User , Post
  • 관계
    (:User)-[:FOLLOWS]->(:User)  // 방향성이 중요한 관계 (팔로우)
    (:User)-[:LIKES]->(:Post)    // 사용자 - 콘텐츠 간 관계

5) 데이터 생성

  • 사용자 노드 생성
    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);

6) 전체 그래프 구조 확인

MATCH (n)-[r]->(m)
RETURN n, r, m;

7) 관계 탐색 쿼리

  1. 내가 팔로우한 사람

    MATCH (me:User {name:"Alice"})-[:FOLLOWS]->(u)
    RETURN u;
    • 가장 기본적인 관계 탐색, JOIN 없이 단일 패턴 매칭

  2. 친구의 친구 (2-hop)

    MATCH (me:User {name:"Alice"})-[:FOLLOWS]->()-[:FOLLOWS]->(fof)
    RETURN DISTINCT fof;
    • 중간 노드를 명시하지 않아도 되며, depth만 늘어났을 뿐 쿼리 구조는 동일함

  3. 같은 게시글을 좋아한 사람

    MATCH (me:User {name:"Alice"})-[:LIKES]->(p)<-[:LIKES]-(other)
    RETURN other;
    • 관계 자체를 조건으로 사용함. 추천/유사 사용자 탐색의 기본 패턴이라 할 수 있다.

  4. 방향 무시 탐색

    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

profile
기록하는 것을 좋아합니다.

0개의 댓글