GraphRAG 를 위한 Neo4j 그래프 데이터베이스, 설치, Cypher, 벡터, 운영

그래프, 시퍼, 벡터 및 연산 강화

Page content

Neo4j 는 관계가 곧 데이터일 때 찾아야 할 솔루션입니다. 도메인이 원과 화살표로 가득 찬 화이트보드처럼 보인다면, 이를 테이블로 강제하는 것은 고통스럽습니다.

Neo4j 는 이러한 그림을 **속성 그래프 (property graph)**로 모델링하고 Cypher로 쿼리합니다.

Graph and data infrastructure

이 가이드에서는 Neo4j 의 용도, ACID 동작, Neo4j vs Amazon Neptune vs TigerGraph (및 유사 제품), 벡터 인덱스를 활용한 GraphRAG, 로컬 및 프로덕션 설치 경로, 포트 및 neo4j.conf 설정, 그리고 복사/붙여넣기 가능한 Cypher 와 Python 패턴에 대해 다룹니다.

더 넓은 데이터 인프라 선택의 맥락에 대해서는 AI 시스템을 위한 데이터 인프라 기둥을 참조하세요.

프로덕션 그래프 워크로드에서 Neo4j 의 활용도

Neo4j 는 프로덕션 제약 조건 하에서 반복적으로 연결된 질문을 던져야 하는 연결된 데이터를 위해 설계되었습니다. 이것이 대부분의 팀에게 Neo4j 가 무엇에 사용되는가에 대한 직접적인 답변입니다.

노드, 관계, 속성을 활용한 속성 그래프 데이터 모델

Neo4j 는 속성 그래프 모델을 사용합니다: 노드는 엔티티를 나타내고, 관계는 노드를 연결하며, 둘 다 속성을 가질 수 있습니다. 레이블과 관계 유형은 취약한 스키마에 갇히지 않으면서도 구조를 제공합니다.

얇은 모델로 시작하여 가치를 제공하고, 새로운 질문이 나타나면 그래프를 진화시킬 수 있습니다.

조인 지옥 없이 패턴 매칭을 위한 Cypher 그래프 쿼리 언어

Cypher 는 선언적이며 패턴 매칭을 중심으로 구축되었습니다. 서브그래프의 형태를 설명하고 플래너가 실행하도록 합니다.

SQL 이 집합 (sets) 에 관한 것이라면, Cypher 는 서브그래프에 관한 것입니다. 이는 멀티홉 트래버설, 경로 쿼리, 추천, 출처 추적, 그리고 “어떤 시스템이 어떤 것을 건드렸는가"와 같은 질문에서 중요합니다.

Neo4j 는 ACID 준수이며 그 이유

Neo4j 는 ACID 를 준수하는가? 그렇습니다. 관계를 생성하거나 업데이트하면 일관된 구조가 영향을 받으며, 데이터베이스는 실패 및 동시성 하에서도 이를 일관되게 유지합니다.

그렇지 않으면 강제되는 경우를 제외하고는 강력한 트랜잭션 보장 주위로 그래프 앱을 설계하세요. 이는 모호한 최종 일관성을 가정하는 것보다 디버깅과 동작에 대한 추론을 훨씬 쉽게 만듭니다.

Neo4j vs Amazon Neptune vs TigerGraph: 시니어 엔지니어의 비교

“Neo4j vs X"라는 질문은 보통 “수년 동안 어떤 생태계에서 일할 것인가?“라는 질문입니다.

짧고 의견이 명확한 관점입니다—벤치마크 슬라이드가 아닌 엔지니어링 시간에 관한 것입니다.

제품 핵심 모델 및 쿼리 스타일 우위 분야 주의할 점
Neo4j 속성 그래프 및 Cypher 연결된 데이터에 대한 강력한 사용성, 성숙한 도구, 그래프 + 벡터 검색 그래프 모델링은 투자해야 하는 기술입니다
Amazon Neptune AWS 의 관리형 그래프 (Gremlin, openCypher, RDF 용 SPARQL) AWS 중심의 계약 및 운영 쿼리 언어의 혼합이 플랫폼 주도적으로 느껴질 수 있습니다
TigerGraph GSQL 및 OpenCypher 관련 패턴 분석 스타일 워크로드 및 컴파일된 쿼리 접근 방식 다른 정신 모델; 모든 곳에서 Cypher 로 대체할 수 없습니다
JanusGraph 외부 스토리지 백엔드를 가진 분산 그래프 플러그 가능한 백엔드가 있는 오픈 소스 백엔드 스택을 직접 운영해야 합니다
ArangoDB 멀티 모델 (문서, KV, 그래프) 혼합 형태를 위한 하나의 데이터베이스 그래프 우선 엔진 대비 그래프 깊이가 다릅니다
Memgraph 속성 그래프, Cypher 호환 스트리밍 및 신선한 데이터 워크플로우 엔진 동작이 다름; 호환성이 동일함을 의미하지는 않습니다

그래프 데이터베이스를 선택하기 전에 결정해야 할 사항

먼저 쿼리 언어운영 모델을 선택하세요.

팀이 Cypher 와 그래프 우선 워크플로우를 원한다면 Neo4j 가 강력한 기본값입니다. 이미 Gremlin 전문 지식을 가지고 있다면 Neptune 이나 JanusGraph 가 적합할 수 있습니다. 하나의 멀티 모델 스토어를 원한다면 ArangoDB 가 이동 부분을 줄일 수 있습니다.

운영에 대해 솔직해야 합니다. “분산 스토리지 백엔드를 실행할 것입니다"라는 말은 03:00 시 컴팩션이나 JVM 압력 문제로 페이지가 날아오를 때까지 쉽습니다.

RAG 와 GraphRAG 를 위한 Neo4j: 벡터 검색 및 그래프 컨텍스트

많은 RAG 스택은 벡터 검색 및 프롬프트로 시작합니다. 이는 출처 추적, 엔티티 해결, 멀티홉 컨텍스트, 또는 의미 해석이 필요해질 때까지 작동합니다. 그 후에는 애플리케이션 코드 내에서 지식 그래프를 다시 구축할 위험에 처하게 됩니다.

GraphRAG 가 검색 증강 생성을 어떻게 개선하는가? 그래프를 사용하여 유사도만으로는 놓치기 쉬운 구조화된 컨텍스트 (엔티티, 관계, 이웃) 를 가져오며, 이는 **근거 (grounding)**와 신뢰성을 높이는 데 도움이 됩니다.

임베딩 유사성 검색을 위한 Neo4j 벡터 인덱스

Neo4j 가 RAG 를 위한 벡터 검색을 할 수 있는가? 그렇습니다. Neo4j 는 임베딩에 대한 유사성 (일반적으로 HNSW 스타일의 근사 이웃 검색) 을 위한 벡터 인덱스를 지원합니다.

벡터는 “유사한 것"을 찾습니다. 그러나 도메인에서 “어떻게 관련되는지"를 자체적으로 인코딩하지는 않습니다. Neo4j 는 유사성과 트래버설을 결합할 수 있게 합니다.

벡터 제약 패턴 매칭을 위한 SEARCH 하위 절 사용

Neo4j 의 SEARCH 하위 절은 벡터 인덱스에서의 근사 이웃 검색 결과를 사용하여 Cypher MATCH 패턴을 제약합니다. 이는 하이브리드 검색을 위한 인간 공학적 다리입니다.

실용적인 패턴: 후보를 위한 벡터 검색, 이후 컨텍스트, 필터, 설명을 위한 그래프 확장.

neo4j-graphrag 를 활용한 Python 기반 GraphRAG

Neo4j 의 Python 용 neo4j-graphrag 패키지는 드라이버, 검색기, LLM 인터페이스를 GraphRAG 플로우에 연결합니다. 책임 분리를 위해 외부 벡터 스토어를 사용하더라도 여전히 사용할 수 있습니다.

로컬 및 프로덕션 환경에서 Neo4j 설치 방법

로컬에서 Neo4j 를 어떻게 설치합니까? 위험 프로파일에 맞는 옵션을 선택하세요.

로컬 개발을 위한 Docker 로 Neo4j 설치

Docker 는 재현 가능한 서버로 가는 가장 빠른 경로입니다.

# 최소 실행. 재시작 간에 데이터가 영구 저장되지 않습니다.
docker run \
  --restart always \
  --publish=7474:7474 --publish=7687:7687 \
  neo4j:5

실제 작업을 위해서는 초기 비밀번호를 설정하고 데이터 볼륨을 마운트하세요.

docker run \
  --restart always \
  --publish=7474:7474 --publish=7687:7687 \
  --env NEO4J_AUTH=neo4j/your_password \
  --volume=$HOME/neo4j/data:/data \
  neo4j:5

팀 친화적인 설정을 위한 Docker Compose

services:
  neo4j:
    image: neo4j:5
    ports:
      - "7474:7474"
      - "7687:7687"
    environment:
      - NEO4J_AUTH=neo4j/your_password
    volumes:
      - $HOME/neo4j/logs:/logs
      - $HOME/neo4j/config:/config
      - $HOME/neo4j/data:/data
      - $HOME/neo4j/plugins:/plugins
    restart: always

Neo4j Desktop

Neo4j Desktop 은 프로토타이핑과 교육에 강점이 있습니다—프로젝트, GUI, 로컬 인스턴스. CI 와 통합 테스트의 경우 Docker 가 일반적으로 우세합니다.

Linux, Windows 또는 macOS 서버

장시간 실행되는 호스트의 경우 공식 OS 설치 경로를 따르세요. 결국 서비스 관리, 로그, 메모리, 백업 및 업그레이드 등을 신경 써야 합니다.

Neo4j AuraDB (관리형)

데이터베이스를 실행하는 것보다 제품을 출시하는 것을 선호한다면, AuraDB가 관리형 Neo4j 클라우드 옵션입니다.

Helm 을 활용한 Kubernetes

플랫폼이 Kubernetes 라면 Helm 기반 배포를 사용하고 서비스를 통해 Bolt 와 HTTP 를 노출하세요. 조직이 K8s 에서 상태를 신뢰할 수 있게 실행할 수 있는 경우에만 K8s 에 데이터베이스를 배포하세요.

Neo4j 설정 필수 요소: 포트, 커넥터, neo4j.conf

설정은 neo4j.conf (key=value, # 주석) 에 있습니다. 엄격한 유효성 검사는 트래픽을 서비스하기 전에 오타를 잡는 데 도움이 됩니다.

기본 Neo4j 포트 및 커넥터

기본 Neo4j 포트는 무엇인가? 기본적으로 Bolt는 7687, HTTP는 7474, HTTPS는 7473 입니다. 프로덕션에서는 필요한 것만 노출하세요. 보통은 사설 네트워크에서 Bolt 와 제한된 HTTP UI 만 사용합니다.

경화 예시 (IP 와 TLS 를 환경에 맞게 조정):

server.bolt.listen_address=10.0.1.10:7687
server.http.listen_address=127.0.0.1:7474
server.https.enabled=true
server.https.listen_address=10.0.1.10:7473

무제한 손상을 제한하는 트랜잭션 설정

리뷰에서 유용한 레버는 방황하는 쿼리를 위한 db.transaction.timeout 와 천둥 떼 현상을 피하기 위한 db.transaction.concurrent.maximum 입니다.

db.transaction.timeout=10s
db.transaction.concurrent.maximum=1000

RAG 를 위한 실용적인 Cypher 및 벡터 인덱스 예시

벡터 인덱스 생성 및 임베딩 저장

CREATE VECTOR INDEX doc_embeddings
FOR (d:Document) ON (d.embedding)
OPTIONS {indexConfig: {
  `vector.dimensions`: 1536,
  `vector.similarity_function`: "cosine"
}};

벡터 검색 후 그래프 확장

  1. 후보 노드를 위한 벡터 검색.
  2. 이웃, 출처, 제약을 위한 트래버설.
  3. 명확한 경계로 LLM 에 대한 컨텍스트 포맷팅.

MATCH 내부에서 SEARCH 를 사용하는 예시 (구문은 Neo4j 버전에 따라 약간 다를 수 있으므로 서버 버전에 대한 매뉴얼 확인):

MATCH (d:Document)
  SEARCH d IN (
    VECTOR INDEX doc_embeddings
    FOR $queryEmbedding
    LIMIT 10
  ) SCORE AS score
MATCH (d)-[:MENTIONS]->(e:Entity)
RETURN d.id AS doc_id, score, collect(distinct e.name) AS entities
ORDER BY score DESC
LIMIT 5;

Python 기반 최소 GraphRAG

from neo4j import GraphDatabase
from neo4j_graphrag.retrievers import VectorRetriever
from neo4j_graphrag.embeddings import OpenAIEmbeddings
from neo4j_graphrag.llm import OpenAILLM
from neo4j_graphrag.generation import GraphRAG

driver = GraphDatabase.driver("neo4j://localhost:7687", auth=("neo4j", "password"))

embedder = OpenAIEmbeddings(model="text-embedding-3-large")
retriever = VectorRetriever(driver, "doc_embeddings", embedder)

llm = OpenAILLM(model_name="gpt-4o", model_params={"temperature": 0})

rag = GraphRAG(retriever=retriever, llm=llm)

response = rag.search(query_text="How do I do similarity search in Neo4j?", retriever_config={"top_k": 5})
print(response.answer)

실전 Neo4j 활용 사례: 사기 탐지, 추천, 지식 그래프

사기 탐지 및 리스크 그래프

사기는 거의 한 행이 아닙니다. 이는 계좌, 기기, IP, 판매자, 신원, 시간 등을 아우르는 패턴입니다. 그래프는 10 개 조인 미로 없이 이웃과 멀티홉 경로를 표현합니다.

행동 및 명시적 관계를 활용한 추천

프로덕션 추천은 점수화된 후보재고, 제약, 계층 구조, 그리고 설명 가능성을 결합합니다. 그래프는 사람들이 추론할 수 있는 경로를 반환하는 데 도움이 됩니다.

RAG 와 에이전트를 위한 지식 그래프

RAG 는 근거가 필요하고, 에이전트는 메모리, 출처, 제약이 필요합니다. 지식 그래프는 하나의 모델에 엔티티, 관계, 출처, 임베딩을 저장하므로 GraphRAG 에 자연스러운 적합성입니다.

Amazon Neptune 또는 TigerGraph 대신 Neo4j 를 언제 선택해야 하는가?

Amazon Neptune 또는 TigerGraph 대신 언제 Neo4j 를 선택해야 하는가? Cypher 우선 그래프와 하나의 제품 내 벡터 + 트래버설을 원할 때 Neo4j 를 선택하세요. AWSGremlin 또는 RDF가 조직과 맞을 때 Neptune 을 선택하세요. GSQL분석 스타일 워크로드가 주된 베팅일 때 TigerGraph 를 선택하세요.

유용한 링크