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 / MySQL | Neo4j |
|---|---|---|
| 数据形态 | 行列表 | 点 + 边 |
| 多跳关系 | 多次 JOIN,深度增加性能陡降 | 沿边遍历,适合 2~6 跳 |
| 事务与生态 | 极成熟 | 成熟,生态小于主流 OLTP |
| 全文 / 向量 | PG 有全文、pgvector | 需外挂或配合向量库 |
| 运维习惯 | 团队普遍熟悉 | 需单独学习 Cypher 与图建模 |
口诀:查询核心是「谁和谁什么关系、走几步能到哪」→ 优先考虑图库;核心是聚合统计、强 schema 事务 → 关系库。
GraphRAG 与 Neo4j 对比
二者名字都带「图」,但不在同一层:GraphRAG 是 LLM 时代的文档索引与 RAG 查询方案;Neo4j 是 图数据持久化与查询引擎。可以组合,不能简单互换。
先对齐:各自是什么
| 名称 | 类型 | 一句话 |
|---|---|---|
| GraphRAG | 索引 + 查询流水线(Microsoft) | 用 LLM 从非结构化文本自动抽实体关系、做社区摘要,再按 Global / Local 模式喂给 LLM 作答 |
| Neo4j | 图数据库 | 把已建模好的节点与关系存进去,用 Cypher 精确查询、更新、遍历 |
相似之处
| 维度 | GraphRAG | Neo4j |
|---|---|---|
| 数据模型 | 实体节点 + 关系边 | 节点 + 关系边 |
| 擅长的问题 | 实体关系、多跳邻域、跨文档结构 | 关系遍历、路径、子图、知识图谱 |
| 知识图谱场景 | 索引产物本质是「图 + 社区摘要」 | 业界常用的图谱存储与查询后端 |
| 与 RAG 的关系 | 直接为 RAG 设计(检索 → 生成) | 不自带 RAG;常作检索层或业务库,需自己接 LLM |
直觉:都在用「图」表达事物之间的连接;GraphRAG 的 entities / relationships 与 Neo4j 的 Node / Relationship 概念上很像。
关键区别
| 维度 | GraphRAG | Neo4j |
|---|---|---|
| 层级 | 应用层方案(建索引 + 查问答) | 基础设施层(数据库) |
| 图从哪来 | 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()
面试速记
- Neo4j 是什么? 原生图数据库,节点+关系为一等公民,Cypher 查询,适合多跳关系与路径分析。
- 和关系库最大差别? 遍历关系是存储模型内置能力,不是反复 JOIN。
- GraphRAG 和 Neo4j 一样吗? 不一样;GraphRAG 是 LLM 文档索引与 RAG 方案,Neo4j 是图存储引擎。
- 二者相似点? 都用图表示实体与关系,都服务知识图谱、多跳推理类需求。
- 能组合吗? 能;GraphRAG 离线抽图导入 Neo4j,或 Neo4j 做精确子图检索再交给 LLM。
- 何时只用 Neo4j? 图数据已结构化、要强事务与自定义查询,不需要 GraphRAG 那套社区摘要流水线。