跳到主要内容

Neo4j

Neo4j 是开源原生图数据库:数据以**节点(Node)和关系(Relationship)**存储,关系是一等公民,多跳遍历、路径查询比关系型数据库 JOIN 更自然。通用数据库选型见 数据库;与 [GraphRAG 概览与查询](/docs/ai/RAG/GraphRAG 概览与查询) 的异同见 下文对比专节。

Neo4j 解决什么​

痛点Neo4j 怎么帮
多跳关系查询(好友的好友、供应链上下游)沿边遍历,不必反复 JOIN
路径、环、子图分析内置图算法与 Cypher 路径模式
关系频繁变化、结构不固定schema 灵活,加边比改表结构轻
知识图谱、推荐、风控图特征图模型与业务直觉一致

不适合:纯 KV 缓存、大宽表聚合报表、简单 CRUD 且无关系遍历——这类场景用 Redis、PostgreSQL 更合适。

核心概念​

(:Person {name: 'Alice'})-[:KNOWS {since: 2020}]->(:Person {name: 'Bob'})
(:Person)-[:WORKS_AT]->(:Company {name: 'Acme'})
概念说明
Node(节点)实体,带标签(Label)和属性
Relationship(关系)有向边,带类型和属性;必须连接两个节点
Label节点分类,如 Person、Company
Property节点/边上的键值属性
Path节点与关系组成的遍历路径

与关系库对照:表 ≈ 标签 + 关系类型;外键 ≈ 关系边;但图库把「边」存成物理结构,遍历成本随跳数增长相对可控。

Cypher 入门​

Cypher 是 Neo4j 的声明式查询语言,模式用 ASCII 图画出来:

// 创建
CREATE (a:Person {name: 'Alice'})
CREATE (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS {since: 2020}]->(b);

// 查询:Alice 认识的人
MATCH (a:Person {name: 'Alice'})-[:KNOWS]->(friend:Person)
RETURN friend.name;

// 两跳:朋友的朋友
MATCH (a:Person {name: 'Alice'})-[:KNOWS*2]->(fof:Person)
RETURN DISTINCT fof.name;

// 最短路径
MATCH path = shortestPath(
(a:Person {name: 'Alice'})-[:KNOWS*]-(b:Person {name: 'Carol'})
)
RETURN path;
子句作用
MATCH按模式找子图
CREATE / MERGE创建;MERGE 避免重复
SET / REMOVE改属性、删属性
DELETE删节点/边(需先删关系)
RETURN返回结果

存储与架构(直觉)​

Client → Bolt / HTTP → Neo4j DB
├─ 节点存储(id → 属性)
├─ 关系存储(起止节点指针 + 类型 + 属性)
└─ 索引 / 约束(标签+属性)
点说明
原生图存储关系存指针,遍历邻接快
ACID 事务支持企业级一致性
索引常对 Label + 属性 建索引加速入口点查找
集群企业版支持因果集群、读写分离;社区版单机为主

典型场景​

场景图怎么建查什么
社交用户节点 + FOLLOWS / KNOWS推荐、共同好友、影响力
供应链产品、供应商、仓库 + SUPPLIES / STORED_IN断供影响面、最短补货路径
风控账户、设备、IP + OWNS / LOGGED_FROM欺诈环、团伙识别
知识图谱概念、文档、实体 + RELATED_TO / MENTIONS多跳推理、子图检索
RAG 辅助文档块、实体 + MENTIONS / CO_OCCURS实体邻域检索(见下文与 GraphRAG 组合)

与关系库怎么选​

维度PostgreSQL / MySQLNeo4j
数据形态行列表点 + 边
多跳关系多次 JOIN,深度增加性能陡降沿边遍历,适合 2~6 跳
事务与生态极成熟成熟,生态小于主流 OLTP
全文 / 向量PG 有全文、pgvector需外挂或配合向量库
运维习惯团队普遍熟悉需单独学习 Cypher 与图建模

口诀:查询核心是「谁和谁什么关系、走几步能到哪」→ 优先考虑图库;核心是聚合统计、强 schema 事务 → 关系库。

GraphRAG 与 Neo4j 对比​

二者名字都带「图」,但不在同一层:GraphRAG 是 LLM 时代的文档索引与 RAG 查询方案;Neo4j 是 图数据持久化与查询引擎。可以组合,不能简单互换。

先对齐:各自是什么​

名称类型一句话
GraphRAG索引 + 查询流水线(Microsoft)用 LLM 从非结构化文本自动抽实体关系、做社区摘要,再按 Global / Local 模式喂给 LLM 作答
Neo4j图数据库把已建模好的节点与关系存进去,用 Cypher 精确查询、更新、遍历

相似之处​

维度GraphRAGNeo4j
数据模型实体节点 + 关系边节点 + 关系边
擅长的问题实体关系、多跳邻域、跨文档结构关系遍历、路径、子图、知识图谱
知识图谱场景索引产物本质是「图 + 社区摘要」业界常用的图谱存储与查询后端
与 RAG 的关系直接为 RAG 设计(检索 → 生成)不自带 RAG;常作检索层或业务库,需自己接 LLM

直觉:都在用「图」表达事物之间的连接;GraphRAG 的 entities / relationships 与 Neo4j 的 Node / Relationship 概念上很像。

关键区别​

维度GraphRAGNeo4j
层级应用层方案(建索引 + 查问答)基础设施层(数据库)
图从哪来LLM 从原始文档自动抽取人工建模、ETL、或上游 NLP/GraphRAG 导入
索引产物parquet 等文件 + 社区报告数据库内的持久图
全局归纳Global Search + 社区摘要,强项需自己聚合或配合 Graph Data Science
查询语言CLI / API,模式固定(global / local / drift)Cypher,灵活自定义
更新方式语料变 → 常重跑索引流水线(贵)增删改节点边,在线事务
成本结构索引阶段 LLM 调用多存储与查询算力;无内置 LLM 账单
精确性抽取有幻觉,需评测写入什么查什么,确定性查询
向量检索非核心(可走 DRIFT 等扩展)需配合 Milvus 等或 Neo4j 向量索引

记忆口诀:GraphRAG = 「用 LLM 把文档变成图,再让 LLM 读图回答」;Neo4j = 「图已经在了,怎么存、怎么查、怎么更新」。

架构对照​

GraphRAG 路线:
原始文档 → LLM 抽实体/关系 → 社区检测 → 社区摘要
→ 查询时选 Global/Local → 拼 context → LLM 生成答案

Neo4j 路线:
业务数据 / ETL / 抽取流水线 → MERGE 写入 Neo4j
→ Cypher 查子图 / 路径 →(可选)结果交给 LLM 生成自然语言

能否互相替代?​

说法对不对
用 GraphRAG 替代 Neo4j 做订单、社交、风控主库不对 — GraphRAG 不是 OLTP 图库
用 Neo4j 替代 GraphRAG 做「整个库五大主题」勉强 — 缺社区摘要与 Global 查询套路,要自己建流水线
GraphRAG 索引结果导入 Neo4j 做交互查询可以 — 抽取落库 + 精确 Cypher
Neo4j 存图谱 + 向量库做 RAG常见 — 实体对齐、多跳扩展、再生成

组合用法(生产常见)​

组合做法
GraphRAG → Neo4j用 GraphRAG 离线建图,把 entities/relationships 导入 Neo4j,在线用 Cypher 做局部查询与可视化
Neo4j + 向量 RAG向量库召回 chunk,Neo4j 按实体扩邻域,合并 context 后 LLM 生成
仅 Neo4j + LLM结构化图谱已存在(企业知识库、产品 BOM),Cypher 取子图 → Text2Cypher 或模板化 prompt
仅 GraphRAG无强 OLTP 需求、主要是非结构化文档的全局/关系问答,接受 parquet 索引

按场景选型​

场景更优先
长文档、研报、叙事文本的全局主题归纳GraphRAG
实体关系问答,且图来自非结构化语料GraphRAG(或自建抽取 + Neo4j)
关系数据已在业务系统里,要强一致增删改查Neo4j
多跳路径、风控环、供应链溯源Neo4j
既要全局摘要又要在线更新图谱GraphRAG 离线建图 + Neo4j 在线库(或增量 ETL)
段落级 FAQ向量 RAG 即可,二者都可不上

更完整的 RAG 选型见 RAG 与框架选型;GraphRAG 查询模式细节见 [GraphRAG 概览与查询](/docs/ai/RAG/GraphRAG 概览与查询)。

最小上手(Docker)​

docker run -d --name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/your-password \
neo4j:5

# 浏览器打开 http://localhost:7474 ,用 neo4j / your-password 登录
# 在 Browser 里执行 Cypher 即可

Python 驱动示例:

from neo4j import GraphDatabase

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

with driver.session() as session:
session.run(
"MERGE (a:Person {name: $name})",
name="Alice",
)
result = session.run(
"MATCH (a:Person {name: $name}) RETURN a.name AS name",
name="Alice",
)
print(result.single()["name"])

driver.close()

面试速记​

  1. Neo4j 是什么? 原生图数据库,节点+关系为一等公民,Cypher 查询,适合多跳关系与路径分析。
  2. 和关系库最大差别? 遍历关系是存储模型内置能力,不是反复 JOIN。
  3. GraphRAG 和 Neo4j 一样吗? 不一样;GraphRAG 是 LLM 文档索引与 RAG 方案,Neo4j 是图存储引擎。
  4. 二者相似点? 都用图表示实体与关系,都服务知识图谱、多跳推理类需求。
  5. 能组合吗? 能;GraphRAG 离线抽图导入 Neo4j,或 Neo4j 做精确子图检索再交给 LLM。
  6. 何时只用 Neo4j? 图数据已结构化、要强事务与自定义查询,不需要 GraphRAG 那套社区摘要流水线。