관계형 데이터베이스가 테이블로 데이터를 저장하는 반면, Neo4j 같은 그래프 데이터베이스는 노드(node), 엣지(edge), 속성(property)으로 구성된 그래프 구조로 데이터를 표현하고 저장한다. 이 차이는 단순한 자료구조 차원의 선택이 아니라, 상호 연결된 데이터를 다룰 때의 성능과 표현력 모두에 본질적 영향을 미치는 설계 결정이다. 이 챕터의 thesis는 다음과 같다. 그래프 데이터베이스의 가치는 저장·질의·임포트의 세 층위에서 모두 드러나며, 임포트 방법의 선택은 데이터 규모와 운영 권한에 따른 트레이드오프 위에서 이뤄진다.
Neo4j는 Java로 구현된 오픈소스 그래프 데이터베이스이며, 네 가지 아키텍처 특성이 성능·확장성·신뢰성의 기반이 된다.
노드와 관계가 디스크 상에서 물리적으로 인접하게 저장된다. 인접 저장(near-storage)이 가능하면 retrieval 시 디스크 I/O가 최소화되어 조회 속도가 빨라진다.
이것이 Neo4j 성능의 핵심이다. 노드가 연결된 다른 노드를 물리적 포인터로 직접 가리킨다. 인덱스 lookup이나 대규모 테이블 스캔이 불필요하므로 multi-hop 질의가 관계형 DB의 JOIN보다 압도적으로 빠르다.

같은 데이터에 대한 3-hop 질의에서도 Neo4j는 인덱스 경로를 거치지 않는다. 데이터가 커질수록 두 모델의 격차는 더 벌어진다.
대규모 데이터셋과 노드 간 복잡한 관계를 모두 처리 가능한 확장성을 갖춘다.
Neo4j는 트랜잭션의 ACID 속성을 모두 보장한다.
| 속성 | 의미 |
|---|---|
| Atomicity | 트랜잭션은 불가분 단일 단위로 처리되어, 한 단계라도 실패하면 어떤 변경도 커밋되지 않는다. 부분 갱신과 데이터 손상을 방지한다 |
| Consistency | 한 상태에서 다른 상태로 전이될 때 일관성이 유지된다 |
| Isolation | 동시 트랜잭션이 마치 순차 처리된 것처럼 보이게 한다. 한 트랜잭션이 다른 트랜잭션의 데이터를 침범하지 않는다 |
| Durability | 커밋된 트랜잭션은 서버 장애나 정전이 발생해도 보존된다 |
Neo4j는 다수의 그래프 알고리즘을 기본 제공한다. 데이터를 별도 분석 환경(Python·SAS 등)으로 옮기지 않고 데이터베이스 내에서 직접 알고리즘을 실행할 수 있다. 운영 측면에서 세 가지 이득이 발생한다.
관계형 DB의 엄격한 스키마와 달리, Neo4j는 데이터 모델이 시간에 따라 변형·확장될 수 있다. 광범위한 사전 설계와 재설계 없이 복잡한 데이터 모델을 점진적으로 구축할 수 있어 개발 사이클이 단축된다.
Cypher는 multi-hop 패턴 매칭을 2~3줄의 코드로 표현 가능하다. 같은 작업을 관계형 DB로 작성하면 다중 서브쿼리와 테이블 JOIN이 얽힌 수십 줄의 SQL이 되며, 실행 속도도 Cypher보다 느리다.
이후 임포트 논의의 토대가 되는 핵심 용어를 정리한다.
| 용어 | 정의 |
|---|---|
| Node | 그래프의 "점". 관계형 DB의 행(row)에 대응 |
| Label | 노드의 카테고리 (예: Movie, Actor). 관계형 DB의 컬럼과 유사한 분류 단위 |
| Relationship | 노드 간 방향성 있는 연결. 항상 시작 노드와 끝 노드를 가짐 |
| Property | 노드에 저장된 추가 데이터 요소 |
| Relationship Property | 관계 자체에 저장된 데이터 요소 |
| Graph Traversal | 관계를 따라 노드 간을 이동하는 과정. 그래프 DB 질의의 근본 연산 |
| Hop | 한 노드에서 관계를 거쳐 다른 노드로의 한 번의 전이 |
| Degrees of Separation | hop 수와 동의어로, 두 노드 사이의 최소 연결 수 |
Relationship이 항상 방향을 가진다는 점은 schema 설계에서 자주 간과된다. 양방향 의미를 가지는 관계라도 저장 시점에는 한 방향을 선택해야 하며, 질의에서는 방향 무관 패턴(-[r]-)으로 우회할 수 있다.
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는 패턴 자체가 그래프 구조를 시각적으로 닮아 있어 가독성도 우수하다.
분석 파이프라인에서 데이터 임포트는 가장 앞단의 토대다. 데이터 소스를 분석 가능한 단일 플랫폼으로 통합하는 단계이며, 이 단계의 품질이 후속 데이터 핸들링·변환·패턴 탐지의 결과를 결정한다. 임포트가 부실하면 이후 모든 단계에서 손실이 누적된다.
Extract-Transform-Load는 다양한 소스에서 데이터를 추출하고, 구조화된 형식으로 변환한 뒤, 대상 데이터 저장소에 적재하는 일반 프로세스다. Neo4j 임포트의 입력 형식으로는 CSV가 표준이다.
CSV가 권장되는 이유는 세 가지다.
베스트 프랙티스는 각 노드 종류와 각 관계 종류를 별도 CSV 파일로 분리하는 것이다. 다만 강제는 아니며, 통합 CSV로 임포트한 뒤 Cypher로 그래프 스키마를 변형하는 방식도 가능하다.

CREATE 절을 직접 작성해 노드와 관계를 삽입하는 가장 단순한 방식이다. 직관적이고 빠르게 작성 가능하지만, 대용량 파일에는 적합하지 않다. 학습·테스트·소규모 시연 용도다.
Aura Data Importer는 Neo4j Aura 환경에서 가장 편리하고 학습 곡선이 낮은 임포트 방법이다. GUI 기반으로 CSV 컬럼을 노드 속성·관계에 매핑한다. 무료 버전은 노드 200,000개·관계 400,000개로 제한된다.
관계 매핑 시 등장하는 'From'·'To' 개념은 'Source'·'Target'과 동일하다. Source(=From)는 관계의 시작점, Target(=To)은 끝점이다. 임포터마다 라벨 표기는 다르지만 의미는 동일하다.
Admin Import는 트랜잭션 레이어를 우회하는 고성능 임포트 도구다. 트랜잭션 로깅 오버헤드가 제거되어 Neo4j에 데이터를 적재하는 가장 빠른 방법이 된다. 책의 실증 사례에 따르면, Spark로 10억 노드·관계급 데이터베이스를 적재할 때 약 48시간이 소요되던 작업이 Admin Import로는 1시간 미만으로 단축된다.
대신 세 가지 제약이 있다.
neo4j-admin 스크립트를 실행하려면 administrative privilege가 있어야 한다전형적 6단계 실행 순서는 다음과 같다.
neo4j-admin 스크립트 실행CREATE DATABASE <databaseName> 실행가장 흔히 쓰이는 방식이다. Cypher의 LOAD CSV 명령으로 CSV를 직접 읽어 들이거나, Python의 Pandas DataFrame을 통해 임포트한다.
LOAD CSV의 핵심 원칙은 배치 임포트다. CSV를 작은 청크로 분할해 메모리 제약을 회피한다. 단일 트랜잭션으로 수백만 행을 시도하면 메모리 부족으로 실패하기 쉽다.
Pandas 임포트는 유연성과 속도의 트레이드오프가 가장 분명하다. DataFrame을 거쳐 Neo4j로 적재하면 사전 데이터 변환·정제를 자유롭게 수행할 수 있으나, 모든 트랜잭션이 트랜잭션 로그에 기록되므로 Admin Import 대비 10배 이상 느리다. 다만 관리자 권한이 필요 없고, ad-hoc 분석이나 소규모 데이터셋에는 추가 협조 없이 즉시 사용 가능하다.
세션 관리 측면에서, Neo4j Python 드라이버를 사용할 때는 작업 종료 후 반드시 세션을 닫아야 한다. 세션 누수는 커넥션 풀 고갈로 이어진다.
CSV 임포트 시 자주 사용되는 세 절을 정리한다.
| 절 | 역할 |
|---|---|
UNWIND | 리스트의 각 요소를 별도 행으로 펼친다. dictionary 리스트를 받아 각 row를 순회 |
MERGE | 라벨을 가진 노드의 존재를 보장. 없으면 생성, 있으면 기존 노드와 매칭 |
ON CREATE SET | 노드가 새로 생성된 경우에만 추가 속성을 설정 |
MERGE와 ON CREATE SET의 조합은 멱등성(idempotency)을 보장하는 임포트 패턴이다. 같은 CSV를 두 번 실행해도 중복 노드가 생기지 않으며, 신규 노드에만 초기 속성이 부여된다.
| 방법 | 속도 | 유연성 | 관리자 권한 | 적합한 사용 사례 |
|---|---|---|---|---|
| Cypher CREATE | 보통 | 낮음 | 불필요 | 소규모, 학습·테스트 |
| Aura Data Importer | 보통 | 보통 | 불필요 | GUI 선호, Aura 환경, 200K 노드 미만 |
| Admin Import | 최고 (10배+) | 낮음 | 필요 | 대규모 신규 적재 (10억+ 노드) |
| CSV + Python (LOAD CSV) | 보통 | 높음 | 불필요 | 일반적 사용, 배치 처리 |
| Pandas | 느림 | 최고 | 불필요 | ad-hoc 분석, 소규모, 사전 변환 필요 |
이 표의 핵심 패턴은 속도와 유연성이 반비례한다는 것이다. Admin Import는 빠른 만큼 갱신 불가·관리자 권한 필요라는 제약이 따르고, Pandas는 자유로운 만큼 트랜잭션 로깅 비용을 그대로 떠안는다. 중간 지점이 필요하면 LOAD CSV + 배치 처리가 균형점이 된다.
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의 유연성은 양 끝점일 뿐 단일 정답은 존재하지 않는다.