本系列从邻接代价走到 store、expand、锁与排障。收束只回答两件事:什么时候值得上原生图引擎;GraphRAG / 向量检索要的「图」是不是同一种边。检索管线、社区检测与 prompt 工程已在 db-frontier GraphRAG 与 llm-infra RAG;本篇只钉存储与一致性接口。
本文是「图数据库内核」系列第 16 篇(共 16 篇)。→ 系列目录
篇目 核心内容 第 14–15 篇 · 对照 / 排障 地图与 runbook 第 16 篇 · 选型与接口 决策树 + 边语义分级
版本与分工:机制回指本系列 01–15(Neo4j Ops/Cypher Manual 锚定见各篇)。GraphRAG 动机与管线以站内 db-frontier 文为准,并回指 Edge et al., arXiv:2404.16130(预印本,作问题定义非性能排名)。不写 Aura 定价、不写跨引擎延迟榜。
一、系列已经钉死的命题(选型前提)
选型前先承认这些不变量,避免用营销句覆盖机制:
- 代价中心是边的局部性,不是「点的个数」口号(第 02 篇)。
- 索引找起点,expand 付拓扑账;二者乘积是经典事故(第 07、09–10 篇)。
- dense / 超节点改写 I/O 与锁;引擎缓解 ≠ 建模免责(第 04–06、11、15 篇)。
- 默认隔离多为 RC 一类故事;集群 bookmark 解决的是跨副本可见,不是把隔离升成 Serializable(第 11–12 篇)。
- 全文/向量是旁路(常 Lucene + OS 缓存),不是第二套邻接(第 08 篇)。
- 外置图层 / 四元组 / PG 表映射 / MPP 原生是分叉,不是同一 store 的皮肤(第 13–14 篇)。
若业务问题能在边表 + 浅递归 CTE 的 \(\mathrm{Cost}_{\mathrm{edge}}\) 内闭环,不上图引擎是合法答案。
二、何时必须(或强烈倾向)原生图
用决策树收束第 14 篇排除法。这里的「原生图」指:邻接为一等布局、运维面主要在图引擎内(Neo4j store、TigerGraph GSE、Memgraph 内存图等),对照 AGE/边表/JanusGraph 图层。
flowchart TD
Start["多跳或关系谓词是一等负载?"] -->|否| VecSQL["向量 / SQL / 文档检索即可<br/>见 llm-infra / vector-engine"]
Start -->|是| Deep{"跳数与扇出是否经常让 JOIN/CTE 痛?"}
Deep -->|否或不确定| Pilot["先 AGE 或边表试点<br/>用第 02/15 篇计量"]
Deep -->|是| Tx{"边更新需要引擎内事务<br/>与审计级不变量?"}
Tx -->|弱 / 可重建| Soft["抽取图可批处理重建<br/>GraphRAG 索引图也可"]
Tx -->|强| Native["倾向原生图引擎"]
Soft --> Ops{"已有宽表集群且愿付 RPC?"}
Ops -->|是| JG["JanusGraph 图层可论证"]
Ops -->|否| Native2["仍倾向原生或托管图"]
Native --> Lang{"主负载是选择性 OLTP<br/>还是全图迭代分析?"}
Lang -->|OLTP 多跳| Neoish["Neo4j 族 / 托管同类"]
Lang -->|BSP 全局迭代| TG["TigerGraph 等 MPP 叙事"]
Pilot -->|试点失败| Native
2.1 倾向原生图的充要组合(工程判断)
同时满足越多,越难用「Postgres 顶住」糊弄:
| 条件 | 为何 |
|---|---|
| 在线路径 ≥ 2–3 hop 且扇出不可忽略 | \(\mathrm{Cost}_{\mathrm{edge}}\) 重复索引探测放大(第 02 篇) |
| 热查询依赖邻接局部性(同一子图反复 expand) | page cache / 共置故事成立(第 05 篇) |
| 边是业务不变量(权限、账户关系、风控边),要提交语义 | 第 11 篇锁与 WAL;不是「抽完可 overnight 重建」 |
| 团队要 Cypher/GSQL 计划与存储同栈排障 | 第 10、15 篇 runbook 有落点 |
2.2 可以先不上原生图的情形
| 情形 | 更合适的落点 |
|---|---|
| 跳数浅、度数受控、SQL 生态沉没成本高 | 边表 / 递归 CTE;或 Apache AGE |
| 图主要服务 RAG 离线索引,可脏可重建 | 批处理构图 + 向量库;甚至 NetworkX 级原型(见 db-frontier) |
| 已有 Cassandra/HBase,图是附加访问模型 | JanusGraph(第 13 篇),接受 \(C_{\mathrm{remote}}\) |
| 只要云托管、少碰格式 | Neptune 一类;排障翻译为索引模式(第 14–15 篇) |
| 主问题是语义相似,不是结构可达 | vector-engine + llm-infra RAG |
「必须」的硬标准:不是品牌,而是失败模式——CTE/JOIN 已证明尾延迟或正确性(事务边)不可接受,且图层的远程常数不可接受。
三、GraphRAG 接口:边语义分级
站内 GraphRAG 文指出:向量相似度是语义邻近,多跳需要结构可达;图提供 evidence path,且自动抽取图不追求 Schema 级严谨。这与本系列「生产属性图 + 事务边」不是同一约束集。选型错误常来自把二者捆成一种存储。
3.1 四级边(建议显式标注)
| 级别 | 边的含义 | 一致与新鲜度 | 存储建议 |
|---|---|---|---|
| L0 检索边 | LLM 抽取的 co-mention / 软关系;可错可漏 | 最终一致;可批处理重建 | 向量库旁路小图、嵌入式图、甚至物化路径表 |
| L1 索引边 | GraphRAG 社区 / 报告依赖的拓扑;服务 Local/Global Search | 索引延迟可分钟–小时;重建代价高于 L0 | 轻量图库或原生图的只读副本/分析库 |
| L2 业务拓扑边 | 产品关系、组织架构、推荐边;查询要稳定 hop | OLTP;RC 或按需加强 | 原生图或 AGE;按第 02/14 篇选型 |
| L3 审计 / 权限边 | 授权、资金、合规依赖的边 | 强提交语义;常要可追溯 | 原生图或成熟 RDBMS 约束表;慎用最终一致图层默认路径 |
GraphRAG 默认产出大量 L0–L1。把 L0 边写进 L3 集群、或反过来用向量库冒充 L3 权限边,都会在排障时表现为「随机错误」而非单纯慢查询。
3.2 推荐拼法(接口契约)
flowchart LR
Docs["语料 / Chunks"] --> Emb["Embedding"]
Docs --> Extract["LLM 抽取 L0/L1"]
Emb --> Vec["向量引擎 / Lucene VECTOR"]
Extract --> Gidx["图索引存储"]
Biz["业务系统"] --> Gbiz["L2/L3 图或约束表"]
Q["在线 Query"] --> Vec
Q --> Gidx
Q --> Gbiz
Vec --> Ctx["Context 组装"]
Gidx --> Ctx
Gbiz --> Ctx
Ctx --> LLM["生成 + 引用"]
契约句:
- 向量召回回答「语义近」;图 expand 回答「结构可达」——分数不可横比硬加(第 08 篇)。
- Local Search 式「实体 → \(k\)-hop → chunk」:hop 落在 Gidx/Gbiz 的哪一层,决定要不要 bookmark、要不要事务快照。
- Global / 社区报告:计算偏分析;宜与 L3 写路径隔离(批作业、只读副本、或独立分析库),避免第 10 篇式行流打爆 OLTP heap。
- 实体对齐(canonicalization)失败是 GraphRAG 上限问题(db-frontier);图引擎不能用「加 page cache」修复错边。
3.3 「GraphRAG 是否需要强一致图库?」
| 立场 | 适用 |
|---|---|
| 不需要(多数文档问答) | 证据路径来自抽取图;错边通过重索引与人工 alias 消化;向量 + L0/L1 足够 |
| 需要 | 答案依赖 L2/L3 业务边(「谁有权访问」「账户是否关联」)与生成引用同事务可见 |
| 混合 | 双库或双图:抽取索引图可脏;权限/主数据边走强一致存储,查询时 JOIN 两种证据(应用层融合) |
本系列立场:按边分级,不一刀切。这与第 01 篇开放争论表一致。
四、和站内系列如何接线
| 你要解决的问题 | 去读 |
|---|---|
| 多跳为何向量不够、社区报告怎么来 | db-frontier · GraphRAG |
| 切片、嵌入、重排、评估 | llm-infra · RAG 工程 |
| HNSW / 专用向量引擎选型 | vector-engine |
| Neo4j 内 VECTOR/FULLTEXT 旁路 | 本系列第 08 篇 |
| 一次 hop 为何贵、dense 为何炸 | 本系列 02–06、09、15 |
| SQL 侧递归与执行器词汇 | postgresql-kernel、query-engine |
反接线:不要在 GraphRAG 文里期待 block 格式细节;不要在本系列里期待 Ragas 评估曲线。
五、产品族速选(仍非延迟排名)
在第 14 篇五轴表之上,用「默认假设」帮读者落点:
| 若你的默认假设是… | 先看 |
|---|---|
| 要深挖页、指针、Cypher 计划与锁 | Neo4j 主线(本系列) |
| 要 Gremlin 可移植 + 已有宽表 | JanusGraph |
| 要 GSQL / 全图迭代 MPP | TigerGraph |
| 必须进 Postgres 进程 | AGE / 边表 |
| 云托管少碰盘 | Neptune 等 |
| 内存优先、模式可关 ACID | Memgraph |
选定后立刻做第 15 篇的一次真实慢查询归因(或 CTE 基线),再决定是否迁移——避免「先买图库再找负载」。
六、开放问题(系列级)
- GQL 与存储分叉:查询表面收敛后,邻接是否一等布局仍会分裂产品。
- 向量边与拓扑边的统一索引:多模态库愿景(db-frontier)与 Lucene 旁路现实之间,事务快照如何定义仍开放。
- 抽取图的增量社区检测:索引新鲜度与 Leiden 级全局重算的矛盾,会倒逼 L1 存储选「易重建」而非「强一致」。
- 幂律上的基数估计:计划层系统偏差未消;选型期的 POC 必须带真实度数分布,不能只用玩具图。
谱系收束:Angles & Gutierrez 把图模型从关系旁路出来;工业原生图把邻接写进磁盘格式;GraphRAG(Edge et al.)又把图拉回检索系统当 evidence path。三条线交汇处的工程问题不是「要不要图」,而是哪一种边、哪一种一致、哪一种 hop 预算。
七、来源与实验台账(本篇)
| 结论 | 等级 | 来源 |
|---|---|---|
| 邻接/计划/锁/旁路/图层等机制前提 | A | 本系列 01–15 及各篇所引手册 |
| GraphRAG 动机:多跳/全局/结构可达;管线与证据路径 | A/站内 + 预印本 | db-frontier GraphRAG;Edge et al. arXiv:2404.16130 |
| 向量/RAG 工程流水线 | 分工 | llm-infra RAG 工程;vector-engine |
| 边分级与选型树 | 工程判断 | 由机制推导;标为决策框架而非基准结论 |
| 跨引擎 POC 延迟 | 未跑 | 不写排名 |
八、小结(系列收束)
- 原生图在「深多跳 × 邻接局部性 × 事务边」重合时最有说服力;否则 AGE/边表/图层/向量是正经选项。
- GraphRAG 的边多为 L0–L1;L3 权限/审计边不要默认塞进可脏抽取图,也不要用 ANN 替代。
- 接口:向量管语义,图管可达;生成层融合两种证据;排障用第 15 篇三轴。
- 最小复习路径:01 → 02 → 03 → 04 → 05 → 09 → 16;深挖再补 06–08、10–15、13–14。
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【图数据库内核】图引擎全景:属性图作为一等公民的存储与遍历
定位属性图相对行存/LSM/向量/GraphRAG 的生态位;钉住邻接代价、Neo4j store format(record→block)、page cache、索引与 Expand、Cypher 计划五条坐标系,并以 Angles & Gutierrez 谱系与原生图争论收束系列路线。
【图数据库内核】邻接的代价模型:边表 JOIN、CSR 与原生指针为何不是同一件事
把同一逻辑图落成边表+索引、CSR、原生关系链与 Neo4j block 内联四条路径,用统一代价语言比较一次 hop 与 k 跳扩张;钉住幂律超节点与局部性,为后续 record/block 布局篇垫底座。
【图数据库内核】全文与向量属性边界:Lucene 旁路,不是 page cache 里的第二套邻接
划清 Neo4j FULLTEXT / VECTOR 索引相对 RANGE/TEXT 与拓扑 expand 的边界:二者均走 Lucene、吃 OS page cache;查询靠过程/SEARCH 而非自动计划;并链到站内 search-engine 与 vector-engine,不重写倒排与 ANN 全书。
【图数据库内核】引擎对照句:TigerGraph、Neptune、AGE、Memgraph 与原生/图层分叉
用本系列五条坐标系对照 TigerGraph NPG/GSE·GPE、Amazon Neptune 四元组索引、Apache AGE 的 PG 表映射、Memgraph 存储模式,以及 Neo4j 与 JanusGraph;只给架构选型句,不做跨引擎延迟排行。