AI Agent 知识图谱一定要用图数据库吗:一个被混淆了十年的问题
开篇:一个根深蒂固的联想
每次有人提"知识图谱",紧接着的一句话几乎一定是:
“那我们用 Neo4j 吧。”
好像知识图谱和图数据库是绑定的。上了知识图谱就必须上图数据库,不上图数据库就不算知识图谱。
这是一个被混淆了十年的概念。
知识图谱是"怎么组织数据"的决策,图数据库是"存在哪里"的选型。 它们是两个正交的维度,可以自由组合。
本文做两件事:
- 用一个 SQL 例子证明:知识图谱可以存在 MySQL 里,跑得好好的
- 给出"什么时候才真正需要图数据库"的判断标准
读完你能:分清"数据组织方式"和"存储介质",不再被"上了知识图谱就得用图数据库"带偏。
一、知识图谱 vs 图数据库:两个正交维度
所有"存记忆/存知识"的方案,都可以从两个正交维度去看:
维度 1:存什么形态(数据组织方式)
- 原始消息(ChatMessage,日志形态)
- 结构化条目(有 type / subject / status 等元数据)
- 向量嵌入(embedding,一串数字)
- 知识图谱(节点 + 边,有向图)
维度 2:放哪里(存储介质)
- 内存(Map,进程内)
- 文件(JSONL / SQLite)
- 关系型数据库(MySQL / PostgreSQL)
- 内存型数据库(Redis)
- 向量数据库(Milvus / pgvector / Pinecone)
- 图数据库(Neo4j / Graphiti / Amazon Neptune)
知识图谱落在维度 1,图数据库落在维度 2。
知识图谱是一种"用图的方式组织数据"的形态选择–实体是节点,关系是边:
(用户A) --[对花生过敏]--> (花生)
(用户A) --[亲属]--> (用户B)
(用户B) --[对坚果过敏]--> (坚果)
(花生) --[属于]--> (坚果类)
这是"怎么组织数据"的问题,跟"存在哪"完全无关。
图数据库是一种"专门存图结构、做图查询"的存储介质–它原生存节点和边,查询用 Cypher 这种图遍历语言。
它们可以自由组合。 知识图谱可以存在图数据库里,也可以不存在。
二、知识图谱可以存在 MySQL 里
这是最反直觉但最重要的一点。用两张表就能存知识图谱:
-- 节点表
CREATE TABLE kg_node (
id VARCHAR PRIMARY KEY,
type VARCHAR, -- User / Food / Category
props JSON -- 其他属性
);
-- 边表
CREATE TABLE kg_edge (
from_id VARCHAR, -- 起点
to_id VARCHAR, -- 终点
type VARCHAR, -- RELATIVE_OF / ALLERGIC_TO / BELONGS_TO
props JSON -- 边的属性(什么时候说的、谁说的)
);
查"用户亲属的过敏史",用 SQL JOIN 模拟图遍历:
SELECT f.props->>'$.content'
FROM kg_edge e1 -- 用户-亲属
JOIN kg_edge e2 ON e1.to_id = e2.from_id -- 亲属-事实
JOIN kg_node f ON e2.to_id = f.id -- 事实内容
WHERE e1.from_id = 'userA'
AND e1.type = 'RELATIVE_OF'
AND e2.type = 'SAID'
AND f.props->>'$.content' LIKE '%过敏%';
这是知识图谱–节点 + 边组织数据,完整表达了"用户-亲属-事实"的关联结构。
但这不是图数据库–存在 MySQL 里,查询用 SQL JOIN,没有 Neo4j 什么事。
而且它能跑。大多数企业知识图谱就是这么存的,没毛病。
三、知识图谱可以存在的五种介质
不只是 MySQL。知识图谱可以落在很多种介质里:
| 介质 | 怎么存知识图谱 | 怎么查 | 适合 |
|---|---|---|---|
| 图数据库 | 原生节点+边 | Cypher 图遍历 | 深度遍历、关系推理 |
| 关系型 DB | nodes 表 + edges 表 | SQL JOIN 模拟图遍历 | 大多数企业知识图谱 |
| 内存 | 对象引用 + 邻接表 | 代码遍历 | 小规模图谱 |
| 文件 | JSON / RDF / Turtle | 加载后遍历 | 离线知识图谱导出 |
| 向量 DB | 每个节点存一个 embedding | 向量相似 | 不算真正的图谱查询 |
最后一行要特别注意:把知识图谱的节点存在向量数据库里,查询只能做"找相似节点",做不了"顺着边推理"("用户亲属的过敏史"查不出来)。向量数据库不是知识图谱的正确存储介质–这是个常见的误用。
四、什么时候才真正需要图数据库
知识图谱存在 MySQL 里能跑,但有一个会爆炸的问题:图遍历深度变深时,SQL JOIN 的性能急剧下降。
1 跳:用户 -> 他说过的事实
-> 1 次 JOIN,毫秒级
2 跳:用户 -> 亲属 -> 亲属说过的事实
-> 2 次 JOIN,毫秒级
3 跳:用户 -> 亲属 -> 亲属的同事 -> 同事说过的事实
-> 3 次 JOIN,开始慢
5 跳以上:多表 JOIN 爆炸
-> MySQL 扛不住
-> 这时候需要图数据库
为什么?关系型 DB 的 JOIN 是笛卡尔积:每次 JOIN 都要把两表的行数相乘。5 跳意味着 5 次 JOIN,复杂度是 O(表大小^5)–百万行表的 5 次方是 10^30,宇宙毁灭都查不完。
图数据库用邻接表索引,图遍历的复杂度是 O(分支因子^深度),跟表大小无关,只跟图的局部结构有关。加上索引优化,5 跳查询实测毫秒级。
Neo4j 查 5 跳:O(分支因子^深度),索引优化后毫秒级
MySQL 查 5 跳:5 次 JOIN,O(表大小^5),爆炸
这就是图数据库存在的唯一理由:深度遍历。
浅度遍历的知识图谱不需要图数据库(关系型 DB 够),深度遍历的才需要。
五、知识图谱选型判断标准:你的查询要几跳
要不要上图数据库,看你的核心查询的遍历深度:
你的知识图谱查询要几跳?
1 跳:用户 -> 他说过的事实
-> 关系型 DB 的 1 次 JOIN,毫秒级,完全够
2 跳:用户 -> 亲属 -> 亲属的事实
-> 关系型 DB 的 2 次 JOIN,毫秒级,够
3 跳:用户 -> 亲属 -> 同事 -> 同事的事实
-> 关系型 DB 的 3 次 JOIN,开始慢
-> 如果查询频繁,考虑图数据库
5 跳+:跨多实体的复杂关联
-> 关系型 DB 爆炸
-> 必须用图数据库
大多数企业知识图谱的查询是 1-2 跳,关系型 DB 完全够。不要为了"看起来高级"就上 Neo4j–运维成本、学习曲线、生态成熟度都是代价。
六、Agent Memory 场景判断
回到 AI Agent 的记忆系统。要不要知识图谱、要不要图数据库,按场景判断:
| 场景 | 要不要知识图谱 | 要不要图数据库 |
|---|---|---|
| 存"用户对花生过敏" | 不需要(一条结构化条目够) | 不需要 |
| 存"用户说过 X,后来改口说 Y" | 不需要(标记取代链够) | 不需要 |
| 查"用户亲属的过敏史" | 需要(跨实体关联) | 看遍历深度,浅的话关系 DB 也行 |
| 查"这个 PR 沉寂 3 天了,关联 CI 失败 + 负责人请假" | 需要(多跳推理) | 大概率需要 |
| 查"3 个月前这条事实当时对不对" | 需要(时序推理) | Zep/Graphiti 用图做双时间轴 |
双时间轴:图数据库的另一个用武之地
最后那个场景"3 个月前这条事实当时对不对"值得展开。这是图数据库(特别是 Zep/Graphiti)的另一个杀手级特性:双时间轴。
validFrom / validTo 事实在现实世界中的有效期
"对花生过敏" validFrom=T1, validTo=T3 (T1 到 T3 期间为真)
"不过敏" validFrom=T3, validTo=null (T3 之后为真)
recordedAt 系统什么时候录入这条记忆
fact1.recordedAt = T1 (T1 时录入)
fact2.recordedAt = T3 (T3 时录入)
关系型 DB 的记忆只有"录入时间",回答不了"上周三时用户对花生过敏吗"。图数据库通过边的 validFrom/validTo 能回答这种时序问题–查 validFrom <= 周三 < validTo 的事实。
如果你的 Agent 需要时序推理(“当时知道什么、什么时候知道的”),图数据库是有价值的选择。
七、总结
知识图谱 = "用图组织数据"的形态选择(维度 1)
图数据库 = "专门存图、查图"的存储介质(维度 2)
知识图谱 ≠ 图数据库
知识图谱可以存在:图 DB / 关系 DB / 内存 / 文件
图数据库专门存:知识图谱(节点 + 边)
选不选用知识图谱:看你要不要"关系推理"
选不选用图数据库:看遍历深度,浅的用关系 DB 够,深的才需要图 DB
三句话收束:
- 知识图谱是设计决策(怎么组织数据),图数据库是工程选型(存在哪里)。 它们正交,可以自由组合。
- 知识图谱不一定要用图数据库。 两张表 + SQL JOIN 就能存知识图谱,大多数企业就是这么做的。
- 图数据库的唯一理由是深度遍历。 浅度遍历用关系型 DB 够,深度遍历(5 跳+)才需要图 DB。时序推理是另一个加分项。
下次有人提"知识图谱",先问他:“你的查询要几跳?” 再决定上不上图数据库。
更多推荐


所有评论(0)