最近几个月,被问到最多的问题就是:企业做知识检索和关系推理,到底选图数据库还是选向量数据库?每次我给出的回答都会让对方愣一下——别急着做二选一,这两个东西解决的问题根本不在一个维度上。图数据库擅长的是关系推理,向量数据库擅长的是模糊语义检索,它们分别对应知识问答体系里两个完全不同的环节。这篇就把图数据库和向量数据库从存储模型、查询逻辑、索引机制、适用场景到工程成本彻底拆开,再把企业落地时真正有效的组合打法讲清楚。如果你是做知识库、智能问答、风控图谱、供应链分析或者推荐系统的同学,建议看完再定技术方向。
1. 先别急着做二选一:图数据库和向量数据库的本质差异
1.1 存储模型:一个存关系,一个存特征
图数据库的底层抽象是“点”和“边”。点代表实体,边代表实体之间的关系,边可以带属性。比如电影领域,演员、导演、电影、观众是点,“参演”“执导”“评分”是边,把它画出来就是一张典型的电影评分ER图:USER节点通过RATED边连到MOVIE节点,评分值放在边的属性里;MOVIE再通过DIRECTED边连到DIRECTOR节点。Neo4j这类原生图数据库会把点和边以邻接表的方式存储,相邻节点的指针直接落地,遍历时靠指针跳转,不需要做全表扫描。
向量数据库的底层抽象则完全不同,它存储的是高维浮点向量。文本、图片、音视频经过Embedding模型(OpenAI的text-embedding-3、BGE、M3E、通义千问的Embedding接口)处理后,被投影成一段几百上千维的向量。向量数据库做的事就是在一堆向量里做最近邻搜索:给定一个query向量,找出欧氏距离、余弦相似度或者内积距离最近的top-K个向量。底层用到的索引一般是HNSW(分层可导航小世界图)、IVF(倒排文件)、DiskANN等,这些索引和“实体关系”没有任何关系。
用一个生活化类比来说:图数据库像一张地铁线路图,所有站点之间的连通关系是显式的,问“从A站到B站换乘几次”“经过哪些站”直接看图就行;向量数据库像一个“档案指纹库”,每份文档都提取了一串指纹,你拿一段模糊描述去比对指纹,能找到最相似的那份档案,但档案与档案之间有没有借阅关系、引证关系,指纹库里根本不存。
1.2 查询逻辑:精确路径遍历 vs 模糊相似匹配
图查询是确定性的。用Neo4j的Cypher写一条“找到张导过、同时李也参演过的电影”,返回的结果是确定的,这些结果经过哪些节点、哪几条边,每一步都有据可查。查询走的是路径遍历,从起始节点出发沿着边跳,一跳、两跳、六跳只要图写得好都能跑。跳数越多,图数据库相对传统关系型数据库的优势就越明显,因为它天然就是为“多跳”设计的。
向量查询是概率性的。用户说“类似《星际穿越》的烧脑科幻片”,数据库里可能根本没有“烧脑”这个词,但文本向量化之后,“烧脑”和“脑洞大”“悬疑”“高智商”这些词在语义空间里离得很近,向量数据库照样能把《盗梦空间》《记忆碎片》《前目的地》召回出来。这正是向量检索的价值所在,但它的问题是解释性弱:为什么这两条内容相似?模型把它投影到同一个语义空间后,距离就是近,你没法精确说出“因为共享了哪些实体、通过了哪条关系”。
1.3 索引与扩展性维度完全不在一个频道
很多人会把图数据库和向量数据库放在同一个性能维度上硬比,这是没意义的。图数据库要优化的目标是“多跳遍历”,所以索引主要围绕节点标签、关系类型和属性建,比如在Neo4j里给节点的id、name建索引,让起始节点能快速定位,后面每跳的扩展依赖的是指针和关系索引。图数据库的横向扩展一般靠分片和集群,跨分片的深度遍历非常复杂,这也是为什么很多图数据库在十亿级数据量下做全局图算法会比较吃力。
向量数据库要优化的目标是“高维空间搜索”,通常把向量索引分布式切片,然后并行召回,最后做merge。Milvus可以轻松支撑百亿级向量,几十毫秒返回top-K结果。向量库天然适合分布式,因为一个向量的索引片段可以独立存储和查询。所以从扩展性角度看,向量数据库更接近搜索引擎的玩法。这也就意味着,如果你的核心诉求是“在千万甚至亿级内容里做语义召回”,向量库在工程上是更顺的选择。
2. 知识检索场景:向量数据库为什么成了默认选项
2.1 智能知识库的RAG链路拆解
目前企业做知识库,90%以上的选择都是RAG(检索增强生成)架构,链路大致是:文档解析与切分(chunking)→ Embedding模型向量化 → 向量库存储 → 用户问题时向量召回 → 重排序 → 拼Prompt喂给大模型生成答案。这套流程跑通的门槛很低,Chroma、Qdrant这类轻量向量库装个Python包就能用,所以向量数据库几乎成了知识库代名词。
RAG默认选向量库是有充分理由的:企业私域知识里,用户问法和文档原文很少是同一句话。文档里写的是“本产品支持最多50个并发任务”,用户问的是“我们团队40个人同时用会不会崩”,这两句话在字面上完全对不上,只有把它们映射到同一个语义空间里,才能靠向量距离把相关段落找出来。向量召回天然支持这种开放域模糊匹配,这直接解决了传统关键词搜索最头疼的问题。
但这里有个冷知识:向量召回只是把“候选片段”捞上来了,它不负责答案的正确性。实际生产环境里还需要接一个重排序模型,把vector召回的前50条精排成5条,再喂给大模型。很多团队第一步用向量库跑通demo之后,发现回答质量不行,以为换更强的模型就行,其实问题往往出在召回环节——chunk太大导致语义被稀释,或者同一个意思被切成两个块。
2.2 Milvus、Chroma、Qdrant怎么选:我的实际经验
热词榜上很多人问Milvus、Chroma、Qdrant的选型。我干了三年知识库项目,三款都用过,直接给结论:
| 对比维度 | Milvus | Chroma | Qdrant |
|---|---|---|---|
| 定位 | 生产级分布式向量数据库 | 轻量嵌入式向量库 | 高性能单机/分布式向量库 |
| 部署复杂度 | 高,依赖etcd、MinIO、Pulsar等组件 | 极低,pip安装即用 | 中,Docker单机即可跑 |
| 适合阶段 | 千万级以上生产环境 | 原型验证、个人项目、课程Demo | 百万到千万级生产环境 |
| 标量过滤能力 | 强,支持复杂过滤表达式 | 弱,基本只能按metadata精确匹配 | 较好,支持多种过滤 |
| 生态对接 | LangChain、LlamaIndex、Haystack都有插件 | 和LangChain无缝集成 | Python/Rust客户端都很完善 |
我的个人建议是:原型阶段不要碰Milvus。第一次做知识库POC,直接Chroma写代码,验证的是“Embedding模型选的合不合适、chunk大小调的合不合适”,这两件事比底层数据库重要得多。等POC通过、数据量涨到百万级,再上Qdrant,它单机性能足够好在常规场景下达到毫秒级响应。只有当数据量到了千万级以上,或者需要多副本高可用、租户隔离、动态扩缩容时,才认真考虑Milvus。我看到太多团队一上来就部署Milvus,链路还没调通,业务需求已经换了两轮。
2.3 图数据库做知识检索的尴尬之处
图数据库能不能做知识检索?能,但它检索的是“结构化的精确内容”。比如电影评分ER图里,用户问“评分高于8分的科幻电影有哪些”,只要电影节点上有评分属性和类型属性,一条Cypher就能精准查出来。但如果用户问“类似《星际穿越》的烧脑科幻片”,图数据库就无能为力了。因为“类似”和“烧脑”是语义概念,不是图上的边或者属性。
另一种常见误区是:把图数据库里的节点、关系全部转化成自然语言文本,再Embedding成向量存进向量库,试图让图库拥有语义搜索能力。这种做法的效果我只能说一般。因为把路径关系压成一串文本后,结构信息会严重损失:一条“A转账给B,B转账给C,C与黑名单有关联”的路径,转成自然语言后只是一段话,语义空间里它和另一条完全不同的路径距离可能很近。用向量去拟合结构信息,本质上是用一个不擅长结构的模型去硬扛关系推理,得不偿失。
3. 关系推理必须靠图:多跳路径遍历是图数据库的独门绝技
3.1 一个能看明白的多跳推理实例
先说反欺诈场景。信用卡交易A在一个小时内分多笔转入账户B,B账户又把这些钱转给C、D两个账户,C和D之间还有大额对敲记录。风控人员最关心的问题是:交易A和已知黑名单账户E之间,是否存在一条可解释的资金链路?
图数据库用一条Cypher就能表达:
MATCH p = (t:交易 {id:'A'})-[*1..4]-(b:账户 {status:'黑名单'}) RETURN p LIMIT 20这条查询找出从交易A出发、四跳以内、所有能到达黑名单账户E的路径。每一步都能展示出来:A转给B,B转给C,C转给E。这条路径就是提供给合规部门的完整证据链。图数据库在处理这种多跳查询时,性能远优于关系型数据库,更不用提向量数据库。如果是关系型数据库,每一跳都要做一次Join,跳数越多SQL越复杂;向量数据库则根本无从下手,因为它根本没有“边”的概念。
3.2 为什么向量数据库做不了关系推理
直白地说,向量数据库从头到尾都不存储关系。你的数据进去之后变成一个向量ID和一段浮点数组,ID和ID之间没有任何连接语义。你可以把“A转账给B”的关系拼成文本再Embedding,但那只是把关系编码进语义空间,丢失了结构信息。多跳路径在向量空间里没有对应的数学表达,自然无法做严格意义上的多跳推理。
图数据库除了存储结构支持多跳,还配套了一整套关系分析算子:最短路径、全路径、社区发现、PageRank、节点中心性、子图匹配。这些图算法在Neo4j、TigerGraph、NebulaGraph里都是现成的,一条CALL语句就能跑。做关系推理的企业需要的不是“猜一猜谁和谁可能有关”,而是“明确指出从A到E经过了哪些中间节点”,这种可解释性只有图数据库能给。
3.3 企业业务里关系推理的典型价值场景
我在实际项目里见过大量关系推理的硬需求,给几个典型例子:
- 供应链断供分析。公司有几百个供应商和上万个产品,想找出“哪些产品会受到某一级供应商断供的连锁影响”。图数据库从断供供应商节点出发,沿供应关系边向上追溯3到5跳,能列出一张完整的受影响产品清单,还能算出断供风险等级。
- 医学知识图谱。药物A和药物B同时服用会产生不良反应,机制是它们都作用于同一个酶。图数据库能展示这条“药物-靶点-通路-药物”链路,辅助医生判断联合用药风险。
- 社交关系与营销传播。找出社群里的关键传播节点,从种子用户出发做多跳影响扩散模拟,图数据库一个子图查询就够。
- 招聘领域的人脉推荐。候选人节点和员工节点之间通过“前同事”“校友”等关系边相连,图数据库能找出与目标候选人存在2跳内熟人关系的员工,让内推成功率大幅提升。
这些场景有一个共同点:核心问题都带有“为什么”“经过谁”“受谁影响”“路径是什么”,这些问题的答案本质上是一个路径、一条链路、一张子图。用向量库去回答这些问题,属于工具选错方向。
4. 企业落地最常见的混合架构:向量召回+图推理协作干活
4.1 一套可复用的混合知识服务链路
成熟的做法不是二选一,而是把两者接入同一条链路。以智能电影问答系统为例,用户提问:“推荐几部诺兰导演的、类似《盗梦空间》的电影。”
第一步,把query向量化,去向量数据库做语义召回,得到top20候选电影,包括《星际穿越》《记忆碎片》《敦刻尔克》甚至《源代码》《蝴蝶效应》。第二步,把这20个候选电影的ID拿到图数据库里去做结构验证:查一下每个候选电影是否和“克里斯托弗·诺兰”节点存在DIRECTED关系,过滤掉不是诺兰导的;再查类型属性,把类型为悬疑/科幻的留下。第三步,在图库上继续做多跳扩展:看看诺兰导演的这些电影里,哪些和用户看过的电影有“同一主演”“同一摄影”等关系边,把这些关系作为推荐理由输出。
这条链路最妙的地方在于,向量库负责“语义泛化”,解决用户不会用精确词的问题;图库负责“结构约束”,保证答案在业务逻辑上站得住脚。两者都有不可替代的价值。最后返回给用户的推荐理由也不再是冷冰冰的列表,而是“因为这部电影由诺兰执导,且主演与《盗梦空间》相同”这种带证据链的答案。
4.2 数据同步与一致性:最容易翻车的地方
混合架构能跑通demo很容易,难的是数据同步。图数据库和向量数据库通常是两套独立存储,业务数据可能还同时落在MySQL、Elasticsearch里。我的实践经验是,不要手动去同步数据,一定走事件驱动管道。
架构大致是这样:业务库(MySQL/MongoDB)作为主数据源,通过Debezium或Canal监听Binlog变更,把数据变更事件发到消息队列;消息队列下游挂两个消费者,一个负责更新Neo4j图数据,另一个负责调用Embedding接口生成新的向量再写入Milvus/Qdrant。两个消费者都要做成幂等操作,因为消息可能重复投递。
这里有几个我踩过的坑。第一个坑是只做了全量同步,没做增量。很多团队初期一次性灌数据灌得很爽,上线后新增的文档和关系永远不在知识库里,用户一问新内容就“找不到”。第二个坑是Embedding生成失败后直接丢弃消息。向量化接口偶尔会超时或者限流,应该把失败消息打入死信队列,等夜深人静时重放。第三个坑是图库先更新成功、向量库更新失败,导致用了旧向量召回新关系。这种一致性问题只能靠补偿任务兜底,我通常会在每天凌晨跑一次对账,扫描两边数据条数,以业务库为准补差。
4.3 查询分离与降级策略
混合架构上线前,一定要设计好查询路由和降级方案。我的习惯是做一个统一的知识服务API,对外暴露一个接口,内部根据问题类型分流:
如果问题是纯语义搜索型,比如“帮忙找一些关于隐私计算的入门资料”,直接走向量召回,不需要图库参与,延迟控制在100毫秒以内。
如果问题包含关系型意图,比如“我要查和张三有直接业务往来的所有公司”,先语义召回定位“张三”这个实体节点,再去图库做关系扩展,这个流程延迟200到500毫秒可接受。
如果向量数据库出现故障,降级策略是退回图数据库的关键词/属性查询,虽然语义泛化能力减弱,但核心业务还能撑住。如果图数据库出现故障,至少向量召回还能返回相关片段,只是没有结构推理链路。没有降级方案的混合架构是不允许上生产的,这点建议在架构评审时写进SLO。
5. 选型决策清单:照着这张表判断能少踩几个坑
5.1 五个核心判断维度
与其反复争论“哪个更好”,不如按这五个维度做判断:
| 判断维度 | 偏向图数据库 | 偏向向量数据库 |
|---|---|---|
| 核心查询类型 | 多跳关系、路径遍历、图算法 | 语义相似、相似匹配、top-K召回 |
| 数据结构特点 | 实体关系网状结构,关系是核心资产 | 非结构化文本、图片、音视频的向量表达 |
| 回答可解释性 | 必须给出路径证据链 | 可以接受黑盒相似结果 |
| 数据规模体量 | 千万级节点和边 | 亿级及以上向量 |
| 团队技术储备 | 有数据建模、图查询能力 | 有NLP、Embedding、特征工程能力 |
还有一个常被忽略的维度:数据更新的频率。图数据库支持在线更新点和边,并发写的能力成熟;向量数据库的索引更新成本高,尤其是全量重建索引很耗时。如果知识库里每天有大量新增文档,就要考虑向量索引是否走增量upsert策略,这个在选型时就要规划好。
5.2 实际项目中见过的四类选型翻车案例
踩坑案例一:用图数据库硬扛模糊检索。某团队把用户query直接拿去图数据库里匹配节点属性,结果是用户换了种说法就查不到东西,最后不得不引入全文索引,但语义匹配还是做不了,产品体验被拖垮。
踩坑案例二:用向量数据库硬扛关系推理。某做风控的团队不想维护图库,把“A转账给B”这类关系转成自然语言存进向量库,靠向量相似度来做可疑路径识别。效果是对了一半,但无法向监管解释“为什么这条路径可疑”,因为向量库只给距离不给证据链,最后合规评审没过。
踩坑案例三:架构过度设计。刚上线三个月的知识库项目就上了分布式向量库,光运维组件就有四套,没有专职运维团队,出问题时排查链路极长。我的建议是:100万条以内的向量,Chroma、Qdrant单机版完全够用;超过1000万条再考虑上分布式,别为了“技术先进”而选型。
踩坑案例四:图数据库Schema设计不预留空间。图谱建模时只设计了当前业务需要的节点和边,上线两三个月后想加一种新关系,发现要改大量导入脚本和历史数据,成本极高。图数据库的Schema设计一定要预留扩展位,比如统一使用“属性名+值”的方式给节点预留通用属性,尽量把边类型设计成可配置项。
5.3 我个人的经验打包送给你
如果问题主要以“有哪些”“相似”“推荐”“描述一下”为主,优先向量数据库。如果问题主要以“为什么”“经过谁”“受谁影响”“路径如何”“是否关联”为主,优先图数据库。如果两类问题都有,就直接上混合架构,不需要犹豫。预算和理解成本不是决定性的,决定性的永远是你的核心业务问题。
最后分享一个小技巧:做技术选型之前,先把过去三个月的真实用户问题翻出来,按“语义检索型”和“关系推理型”分类统计,比例超过7比3就选向量库为主,超过3比7就选图库为主,接近5比5就老老实实做混合架构。数据永远比直觉更值得相信。