# 一、基础概念
# 图数据库理论基础
图形数据库(Graph Database)的解释说明:
在计算机科学中,图数据库(英语:graph database,GDB)是一个使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。该系统的关键概念是图,它直接将存储中的数据项,与数据节点和节点间表示关系的边的集合相关联。这些关系允许直接将存储区中的数据链接在一起,并且在许多情况下,可以通过一个操作进行检索。图数据库将数据之间的关系作为优先级。查询图数据库中的关系很快,因为它们永久存储在数据库本身中。可以使用图数据库直观地显示关系,使其对于高度互连的数据非常有用。
** 图数据库是一种非关系型数据库,以解决现有关系数据库的局限性。** 图模型明确地列出了数据节点之间的依赖关系,而关系模型和其他 NoSQL 数据库模型则通过隐式连接来链接数据。图数据库从设计上,就是可以简单快速地检索难以在关系系统中建模的复杂层次结构的。图数据库与 20 世纪 70 年代的网络模型数据库相似,它们都表示一般的图,但是网络模型数据库在较低的抽象层次上运行,并且不能轻松遍历一系列边。
图数据库的底层存储机制可能各有不同。有些依赖于关系引擎并将图数据 “存储” 到表中(虽然表是一个逻辑元素,但是这种方法在图数据库、图数据库管理系统和实际存储数据的物理设备之间施加了另一层抽象)。另一些则使用键值存储或文件导向的数据库进行存储,使它们具有固有的 NoSQL 结构。大多数基于非关系存储引擎的图数据库还添加了标记或属性的概念,这些标记或属性本质上是具有指向另一个文档的指针的关系。这样就可以对数据元素进行分类,以便于集中检索。
从图数据库中检索数据需要 SQL 之外的查询语言,SQL 是为了处理关系系统中的数据而设计的,因此无法 “优雅地” 处理遍历图。截至 2017 年,没有一个像 SQL 那样通用的图查询语言,通常都是仅限与一个产品的。不过,已经有一些标准化的工作,使得 Gremlin、SPARQL 和 Cypher 成为了多供应商查询语言。除了具有查询语言接口外,还可以通过应用程序接口(API)访问一些图数据库。
图数据库与图计算引擎不同。图数据库是转换关系 OLTP 数据库的技术。而图计算引擎在 OLAP 中用于批量分析。由于主要技术公司在使用专有图数据库方面的成功以及开源图数据库的引入,图数据库在 2000 年代引起了相当大的关注。
# 主要组成
节点
图数据库数据存储的主要组成部分,由节点属性和节点标签组成
- 节点属性 描述节点特征和状态等,类似于关系型数据库的表属性,可以存在多个;
- 节点标签 一个节点可以有多个标签,标签有类似关系型数据库表名的概念;
关系
关系用于描述两个节点的关系,有方向,所以一般包含起始属性 start 和结束属性 end
关系属性 属性的一些相关描述信息
关系标签 用于标注关系的类型
# 为什么使用图数据库
与传统关系型数据库相比,图数据库有以下优势:
由于存储了节点和节点之间的关系,解决常规数据库对多层查询效率低下的问题;
可以很自然的表达现实世界中的实体及其关联关系(对应图的顶点及边);
灵活的数据模型可以适应不断变化的业务需求;
灵活的图查询语言,轻松实现复杂关系网络的分析;
关系型数据库在数据规模庞大时很难做多层关联关系分析(Join 操作往往消耗过长时间而失败),图数据库则天然把关联数据连接在一起,无需耗时耗内存的 Join 操作,可以保持常数级时间复杂度。
使用图(或者网)的方式来表达现实世界的关系很直接、自然,易于建模。比如某人喜欢看某电影,就可以建立一条边连接这个人和这部电影,这条边就叫做 “喜欢” 边,同时这个人还可以有其它边,比如 “朋友” 边、“同学” 边等,同样这个电影也可以有其它边,比如 “导演” 边、“主演” 边等,这样就构建了自然的关系网。
图数据库可以很高效的插入大量数据。图数据库面向的应用领域数据量可能都比较大,比如知识图谱、社交关系、风控关系等,总数据量级别一般在亿或十亿以上,有的甚至达到百亿边。mysql 不做分表分库的情况下插入百万数据基本就慢到不行,图数据库基本能胜任亿级以上的数据,比如 neo4j、titan (janus)、hugegraph 等图数据库,持续插入十亿级的数据基本还能保持在一个较高的速度。
图数据库可以很高效的查询关联数据。传统关系型数据库不擅长做关联查询,特别是多层关联(比如查我的好友的好友有哪些人),因为一般来说都需要做表连接,表连接是一个很昂贵的操作,涉及到大量的 IO 操作及内存消耗。
图数据库对关联查询一般都进行针对性的优化,比如存储模型上、数据结构、查询算法等,防止局部数据的查询引发全部数据的读取。图数据库提供了针对图检索的查询语言,比如 Gremlin、Cypher 等图数据库语言。图查询语言大大方便了关联分析业务的持续开发,传统方案在需求变更时往往要修改数据存储模型、修改复杂的查询脚本,图数据库已经把业务表达抽象好了,比如上面的 2 层好友查询,Gremlin 实现为 g.V (me).out ('friend').out ('friend'),如果需要改为 2 层同学查询,那调整一下把好友换为同学即可 g.V (me).out ('classmate').out ('classmate')。
图数据库提供了专业的分析算法、工具。比如 ShortestPath、PageRank、PersonalRank、Louvain 等等,不少图数据库还提供了数据批量导入工具,提供了可视化的图显示界面,使得数据的分析结果更加直观展示出来。
# 图数据库的适用领域
# 社会学研究
很早以前,人们就已经认知到人类相互作用的方式其实很容易通过网络方式来描述。每 天人与人打交道,每天都在互相影响,每天都在交换想法。这些相互作用会通过他们所处的 社会环境产生连锁效应。将这些相互作用用图来进行建模,能更好地理解全球人口结构、政 治活动,以及特定群体对特定产品的商业价值等。随着在线社交网络的出现,这种以图为基 础的社会认知方法已经有了一个全新的方向。像 Google、Facebook、Twitter、LinkedIn 等许 多公司都已经做出了非常实际的努力,即基于图的应用系统,这些系统以客户或用户为目 标,并从根本上改变了我们的日常生活。
# 生物学研究
常用的营销口号:图无处不在。这实际上是用一种非常真实而有趣的方式来刻画现实世 界。同样,在生物学领域,研究人员很早就知道,生物成分(蛋白质、分子、基因等)以及 它们的相互作用可以用图来精确建模和描述,这样将带来诸多现实好处。在代谢途径中 (metabolic pathways),图有助于了解人体不同部位的 相互作用。在宏蛋白质组学(metaproteomics,从自然环境中提取蛋白质样本的研究)中,研 究人员分析了不同种类蛋白质之间是如何相互作用的,以利于更好地控制化合或生物过程。
# 计算机科学研究
早期的一些计算机是用图来设计的。图计算引擎早在 19 世纪晚期就用于解决铁路调度问 题,自那以后,图在计算机科学中得到了广泛使用,现今遍及芯片设计、网络管理、推荐系 统、UML 建模、算法中生成和依赖分析等。
还有一个有趣的案例是采用路径发现算法,软硬件工程师可以不间断地分析系统设计中 的变化对系统其他部分带来的影响。如果源代码的一部分做了更改,例如,一个特定对象 (object)被重命名,依赖分析算法可以轻松地遍历整个系统图,以找出其他受影响的类 (class)。
# 流量问题
流量问题(flow problems),也称为最大流问题(maximum flow problems),是图论的 又一个非常有趣的应用领域。事实上,从大的方面来讲它是一个优化问题,试图在整个流网 络中找到最佳路径。流网络图中,节点(顶点)通过关系(边)相互连接,关系(边)代表 特定容量。例如,在电信网络、天然气网络、航空网络、包裹递送网络等诸多领域案例中, 通常在图模型的基础上结合复杂的算法。
# 路径问题
比如十八世纪欧拉解决的哥尼斯堡七桥问题,实际上是一个路径规划或寻径问题 (route planning/pathfinding problem)。今天,许多图应用程序充分利用图及其算法的非凡能 力,而不再是通过尝试或错误排查来计算出网络上两个节点之间的最优路径。
# 网页搜索
何一本涉及图或图论的图书,哪怕是最优秀的,都无可避免地要提到世上最强大、使 用最广泛的图算法 ——PageRank。PageRank 最初是一个图算法,是 1996 年由谷歌创始人拉 里・佩奇在斯坦福大学发明的,用以获得更好的网页搜索结果。对于那些还记得互联网早期 的搜索工具(例如 Lycos、AltaVista 等)的人们而言,它给终端用户带来了一个真正革命性 的网页搜索方式。
# 常见的图数据库
数据库名称 | Neo4J | titan | arangodb | crientdb | gun |
---|---|---|---|---|---|
语言 | JAVA | JAVA | C++ | JAVA | JS |
更新活跃度 | 高 | 近一年无更新 | 高 | 比较新 | 比较新 |
个人使用 | GPLv3 | Apache-2.0 | Apache-2.0 | Apache-2.0 | Zlib/MIT/Apache-2.0 |
商业使用 | 开源版本 GPLv3<br /> 企业版收费 | 同上 | 同上 | 同上 | 同上 |
查询语言 | Cypher | Gremlin | AQL | SQL | JS |