Neo4j 그래프 데이터베이스로 데이터 임포트하기

Tasker_Jang·2026년 5월 9일
post-thumbnail

1. 그래프 데이터베이스가 다른 이유

관계형 데이터베이스가 테이블로 데이터를 저장하는 반면, Neo4j 같은 그래프 데이터베이스는 노드(node), 엣지(edge), 속성(property)으로 구성된 그래프 구조로 데이터를 표현하고 저장한다. 이 차이는 단순한 자료구조 차원의 선택이 아니라, 상호 연결된 데이터를 다룰 때의 성능과 표현력 모두에 본질적 영향을 미치는 설계 결정이다. 이 챕터의 thesis는 다음과 같다. 그래프 데이터베이스의 가치는 저장·질의·임포트의 세 층위에서 모두 드러나며, 임포트 방법의 선택은 데이터 규모와 운영 권한에 따른 트레이드오프 위에서 이뤄진다.

Neo4j는 Java로 구현된 오픈소스 그래프 데이터베이스이며, 네 가지 아키텍처 특성이 성능·확장성·신뢰성의 기반이 된다.

2. Neo4j의 4대 아키텍처 특성

2.1 Native Graph Storage

노드와 관계가 디스크 상에서 물리적으로 인접하게 저장된다. 인접 저장(near-storage)이 가능하면 retrieval 시 디스크 I/O가 최소화되어 조회 속도가 빨라진다.

2.2 Index-Free Adjacency

이것이 Neo4j 성능의 핵심이다. 노드가 연결된 다른 노드를 물리적 포인터로 직접 가리킨다. 인덱스 lookup이나 대규모 테이블 스캔이 불필요하므로 multi-hop 질의가 관계형 DB의 JOIN보다 압도적으로 빠르다.

같은 데이터에 대한 3-hop 질의에서도 Neo4j는 인덱스 경로를 거치지 않는다. 데이터가 커질수록 두 모델의 격차는 더 벌어진다.

2.3 Scalability

대규모 데이터셋과 노드 간 복잡한 관계를 모두 처리 가능한 확장성을 갖춘다.

2.4 ACID Transactions

Neo4j는 트랜잭션의 ACID 속성을 모두 보장한다.

속성의미
Atomicity트랜잭션은 불가분 단일 단위로 처리되어, 한 단계라도 실패하면 어떤 변경도 커밋되지 않는다. 부분 갱신과 데이터 손상을 방지한다
Consistency한 상태에서 다른 상태로 전이될 때 일관성이 유지된다
Isolation동시 트랜잭션이 마치 순차 처리된 것처럼 보이게 한다. 한 트랜잭션이 다른 트랜잭션의 데이터를 침범하지 않는다
Durability커밋된 트랜잭션은 서버 장애나 정전이 발생해도 보존된다

3. Neo4j의 분석·스키마·질의 우위

3.1 In-Database Analytics

Neo4j는 다수의 그래프 알고리즘을 기본 제공한다. 데이터를 별도 분석 환경(Python·SAS 등)으로 옮기지 않고 데이터베이스 내에서 직접 알고리즘을 실행할 수 있다. 운영 측면에서 세 가지 이득이 발생한다.

  • 아키텍처 복잡성 감소
  • 데이터 중복(redundancy) 제거
  • 서버 자원·에너지 비용 절감

3.2 Flexible Schema

관계형 DB의 엄격한 스키마와 달리, Neo4j는 데이터 모델이 시간에 따라 변형·확장될 수 있다. 광범위한 사전 설계와 재설계 없이 복잡한 데이터 모델을 점진적으로 구축할 수 있어 개발 사이클이 단축된다.

3.3 Cypher의 우위

Cypher는 multi-hop 패턴 매칭을 2~3줄의 코드로 표현 가능하다. 같은 작업을 관계형 DB로 작성하면 다중 서브쿼리와 테이블 JOIN이 얽힌 수십 줄의 SQL이 되며, 실행 속도도 Cypher보다 느리다.

4. 그래프 데이터베이스의 어휘

이후 임포트 논의의 토대가 되는 핵심 용어를 정리한다.

용어정의
Node그래프의 "점". 관계형 DB의 행(row)에 대응
Label노드의 카테고리 (예: Movie, Actor). 관계형 DB의 컬럼과 유사한 분류 단위
Relationship노드 간 방향성 있는 연결. 항상 시작 노드와 끝 노드를 가짐
Property노드에 저장된 추가 데이터 요소
Relationship Property관계 자체에 저장된 데이터 요소
Graph Traversal관계를 따라 노드 간을 이동하는 과정. 그래프 DB 질의의 근본 연산
Hop한 노드에서 관계를 거쳐 다른 노드로의 한 번의 전이
Degrees of Separationhop 수와 동의어로, 두 노드 사이의 최소 연결 수

Relationship이 항상 방향을 가진다는 점은 schema 설계에서 자주 간과된다. 양방향 의미를 가지는 관계라도 저장 시점에는 한 방향을 선택해야 하며, 질의에서는 방향 무관 패턴(-[r]-)으로 우회할 수 있다.

5. Cypher의 선언적 모델

Cypher는 선언적 언어다. "무엇을 찾을지"를 기술하면 되고, "어떻게 찾을지"는 명시할 필요가 없다. 이 점이 SQL과의 가장 큰 공통점인 동시에, 그래프 패턴 매칭 문법을 통해 SQL과 구별된다.

전형적 Cypher 질의는 다음 5요소로 구성된다.

MATCH (i1:Movie)-[r:DIRECTED_BY]->(i2:Director)
WHERE i2.name = "Christopher Nolan"
RETURN i1.title, i1.year
  • MATCH: 찾을 패턴 선언
  • 노드 변수(i1, i2)와 라벨(Movie, Director)
  • 관계 변수(r)와 관계 유형(DIRECTED_BY)
  • WHERE: 조건 명시
  • RETURN: 반환 요소 지정

같은 작업을 관계형 SQL로 작성하면 영화 테이블·감독 테이블·연결 테이블에 대한 다중 JOIN이 필요하다. Cypher는 패턴 자체가 그래프 구조를 시각적으로 닮아 있어 가독성도 우수하다.

6. 데이터 임포트의 위치

분석 파이프라인에서 데이터 임포트는 가장 앞단의 토대다. 데이터 소스를 분석 가능한 단일 플랫폼으로 통합하는 단계이며, 이 단계의 품질이 후속 데이터 핸들링·변환·패턴 탐지의 결과를 결정한다. 임포트가 부실하면 이후 모든 단계에서 손실이 누적된다.

7. ETL과 CSV가 표준인 이유

Extract-Transform-Load는 다양한 소스에서 데이터를 추출하고, 구조화된 형식으로 변환한 뒤, 대상 데이터 저장소에 적재하는 일반 프로세스다. Neo4j 임포트의 입력 형식으로는 CSV가 표준이다.

CSV가 권장되는 이유는 세 가지다.

  • 콤마로 값을 구분하는 평문 텍스트로, 다양한 처리 도구와 호환된다
  • Excel 같은 스프레드시트의 행 수 제한이 없어 대규모 데이터셋을 다룰 수 있다
  • 다른 저장 형식 대비 처리 시간과 메모리 사용 측면에서 효율적이다

베스트 프랙티스는 각 노드 종류와 각 관계 종류를 별도 CSV 파일로 분리하는 것이다. 다만 강제는 아니며, 통합 CSV로 임포트한 뒤 Cypher로 그래프 스키마를 변형하는 방식도 가능하다.

8. 네 가지 임포트 방법

8.1 Cypher CREATE — 직관적이나 소규모용

CREATE 절을 직접 작성해 노드와 관계를 삽입하는 가장 단순한 방식이다. 직관적이고 빠르게 작성 가능하지만, 대용량 파일에는 적합하지 않다. 학습·테스트·소규모 시연 용도다.

8.2 Neo4j Aura Data Importer — GUI 편의성

Aura Data Importer는 Neo4j Aura 환경에서 가장 편리하고 학습 곡선이 낮은 임포트 방법이다. GUI 기반으로 CSV 컬럼을 노드 속성·관계에 매핑한다. 무료 버전은 노드 200,000개·관계 400,000개로 제한된다.

관계 매핑 시 등장하는 'From'·'To' 개념은 'Source'·'Target'과 동일하다. Source(=From)는 관계의 시작점, Target(=To)은 끝점이다. 임포터마다 라벨 표기는 다르지만 의미는 동일하다.

8.3 Admin Import — 최고 성능

Admin Import는 트랜잭션 레이어를 우회하는 고성능 임포트 도구다. 트랜잭션 로깅 오버헤드가 제거되어 Neo4j에 데이터를 적재하는 가장 빠른 방법이 된다. 책의 실증 사례에 따르면, Spark로 10억 노드·관계급 데이터베이스를 적재할 때 약 48시간이 소요되던 작업이 Admin Import로는 1시간 미만으로 단축된다.

대신 세 가지 제약이 있다.

  • 기존 데이터 갱신 불가: 신규 데이터 적재 전용. 기존 데이터의 수정·갱신은 지원하지 않는다
  • 설정 복잡도 증가: CSV 헤더 표준 준수, 파일 위치 이동, 스크립트 실행 등 다른 방법보다 절차가 많다
  • 관리자 권한 필요: 명령줄 터미널에서 neo4j-admin 스크립트를 실행하려면 administrative privilege가 있어야 한다

전형적 6단계 실행 순서는 다음과 같다.

  1. CSV 헤더를 Neo4j 표준 형식에 맞춰 변경
  2. CSV 파일을 Neo4j Import 폴더로 이동
  3. 터미널에서 neo4j-admin 스크립트 실행
  4. (선택) 새 DB 폴더 권한 업데이트
  5. Neo4j Browser에서 CREATE DATABASE <databaseName> 실행
  6. (선택) Neo4j 서비스·서버 재시작

8.4 CSV + Python (LOAD CSV / Pandas) — 유연성 우선

가장 흔히 쓰이는 방식이다. Cypher의 LOAD CSV 명령으로 CSV를 직접 읽어 들이거나, Python의 Pandas DataFrame을 통해 임포트한다.

LOAD CSV의 핵심 원칙은 배치 임포트다. CSV를 작은 청크로 분할해 메모리 제약을 회피한다. 단일 트랜잭션으로 수백만 행을 시도하면 메모리 부족으로 실패하기 쉽다.

Pandas 임포트는 유연성과 속도의 트레이드오프가 가장 분명하다. DataFrame을 거쳐 Neo4j로 적재하면 사전 데이터 변환·정제를 자유롭게 수행할 수 있으나, 모든 트랜잭션이 트랜잭션 로그에 기록되므로 Admin Import 대비 10배 이상 느리다. 다만 관리자 권한이 필요 없고, ad-hoc 분석이나 소규모 데이터셋에는 추가 협조 없이 즉시 사용 가능하다.

세션 관리 측면에서, Neo4j Python 드라이버를 사용할 때는 작업 종료 후 반드시 세션을 닫아야 한다. 세션 누수는 커넥션 풀 고갈로 이어진다.

9. Cypher 임포트의 핵심 절

CSV 임포트 시 자주 사용되는 세 절을 정리한다.

역할
UNWIND리스트의 각 요소를 별도 행으로 펼친다. dictionary 리스트를 받아 각 row를 순회
MERGE라벨을 가진 노드의 존재를 보장. 없으면 생성, 있으면 기존 노드와 매칭
ON CREATE SET노드가 새로 생성된 경우에만 추가 속성을 설정

MERGEON CREATE SET의 조합은 멱등성(idempotency)을 보장하는 임포트 패턴이다. 같은 CSV를 두 번 실행해도 중복 노드가 생기지 않으며, 신규 노드에만 초기 속성이 부여된다.

10. 네 가지 방법 비교

방법속도유연성관리자 권한적합한 사용 사례
Cypher CREATE보통낮음불필요소규모, 학습·테스트
Aura Data Importer보통보통불필요GUI 선호, Aura 환경, 200K 노드 미만
Admin Import최고 (10배+)낮음필요대규모 신규 적재 (10억+ 노드)
CSV + Python (LOAD CSV)보통높음불필요일반적 사용, 배치 처리
Pandas느림최고불필요ad-hoc 분석, 소규모, 사전 변환 필요

이 표의 핵심 패턴은 속도와 유연성이 반비례한다는 것이다. Admin Import는 빠른 만큼 갱신 불가·관리자 권한 필요라는 제약이 따르고, Pandas는 자유로운 만큼 트랜잭션 로깅 비용을 그대로 떠안는다. 중간 지점이 필요하면 LOAD CSV + 배치 처리가 균형점이 된다.

11. 정리

Neo4j의 Native Graph Storage·Index-Free Adjacency·Scalability·ACID는 그래프 데이터의 저장과 질의에서 관계형 모델 대비 본질적 차이를 만든다. Cypher는 multi-hop 패턴 매칭을 2~3줄로 표현하는 선언적 언어로 그 차이를 사용자에게 노출한다. 데이터 임포트는 이 모델로 들어가는 입구이며, Cypher CREATE·Aura Importer·Admin Import·CSV+Python의 네 방법은 속도·유연성·권한 요구의 트레이드오프 위에서 사용 사례별로 선택된다. 정적 행 단위 데이터를 상호 연결된 그래프 데이터로 변환하는 이 과정이, 이후 분석과 머신러닝 단계의 능력을 결정한다.

결론: 임포트 도구의 선택은 데이터 규모와 운영 권한 사이의 트레이드오프이며, Admin Import의 속도와 Pandas의 유연성은 양 끝점일 뿐 단일 정답은 존재하지 않는다.


참고 자료

  • Graph Data Science with Python and Neo4j
    — Chapter 3: Importing Data into the Neo4j Graph Database.
profile
ML Engineer 🧠 | AI 모델 개발과 최적화 경험을 기록하며 성장하는 개발자 🚀 The light that burns twice as bright burns half as long ✨

0개의 댓글