知识图谱是一个大规模语义网,由实体,概念等节点和属性,关系,类型等边构成。
是许多三元组的集合。每一个三元组是由主语(subject),谓语(predicate),宾语(object)构成。
随着各个领域不断增长的知识图谱,知识图谱存储也吸引着很多人进行研究,本文将从知识图谱的数据模型、存储方式、基于关系/原生的知识图谱存储管理、数据库等几方面进行阐述。
【本文篇幅较长计9662字,阅读完大概需十分钟,若有想直接了解的内容,可直接点击目录】
知识图谱的两种主流数据模型(数据的结构、操作和约束):
RDF 图模型和属性图模型
数据模型特性 | 数据模型特性 | RDF图模型 | 属性图模型 |
---|---|---|---|
结构 | 标准化程度 数学模型 表达力 边属性表达 概念层本体定义 串行化格式 | 已由W3C制定了标准化的语法和语义 3-均匀有向标签超图 RDF图模型强于属性图模型 通过额外方法, 如“具体化” RDFS、OWL、 XML、JSON、N-Triples、Turtle等 | 尚未形成工业标准 有向标签属性图 属性图模型弱于RDF图模型 内置支持 不支持 CSV |
操作 | 查询代数 | SPARQL代数 | 无 |
查询语言 | SPARQL | Cypher、Gremlin、PGQL、G-CORE | |
约束 | 约束语言 | RDF Shapes约束语言(SHACL) | 无 |
知识图谱数据模型的主流数据库管理系统:
RDF三元组库和原生图数据库
知识图谱查询语言:
SPARQL、Cypher、Gremlin、PGQL 和 G-CORE
语法/语义/特性 | SPARQL | Cypher | Gremlin | PGQL | G-CORE | |
---|---|---|---|---|---|---|
图模式匹配查询 | 语法 | CGP | CGP | CGP(无可选)1 | CGP | CGP |
语义 | 子图同态、包2 | 无重复边、包2 | 子图同态、包2 | 子图同构3、包2 | 子图同态、包2 | |
导航式查询 | 语法 | RPQ超集(增加反向边和属性集上的否定) | RPQ子集(*只能作用在单边) | RPQ超集(增加通过表达式比较属性值) | RPQ超集(增加比较路径上的顶点和边) | RPQ超集(增加复杂路径表达式) |
语义 | 任意路径、集合4 | 无重复边5、包2 | 任意路径6、包2 | 最短路径7、包8 | 最短路径9、包2 | |
分析型查询 | 聚合函数 | 聚合函数 | 聚合函数、PageRank、PeerPressure聚类 | 聚合函数 | 聚合函数 | |
查询可组合性 | 否 | 是 | 是 | 否 | 是 | |
数据更新语言DML | CRUD10 | CRUD | 无 | 无 | CR | |
数据定义语言DDL | 无 | 有 | 无 | 无 | 无 | |
实现系统 | Jena、RDF4J、gStore、Virtuoso等 | Neo4j、AgensGraph等 | TinkerTop等 | Oracle PGX | 无 |
注:1. Gremlin不显式支持可选(optional)操作, 但可以通过其他语法特性等价模拟.2.可通过DISTINCT关键字支持集合语义.3. PGQL默认的图模式匹配查询语义是子图同构, 可使用ALL关键字改为子图同态.4. SPARQL中只有当使用*运算使得属性路径查询无法等价写为CGP时才使用集合语义.5. Cypher可通过shortestPath函数支持最短路径语义.6. Gremlin中其他语义可以被模拟出来.7. PGQL路径查询可通过用户定义函数实现其他语义.8. PGQL路径查询返回单条最短路径, 集合和包语义相同.9. G-CORE路径查询可通过ALL关键字改为任意路径语义.10. CRUD分别代表CREATE创建、READ读取、UPDATE更新和DELETE删除
知识图谱上 3 种主要的查询操作类型:
图模式匹配、导航式和分析型查询
- RDF图: 设U、B 和 L 为互不相交的无限集合,分别代表 URI、空顶点(blank node)和字面量(literal). 一个三元组(s,p,o) ∈ \in ∈( U ∪ B U \cup B U∪B) × \times ×U × \times ×( U U U ∪ \cup ∪ B B B ∪ \cup ∪ L L L)称为 RDF 三元组,其中,s 为主语,p 为谓语,o 为宾语.RDF 图 G 是 RDF 三元组的有限集合.
- 属性图:属性图 G 是 5 元组( V V V, E E E, ρ \rho ρ, λ \lambda λ, σ \sigma σ,),其中,
(1) V 是顶点的有限集合;
(2) E 是边的有限集合且 V ∩ E = ϕ V\cap E=\phi V∩E=ϕ ;
(3) 函数 ρ : E → ( V × V ) \rho:E\rightarrow(V\times V) ρ:E→(V×V)将边关联到顶点对,如 ρ ( e ) = ( v 1 , v 2 ) \rho(e)=(v1,v2) ρ(e)=(v1,v2)表示$ e $是从顶点 v 1 v1 v1 到顶点 v 2 v2 v2 的有向边;
(4) 设 L a b Lab Lab 是 标签集合,函数 λ : ( V ∪ E ) → L a b \lambda: (V\cup E)\rightarrow Lab λ:(V∪E)→Lab为顶点或边赋予标签,如 v ∈ \in ∈V(或 e ∈ \in ∈E)且 λ ( v ) = l \lambda(v)=l λ(v)=l(或 λ \lambda λ(e)= l l l),则$ l$ 为顶点 v(或边 e)的标 签;
(5) 设 P r o p Prop Prop是属性集合, V a l Val Val是值集合,函数 ρ : ( V ∪ E ) × P r o p → V a l \rho:(V\cup E)\times Prop \rightarrow Val ρ:(V∪E)×Prop→Val为顶点或边关联属性,如 v ∈ V ( 或 e ∈ E ) 、 p ∈ P r o p v \in V (或e \in E)、p \in Prop v∈V(或e∈E)、p∈Prop且 σ ( v , p ) = v a l ( \sigma(v,p)=val( σ(v,p)=val(或 σ ( e , p ) = v a l \sigma(e,p)=val σ(e,p)=val,则顶点 v ( 或边 e ) v(或边e) v(或边e)上属性 p 的值为 v a l p的值为val p的值为val
存储大规模知识图谱,且便于对知识进行更新,但当知识图谱查询的选择性较大时,查询性能明显下降
无邻接索引的特性能够高效处理复杂的知识图谱查询,但有限的存储容量和不灵活的更新机制使得原生图存储不能很好地应用于大规模知识图谱中
关系数据库目前仍是使用最多的数据库管理系统。基于关系的知识图谱存储方案,包括:三元组表、水平表、属性表、垂直划分、六重索引和 DB2RDF。
三元组表(triple table)是将知识图谱存储到关系数据库的最简单、最直接的办法,就是在关系数据库中建立 一张具有 3 列的表,该表的模式为triple_table(subject,predicate,object),subject、predicate 和 object 这 3 列分别表示主语、谓语和宾语。
水平表(horizontal table)存储方案同样非常简单。水平表的每行记录存储知识图谱中一个主语的所有谓语 和宾语。实际上,水平表相当于知识图谱的邻接表。水平表的列数是知识图谱中不同谓语的数量,行数是知识图 谱中不同主语的数量。
属性表(property table)存储方案是对水平表的细分,将同类主语存到一个表中,解决了表中列数目过多的问题。
垂直划分(vertical partitioning)存储方案,为每种谓语建立一张两列的表(subject,object),表中存放知识图谱中由该谓语连接的主语和宾 语,表的总数量即知识图谱中不同谓语的数量.
六重索引(sextuple indexing)存储方案是对三元组表的扩展,是一种典型的“空间换时间”策略,其将三元组全部6种排列对应地建立为6张表,即spo(主语,谓语,宾语)、pos(谓语,宾语,主语)、osp(宾语,主语,谓语)、sop(主语,宾语,谓语)、pso(谓语,主语,宾语)和ops(宾语,谓语,主语)。不难看出,其中 spo 表就是原来的三元组表。六重索引通过6张表的连接操作不仅缓解了三元组表的单表自连接问题,而且提高了某些典型知识图谱查询的效率。
原生知识图谱存储是指专门为知识图谱而设计的底层存储管理方案
目前主要的原生图数据库有Neo4j、gStore、JanusGraph、OrientDB和Cayley。
Neo4j是目前最流行的属性图数据库,其原生图存储层的最大特点是具有“无索引邻接(index-free adjacency)”特性。所谓“无索引邻接”是指,每个顶点维护着指向其邻接顶点的直接引用,相当于每个顶点都可看作是其邻接顶点的一个“局部索引”,用其查找邻接顶点比使用“全局索引”节省大量时间。这就意味着图导航操作代价与图大小无关,仅与图的遍历范围成正比
gStore 将 RDF 数据图中每个资源的所有属性和属性值映射到一个二进制位串上。具体而言,对于每个属性 或属性值,gStore 都定义一个固定长度的位串并将位串中所有位置为 0。然后利用若干个预先定义的字符串哈希函数将属性或属性值按照标识符映射到若干个小于位串长度的整数值,进而将位串上这些值所对应的位置置为1。
JanusGraph是在原有Titan系统基础上继续开发的开源分布式图数据库。JanusGraph的存储后端与查询引擎是分离的, 可使用分布式Bigtable存储库Cassandra或HBase作为存储后端。JanusGraph借助第三方分布式索引库ElasticSearch、Solr和Lucene实现各类型数据的快速检索功能,包括地理信息数据、数值数据和全文搜索。JanusGraph还具备基于MapReduce的图分析引擎,,可将Gremlin导航查询转化为MapReduce任务。
OrientDB最初是由OrientDB公司开发的多模型数据库管理系统。OrientDB虽然支持图、文档、键值、对象、关系等多种数据模型, 但其底层实现主要面向图和文档数据存储管理的需求设计。其存储层中数据记录之间的联系并不是像关系数据库那样通过主外键的引用,而是通过记录之前直接的物理指针。OrientDB对于数据模式的支持相对灵活,可以管理无模式数据(schema-less),也可以像关系数据库那样定义完整的模式(schema-full),还可以适应介于两者之间的混合模式(schema-mixed)数据。在查询语言方面,OrientDB支持扩展的SQL和Gremlin用于图上的导航式查询;OrientDB的MATCH语句实现了声明式的模式匹配,这类似于Cypher语言查询模式。
Cayley是由Google公司工程师开发的一款轻量级开源图数据库。Cayley的开发受到了Freebase知识图谱和Google知识图谱背后的图数据存储的影响。Cayley使用Go语言开发,可以作为Go类库使用;对外提供REST API,具有内置的查询编辑器和可视化界面;支持多种查询语言,包括:基于Gremlin的Gizmo、GraphQL和MQL;支持多种存储后端, 包括:键值数据库Bolt、LevelDB, NoSQL数据库MongoDB、CouchDB、PouchDB、ElasticSearch,关系数据库PostgreSQL、MySQL等。
Amazon云平台的Amazon Neptune
多模型图数据库Arango DB
微软的Azure CosmosDB
DataStax的Enterprise Graph
Sparsity的Sparksee
TigerGraph
在图数据库的选型上我们主要考虑了以下 5 点:
(A) 项目开源,暂不考虑需付费的图数据库
(B) 分布式架构设计,具备良好的可扩展性
© 毫秒级的多跳查询延迟
(D) 支持千亿量级点边存储
(E) 具备批量从数仓导入数据的能力
针对主流图数据库,进行选型分析
DB-Engines Ranking of Graph DBMS 剔除不开源的项目,可分为:
NebulaGraph vs. Dgraph vs. HugeGraph的对比分析
Neo4j vs NebulaGraph vs JanusGraph的对比分析
图形数据大小 | 平台 | 数据导入 | 一跳查询 | 两查询 | 共享好友查询 |
---|---|---|---|---|---|
1000 万条边 | Neo4j | 26秒 | 6.618秒 | 6.644秒 | 6.661秒 |
HugeGraph | 89秒 | 16毫秒 | 22毫秒 | 72毫秒 | |
NebulaGraph | 32.63秒 | 1.482毫秒 | 3.095毫秒 | 0.994毫秒 | |
1 亿条边 | Neo4j | 1分21秒 | 42.921秒 | 43.332秒 | 44.072秒 |
HugeGraph | 10分 | 19毫秒 | 20毫秒 | 5秒 | |
NebulaGraph | 3分52秒 | 1.971毫秒 | 4.34毫秒 | 4.147毫秒 | |
10 亿条边 | Neo4j | 8分34秒 | 165.397秒 | 176.272秒 | 168.256秒 |
HugeGraph | 65分 | 19毫秒 | 651毫秒 | 3.8秒 | |
NebulaGraph | 29分35秒 | 2.035秒 | 22.48毫秒 | 1.761毫秒 | |
80 亿条边缘 | Neo4j | 1小时23分钟 | 314.34秒 | 393.18秒 | 608.27秒 |
HugeGraph | 16小时 | 68毫秒 | 24秒 | 541毫秒 | |
NebulaGraph | ~30分钟 | 小于 1s | 小于 5 秒 | 小于 1s |
Dgraph vs. HugeGraph vs. JanusGraph vs. NebulaGraph vs. Neo4j的对比分析
常见知识图谱数据库管理系统的比较
类型 | 名称 | 许可证 | 数据模型/存储方案 | 查询语言 | 是否活跃 |
---|---|---|---|---|---|
基于关系 | 3store | 开源 | RDF图/三元组表 | SPARQL | 否 |
DLDB | 研究原型 | RDF图/水平表 | SPARQL | 早期系统, 水平表存储方案的代表性系统 | |
Jena | 开源 | RDF图/属性表 | SPARQL | 主流的语义Web工具库、RDF数据库和OWL推理工具 | |
SW-Store | 研究原型 | RDF图/垂直划分 | SPARQL | 科研原型系统, 垂直划分存储方案的代表性系统 | |
IBM DB2 | 商业 | RDF图/DB2RDF | SPARQL/ SQL | 支持RDF的主流商业数据库 | |
Oracle 18c | 商业 | RDF图/关系存储 | SPARQL/ PGQL | 支持RDF的主流商业数据库 | |
RDF三元组库 | RDF4J | 开源 | RDF图/SAIL API | SPARQL | 是 |
RDF-3X | 开源 | RDF图/六重索引 | SPARQL | 科研原型系统, 六重索引存储方案的代表性系统 | |
gStore | 开源研究原型 | RDF图/VS*树 | SPARQL | 科研原型系统, 原生图存储, 使用了基于位串图存储技术 | |
Virtuoso | 商业/开源 | RDF图/多模型混合 | SPARQL/ SQL | 语义Web项目常用的RDF数据库, 基于成熟的SQL引擎 | |
AllegroGraph | 商业 | RDF图/三元组索引 | SPARQL | 对语义推理功能具有较为完善的支持 | |
GraphDB | 商业 | RDF图/三元组索引 | SPARQL | 支持语义Web标准的主流产品, 支持SAIL层推理功能 | |
BlazeGraph | 商业 | RDF图/三元组索引 | SPARQL/ Gremlin | 基于RDF三元组库的图数据库, 实现了SPARQL和Gremlin | |
StarDog | 商业 | RDF图/三元组索引 | SPARQL | 对OWL2推理机制具有良好的支持 | |
原生图数据库 | Neo4j | 商业/开源 | 属性图/原生图存储 | Cypher | 是 |
JanusGraph | 开源 | 属性图分布式存储 | Gremlin | 分布式图数据库, 存储后端与查询引擎分离, 实现了Gremlin | |
OrientDB | 商业 | 属性图/原生图存储 | SQL/ Gremlin | 支持多模型的原生图数据管理系统, 对数据模式的灵活支持 | |
Cayley | 开源 | RDF图/外部存储 | Gremlin/ GraphQL | 轻量级开源图数据库, 易于扩展对新语言和存储后端的支持 | |
分布式系统与框架 | Sempala | 开源研究原型 | RDF图/分布式存储 | SPARQL | 否 |
TriAD | 开源研究原型 | RDF图/分布式存储六重索引 | SPARQL | 基于MPI框架的异步通信协议 | |
H2RDF+ | 开源研究原型 | RDF图/分布式存储六重索引 | SPARQL | 基于HBase构建六重索引 | |
S2RDF | 开源研究原型 | RDF图/分布式存储垂直划分 | SPARQL | 基于Spark框架建立大量索引 | |
Stylus | 开源研究原型 | RDF图/分布式存储属性表优化 | SPARQL | 基于分布式内存键值库的RDF三元组库 | |
Apache Rya | 开源 | RDF图/分布式存储三元组索引 | SPARQL | 基于列存储Accumulo的RDF三元组库 | |
Cypher for Apache Spark | 开源 | 属性图/分布式存储DataFrame | Cypher | 基于Spark框架的Cypher引擎 |
TuGraph由蚂蚁集团与清华大学联合研发,构建了一套包含图存储、图计算、图学习、图研发平台的完善的图技术体系,拥有业界领先规模的图集群,解决了图数据分析面临的大数据量、高吞吐率和低延迟等重大挑战,是蚂蚁集团金融风控能力的重要基础设施,显著提升了欺诈洗钱等金融风险的实时识别能力和审理分析效率,并面向金融、工业、政务服务等行业客户。
性能较强,大容量,但初步开源,问题较多,功能尚不完善。
功能特诊 | 性能和可扩展性 |
---|---|
标签属性图模型 | TB 级大容量 |
支持多图 | 千万顶点/秒的高吞吐率 |
完善的 ACID 事务处理 | 高可用性支持(企业版) |
内置 25+ 图分析算法 | 高性能批量导入 |
基于 web 客户端的图可视化工具 | 在线/离线备份 |
支持 RESTful API 和 RPC | |
OpenCypher 图查询语言 | |
基于 C++/Python/Java 的存储过程 | |
适用于高效图算法开发的 Traversal API |
NebulaGraph是一个分布式,可扩展且闪电般的图形数据库。它是世界上能够托管具有数百亿个顶点(节点)和数万亿条边(关系)的图形的最佳解决方案,具有毫秒级延迟。
社区版与企业版的差异
整体上来说,社区版比企业版少一些可视化以及图算法
随着知识图谱规模的日益增长,数据管理愈加重要。随着三元组库和图数据库的相互融合发展,知识图谱的存储和数据管理手段将愈加丰富和强大。本文主要讲述的是知识图谱存储技术、数据库的对比,进而能在进行知识存储中进行选择适合自己研发场景的数据库。
以上是我个人在学习过程中的记录所学,希望对正在一起学习的小伙伴有所帮助!!!
如果对你有帮助,希望你能一键三连【关注、点赞、收藏】!!!
知识图谱的综述、构建、存储与应用
如何高效存储大规模知识图谱数据?基于机器学习的知识图谱存储结构—论文
知识图谱入门:知识图谱存储、融合、可视化、图表示计算与搜索常用工具总结
美团图数据库平台建设及业务实践 - 美团技术团队 (meituan.com)
(8条消息) Neo4j 和 Nebula Graph 和 HugeGraph对比选型_会发paper的学渣的博客-CSDN博客_nebula neo4j
企业版报价 NebulaGraph Database (nebula-graph.com.cn)