图数据库初探——1. 选择一个合适的图数据库

1. 图数据库概览

Tips:
不了解一个领域的时候,先去找找这个领域的白皮书。
想做一个知识图谱,需要调研一下图数据库,就直接去找这方面的白皮书。相对权威但是不是非常实时的内容
或者直接搜索 知识图谱 图数据库 对比。不那么权威但是相对实时的内容,另外有人使用说明这个东西比较实在。
结合一下,得到的结果应该就比较靠谱了

以上内容中基本都提到一个网站:https://db-engines.com/en/ranking/graph+dbms
在这里插入图片描述
所以听得最多的,基本就是第一名了,和猜测中一样,基本就是要去使用neo4j这个图数据库了

另外,还有个趋势图
在这里插入图片描述
虽然neo4j还是第一,但是第二名的微软的cosmos隐隐有超过的趋势。。。网上似乎没有很多关于Azure Cosmos DB的介绍,这里放了一个博客和官方文档链接,有兴趣的可以看看

2. neo4j比较

另外,还有几张很大的图表,也直接汇总到一起好了。

来源于:图数据库排名、对比

Neo4J和JanusGraph比较

特性\数据库名称 Neo4j JanusGraph
是否开源 社区版开源,企业版收费 完全开源
第一版发行时间 2007年 2016年12月【基于TitanDB[2012]】
技术特点 一站式服务、工具齐全 需要开发者自行组合,因此技术门坎高
查询语言 Cypher Gremlin
开发语言 Java Java
集群 企业版支持,社区版不支持 支持
量级 轻量级 重量级
额外组件依赖 官方提供组件,可以与ES、MongoDB、Cassandra等NoSqlDb进行交互 数据存储服务可以选用Cassandra、HBase或Berkeley DB服务。数据索引可以选用Es、Solr或Lucene服务。
  • 这里其实有一个点要注意,查询语言。。。
  • 普通的关系型数据库采用的查询语言都是基于sql的,只是各家数据库厂商实现会有差距
  • 但是对于图数据库这种新兴的数据库,标准并没有完全统一。
  • 另外,之前看到:Gremlin中文文档
    阿里云GDB图数据库,是在gremlin语言框架下的实现
  • 有兴趣的可以看第二部分,Cypher和Gremlin比较

来源于:图数据库排名、对比

Neo4J企业与社区版本对比

特性 企业版 社区版
数据库集群 支持 无支持
数据库热备份 支持 手工备份,运行时需要停止服务
在线存储空间再使用 回收并再使用数据删除释放的空间 无支持
LDAP/AD继承 与企业级用户身份认证和访问控制系统集成 无支持
访问控制 为数据库管理员提供指定的用户角色功能 无支持
数据库监控 提供监控数据库运行状况的整套指标 无支持
JMX日志和监控 包含GraphiteJMX客户端 无支持
更全面的日志 包括http,security日志 无支持
节点、关系、属性限制 无限制 节点344亿,关系344亿
节点键 使用一个或者多个属性来表示唯一的节点(类似主键) 无支持
运营管理工具 管理员命令行界面 无支持
写入锁、执行过程优化、硬件支持 支持超过4核心 最多4核心

从这个表来看,neo4j的社区版其实功能个还是挺少的,和同为开源版的mysql对比的话。


最后,还有一个大表,来源于:图数据库选型:Neo4j、Janus、HugeGraph
在这里插入图片描述
这里还是注意到 图查询语言的不同
在这里插入图片描述
在这里插入图片描述
这里看到了可能会有些问题的东西,主要是看neo4j为主:

  1. schema约束。社区版没有schema约束,感觉有点坑的样子
  2. 属性索引,lucene是solr和es使用的基础,可能索引功能比较简单吧

在这里插入图片描述
这里有一点,neo4j社区版本没有用户认证和权限控制。。。有点诡异。

3. Cypher和Gremlin比较

这里需要提前说明一些概念,然后才可以介绍这cypher,gremlin以及网上尝尝一起比较的SPARQL三者的区别。

学过数据结构的应该都知道,对于不同的数据存储/描述方式,会采用不同的算法进行排序。
所以这里想要知道知识图谱查询语言,先要了解知识图谱的存储/表示方式

以下内容摘自:

3.1 知识图谱数据模型

从数据模型角度来看,知识图谱本质上是一种图数据。不同领域的知识图谱均需遵循相应的数据模型。知识图谱数据模型的数学基础是图论

其实知识图谱常见的表示方法/数据模型, 主要是RDF和属性图。在知识图谱数据模型上,需要借助特定的查询语言进行查询操作。

  • RDF图上的查询语言是SPARQL语言
  • 属性图上的查询语言使用的是CypherGremlin

知识图谱领域形成了

  • 负责存储RDF图(RDF graph)数据的三元组库(Triple Store)
  • 管理属性图(Property Graph)的图数据库(Graph Database)

RDF图

RDF是W3C制定的在语义万维网上表示和交换机器都可理解信息的标准数据模型。

在 RDF 三元组集合中,每个 Web 资源具有一个 HTTP URI 作为其唯一的 id;
一个 RDF图定义为三元组(s, p, o)的有限集合;
每个三元组代表一个陈述句,其中s是主语,p是谓语,o是宾语;
(s, p, o)表示资源s与资源o之间具有联系p,或表示资源s具有属性p且其 取值为o。
实际上,RDF三元组集合即为图中的有向边集合。

在这里插入图片描述

  • RDF三元组集合即为RDF图中的有向边集合
  • RDF图对于节点和边上的属性没有内置的支持
  • 节点属性可以用三元组表示,即上图中的矩形

属性图

属性图可以说是目前被图数据库业界采纳最广的一种图数据模型。属性图由节点集和边集组成,且满足如下性质:

  1. 每个节点具有唯一的id;
  2. 每个节点具有若干条出边;
  3. 每个节点具有若干条入边;
  4. 每个节点具有一组属性,每个属性是一个键值对;
  5. 每条边具有唯一的id;
  6. 每条边具有一个头节点;
  7. 每条边具有一个尾节点;
  8. 每条边具有一个标签,表示联系;
  9. 每条边具有一组属性,每个属性是一个键值对。

属性图如下所示:
在这里插入图片描述
根据不同的数据模型,有以下存储知识图谱的图数据库

  • 面向 RDF 的三元组数据库:主要的 RDF 三元组库包括:商用的 Virtuoso、AllegroGraph、GraphDB和BlazeGraph,开源系统Jena、RDF4J、 RDF-3X和gStore。
    以三元组进行存储的,jena是比较常见的
  • 原生图数据库:主要包括开源的Neo4j、Nebula(国内自研)、JanusGraph和商用的OrientDB等。
    Neo4j最常听说,Nebula是国内自研的!

以下内容摘自:

3.2 知识图谱查询语言

  • RDF图上的查询语言是SPARQL
  • 属性图上的查询语言常用的有Cypher和Gremlin
  • 知识图谱查询语言可分为声明式Declarative导航式Navigational两类。

SPARQL
是W3C制定的RDF图数据的标准查询语言。从语法上借鉴了SQL,属于声明式语言。Jena就属于RDF三元组图数据库,使用的就是SPARQL。

例如下面的查询:

查询张三认识的其他程序员

PREFIX ex:<http://www.example.com/>
SELECT ?p
WHERE {ex:zhangsan ex:knows ?p .}

! 输出
ex:lisi
ex:wangwu

Cypher

  • 最初是图数据库Neo4j中实现的属性图数据查询语言。与SPARQL一样,Cypher也是一种声明式语言

声明式语言

  • 即用户只需要声明"查什么",而无需关心"怎么查",就好像打车只用跟师傅说去哪,怎么走就是司机的任务,你不用管关心。
  • 这类语言的优点是:便于用户学习掌握,同时给予数据库进行查询优化的空间。
  • 缺点是不能满足高级用户导航查询的要求,数据库规划的查询执行计划有可能不是最优方案

使用示例:

! 查询图中所有程序员节点
MATCH {p:程序员}
RETURN p

! 输出
{姓名=张三,年龄=29}
{姓名=李四,年龄=27}
{姓名=王五,年龄=32}
{姓名=赵六,年龄=35}

Gremlin

  • Apache TinkerPop图计算框架提供的属性图查询语言。
  • Apache TinkerPop被设计为访问图数据库的通用API接口,其作用类似于关系数据库上的JDBC接口
  • Gremlin的定位是图遍历语言,其执行机制就好比是一个人置身于图中沿着有向边,从一个节点到另一个节点进行导航式游走。这种执行方式决定了用户使用Gremlin需要指明具体的导航步骤,类似于自驾,需要知道明确的路线,所以Gremlin是一种过程式语言,需要明确怎么做
  • 这类语言的优点是,可以时刻知道自己在图中所处的位置,以及是如何到达该位置的
  • 缺点是,用户需要认识路

以下是代码示例(参考图查询语言——Gremlin):

g.V().has('code','AUS').out().value('name','age').order().by('age',desc)

第一步:g.V() 标明是对图库中的所有节点进行操作的
第二步:has(‘code’,‘AUS’) 获取包含属性code并且该属性的值为AUS的所有节点
第三步:out() 获取上个结果集中所有节点的出边对应的节点
第四步:value(‘name’,‘age’) 获取上个结果集中所有节点的name和age属性值
第五步:order().by(‘age’,desc) 对结果集根据age进行降序排序


4. 其他考虑

根据:【持续更新】知识图谱相关工具平台整理
在这里插入图片描述
尚未找到国内企业基于Neo4j构建和使用比较大型知识图谱的案例→这东西有一定的缺陷和不足,所以还是再继续调研调研。

一些评测文章:

在这里插入图片描述
在这里插入图片描述

调研一下,看了一下目前国内一些知识图谱公司都是用哪个图数据库

4.1 美团知识图谱——Nebula Graph

nebula graph排名有,虽然不是很高

4.2 腾讯TEG-AI平台部——JanusGraph

参考:万字详解:腾讯如何自研大规模知识图谱 Topbase

  • Topbase 知识图谱的存储是基于分布式图数据库 JanusGraph,选择 JanusGraph 的主要理由有:1)JanusGraph 完全开源,像 Neo4j 并非完全开源;2)JanusGraph 支持超大图,图规模可以根据集群大小调整;3)JanusGraph 支持超大规模并发事务和可操作图运算,能够毫秒级的响应在海量图数据上的复杂的遍历查询操作等。
  • Graph_Loader 模块主要是将上述数据生产流程得到的图谱数据转换为 JanusGraph 存储要求的格式,批量的将图谱数据写入图数据库存储服务中,以及相关索引建立。
  • 图数据库存储服务:JanusGraph数据存储服务可以选用 ScyllaDb、HBase 等作为底层存储,topbase 选用的是 ScyllaDb。Graph_loader 会每天定时的将数据更新到图数据库存储服务。
  • 图数据库索引:由于 JanusGraph 图数据库存储服务只支持一些简单查询,如:“刘德华的歌曲”,但是无法支持复杂查询,如多条件查询:“刘德华的 1999 年发表的粤语歌曲”。所以我们利用 Es 构建复杂查询的数据索引,graph_loader 除了批量写入数据到底层存储之外,还会建立基于复杂查询的索引。
  • 图数据库主服务:主服务通过 Gremlin 语句对图数据库的相关内容进行查询或者改写等操作

JanusGraph排名第7,还是可以的。

4.3 阿里知识图谱数据库——自研

自研的,没有一个个性化的名称,就是GDB,图数据库。。https://help.aliyun.com/document_detail/102799.html


4.4 字节跳动知识图谱数据库——自研

  • 自研的,叫ByteGraph,https://blog.csdn.net/ByteDanceTech/article/details/104509642/
  • 从解决一个最核心的抖音社交关系问题入手,逐渐演变为支持有向属性图数据模型、支持写入原子性、部分 Gremlin 图查询语言的通用图数据库系统,在公司所有产品体系落地,称之为 ByteGraph。
  • 里面有一句话,有点讽刺。。

    Tencent Plato 是基于 Gemini 思想的开源图计算系统,采用了 Gemini 的核心设计思路,但相比 Gemini 的开源版本有更加完善的工程实现,我们基于此,做了大量重构和二次开发,将其应用到生成环境中,这里分享下我们的实践。


4.5 明略科技——自研

图数据库NEST
明略科技HAO图谱:从数据到知识的应用实践


其他——ArangoDB

参考: Nebula 与 Neo4j、ArangoDB 等图数据库的 Benchmark

  • 在上述比较中,出现了ArangoDB,且性能非常好。
  • 此外,其在DB Engines中排名第三。
  • ArangoDB 是一个开源的多模态数据库,可用来存储文档,图等类型的数据。支持集群,具有良好的读写性能。
  • github地址(star:11.8k):https://github.com/arangodb/arangodb
  • 但是似乎没什么人用,据说是bug比较多,有内存泄漏,并发性不好。。

5. 结论

【知识图谱】知识图谱(一)—— 综述 这个博主的说法一致:
这里我比较推荐的是Neo4j和Nebula。
虽然博主是阿里的,但是很良心。

所以先试试水,两个都用用看咯,看个人感觉更喜欢哪个吧。


看了Nebula的知乎文章专栏,整理出,目前国内使用Nebula的厂商有:

越看越像广告,但是没必要吧。而且github上star数量看起来不错啊,19年出来,到现在才两年,很好了已经。。

猜你喜欢

转载自blog.csdn.net/Castlehe/article/details/121602870