图数据库与三元组存储
第 18 章 · 知识图谱
知识图谱要「存得下、查得快」,离不开底层存储与索引。一类是面向 RDF 的三元组存储(Triple Store),以 (主体, 谓词, 客体) 为基本单位,支持 SPARQL;另一类是图数据库(Graph Database),以节点与边为核心、常带丰富属性,支持 Cypher、Gremlin 等查询。二者在数据模型、查询语言与适用场景上各有侧重。本章讲清三元组存储与图数据库的定位、主流产品(Virtuoso、Blazegraph、Neo4j、Nebula 等)以及存储模型与索引。
一、三元组存储与图数据库的定位
三元组存储(Triple Store)专为 RDF 设计:数据由 (Subject, Predicate, Object) 三元组构成,主体与客体多为 URI 或字面量,谓词为 URI;支持 SPARQL 查询与 RDF 标准(命名图、推理可选)。适合开放数据、知识库、与 LOD(Linked Open Data)生态对接;存储与索引针对「按 S/P/O 任意维度查找」优化。
图数据库(Graph Database)以节点(Node)与边(Relationship/Edge)为第一公民,节点与边均可带属性(Property);模型多为属性图(Property Graph)。查询语言常见 Cypher(Neo4j)、Gremlin(TinkerPop)、或厂商自有 API。适合强调遍历、路径、图算法的场景;与 RDF 的「一切皆三元组」不同,属性图更贴近业务中的实体–关系建模。
选型时可参考:若数据已是 RDF、需 SPARQL 或与 LOD 互操作,优先考虑三元组存储;若以属性图建模、需深度遍历与图算法,可选图数据库。二者也可并存:RDF 导入属性图或反向导出,通过转换层统一访问。
三元组存储与图数据库:数据模型(RDF 三元组 vs 属性图)与查询语言(SPARQL vs Cypher/Gremlin)
二、主流产品概览
Virtuoso(OpenLink):混合型数据库,既支持 SQL 也支持 RDF;内置 SPARQL 端点与 RDF 加载;适合大规模 RDF、LOD 与混合工作负载;商业与开源版并存。
Blazegraph:RDF 三元组存储,支持 SPARQL 1.1、命名图、部分推理;适合高并发读与批量导入;曾用于 Wikidata Query Service 等大规模场景。
Neo4j:主流属性图数据库,查询语言 Cypher;单机与集群版;强项为图遍历、路径查询与图算法库;社区与企业版。
Nebula Graph:分布式属性图数据库,支持大规模图与水平扩展;兼容 OpenCypher 风格查询;适合超大规模图与分布式部署。
其他常见选择:Apache Jena(RDF 框架 + TDB 三元组存储)、RDF4J(Java 框架与多种后端)、Amazon Neptune(云上 RDF 与属性图双模式)、JanusGraph(分布式图、Gremlin)。选型需考虑数据规模、查询模式、运维与许可。
Virtuoso
RDF + SQL; SPARQL endpoint; LOD; hybrid workload; commercial & open.
Blazegraph
RDF triple store; SPARQL 1.1; high concurrency; used in WDQS.
Neo4j
Property graph; Cypher; traversal & graph algorithms; single or cluster.
Nebula Graph
Distributed property graph; OpenCypher; scale-out; large graphs.
产品分布:三元组存储(Virtuoso、Blazegraph、Jena 等)与图数据库(Neo4j、Nebula、JanusGraph 等)
三、存储模型与索引
三元组存储的物理存储通常将每条三元组按 (S, P, O) 的多种排列建立索引,以便按「给定 S 找所有 P–O」「给定 P 找所有 S–O」「给定 O 找所有 S–P」等模式快速查找。常见排列为 SPO、POS、OSP(或 SOP、PSO、OPS);索引结构多为 B+ 树或类似有序结构,支持范围扫描与合并。部分引擎还维护「按谓词分块」或「按图分块」以优化命名图与谓词约束查询。
图数据库通常采用邻接表或邻接索引:每个节点存储其出边(及可选入边)列表,便于「从一节点出发遍历邻居」;节点与边上的属性可单独存储或与结构一起存储。索引则针对节点/边的标签、属性键值建立,以加速「按类型或属性查找节点」等查询。分布式图库还会做图分区(按节点或边切分),在保证局部性的前提下做跨分区遍历。
查询优化方面:三元组存储的 SPARQL 引擎会对 BGP(基本图模式)做连接顺序选择、索引选择与物理计划生成;图数据库则对模式匹配与遍历做算子下推、索引利用与并行化。理解存储与索引有助于写出更高效的查询与合理的数据布局。
索引要点
Triple store: SPO / POS / OSP(或变体)索引,B+ 树等;Graph DB: 邻接表 + 节点/边属性索引,分区与局部性。优化:连接顺序、索引选择、下推与并行。
存储与索引:三元组存储用 SPO/POS/OSP 等排列;图数据库用邻接表与属性索引
一句话: 三元组存储面向 RDF,(S,P,O) 为单元,支持 SPARQL,适合 LOD 与知识库;图数据库面向属性图,节点+边+属性,支持 Cypher/Gremlin,适合遍历与图算法。产品:Virtuoso、Blazegraph(三元组);Neo4j、Nebula(图库)。存储:三元组用 SPO/POS/OSP 等索引;图库用邻接表与属性索引;理解索引有助于查询优化与数据布局。
实践: 用 Jena TDB 或 Blazegraph 加载一小份 RDF(如 DBpedia 片段),执行几条 SPARQL 的 BGP 查询,观察不同 WHERE 条件(先 S、先 P、先 O)对响应时间的影响;或在 Neo4j 中建一个小图,用 Cypher 做 1–2 跳遍历,体会邻接存储对遍历的友好性。
四、小结
三元组存储与图数据库分别服务 RDF/SPARQL 与属性图/Cypher-Gremlin 场景。主流产品包括 Virtuoso、Blazegraph、Neo4j、Nebula 等;选型看数据模型、规模与查询模式。存储与索引:三元组用 SPO/POS/OSP 等索引,图库用邻接表与属性索引;优化时注意连接顺序与索引选择。下一章讲SPARQL 基础:SELECT、CONSTRUCT、ASK、DESCRIBE,基本图模式与 FILTER、OPTIONAL、FROM 与命名图。