你不知的图数据库-Neo4j

你不知的图数据库-Neo4j

一、图数据库背景

相信大家在日常工作或者学习中多多少少都接触过数据库,但是一部分人可能不了解“图数据”,不清楚图数据库和传统数据库的差别在哪里。今天就让我们,从了解图数据开始并且以neo4j作为切入点深入学习。

该图来自“Oreilly Graph Databases“一书,主要对国外各种图数据库的通过”原生图处理”(Native Graph Processing)和”原生图存储”(Native Graph Storage)进行了划分。由于该书是一本国外的书籍,所以主要对比方为国外图数据库,实际上现阶段国内很多公司都已加入了国产研发图数据库的研发,当中可以看到不少知名公司的身影。

二、Neo4j

以下为Neo4j的体系结构,我们先从其整体结构上对neo4有一个初版的认识。在对其各个模块进行了解,本次主要针对其底部入手即磁盘,围绕“图处理”和“图存储”进行讲解。

在背景内容中我们提到了原生(native)一词,这个需要从两个部分进行说明原生图处理和原生图存储,这个模块可以说是图数据库核心的模块。并且这也是很多图数据库产商标榜的重要指标。那么到底什么是原生数据库呢? 那么他们为什么会说自己是原生数据库呢?它们和非原生数据库有什么区别的?

2.1图处理

在数据库引起的内存中有无数的编码和表示方式,对与不同的引擎体系结构,如果使用了免索引邻接(Index Free Adjacency)属性,那么我们就认为他具有原生处理能力。

问:那么什么是免索引邻接结构呢?

答:免索引邻接即每个节点都会维护其对相邻节点的引用。因此每个节点都有其相邻节点的微索引,这个比全局索引的代价小很多。

非原生数据库引擎使用的(全局)索引各个节点。每个遍历都需要添加一个中间层,从而导致了大量的计算成本浪费,因此才很多产商认为免索引邻接是十分重要的,因为它提供了快速、高效的图遍历

以下为案例说明论证上述观点:

下面每个人的朋友关系,在传统数据库中我们一般存储如下。

当我们需要Alice的朋友时,传统数据库其通过索引查找的时间为O(logn),索引的复杂度为O(logn),大家可以另外自行查看B+Tree的相关知识如果在进行查找与Alice交朋友的人其代价为O(m logn)。

上图Neo4j适合用联系而非索引实现快速遍历,其关系都通过双向链表相互指向。我们进行上述从同样的任务找Alice的朋友和找与Alice交朋友的人,其复杂度都为O(1),为什么复杂度O(1)可以查看节点存储模块。

2.2图存储

一些数据库使用原生图存储,这类存储是被优化过的,专门为了存储和管理图所设计的。但是并不是所有的图数据库都是原生图存储的,也有一些图数据库将图数据序列化之后,保持在关系性数据库或者面向对象数据库或者通用数据库中。Titan图数据库,现在叫JanusGraph 这个是一个例子,它的存储是基于第三方的可以将其放入到Hbase当中。

问:那么原生图存储是怎么样的呢?

答:下面我们以neo4j为例进行讲解。

Neo4j这款图数据库,应该是普及度较为广的图数据库。它有很多的优点,其中个人觉得不得不说的优点就是它的透明,因为它将其代码进行开源,这对整个图数据库行业的来说贡献是非常巨大的。

      

上图是Neo4j的物理存储形式,下面我们将针对上图详细展开描述。

Neo4j将图数据存储在若干个不同的存储文件中。每个存储文件包含图的图特定部分的数据(比如:节点、联系、标签、属性都是各自独立的)。这样不同文件就用不同的存储职责,特别是图结构和属性数据的分离,即用户视角看到的属性和关联在图中显示的是一起的,实际底层是存储在不同文件中的,但是每个文件存储都是有相关联的。上图Node1和Node2都包含指向该节点第一个属性的指针和链接关系的第一个指针。如果需要其属性就可以通过第一个指针遍历得到其相关属性信息。需要要找到一个节点的联系,我们从指向第一个联系的Links关系的指针开始,顺着特定节点的关系的通过双向链表寻找。一旦找到我们想要的关系,我们再通过单向链表读取关系的属性。

下面针对neo4j的点边存储形式具体展开。

1.节点存储

节点存储文件用来存储节点的记录,用户在图中创建的节点最终会存储在节点文件中,其文件名为“neostore.nodestore.db”,节点存储去的是固定大小记录村的,每个记录长度为9字节。通过Id大小可以快速查找存储文件中的点。假设我们有一个Id为100的节点,通过一个节点9字节,我们可以快速跳到第900(9*100)字节读取。其复杂度只需要O(1)。

 一个节点记录的第一个节点“是否在使用”标志位。它告诉数据库该记录目前被用于存储节点,还是可以被回收(Neo4j的.id文件会对未使用记录进行跟踪)。nextRelId的4字节表示关联到该节点的第一个联系,随后4字节表示该节点的第一个属性Id。Lables的5个字节指向该节点的标签存储(如果标签少的话可以直接用5个字节表示)。最后一个字节extra是标志保留位。用于标识该点是是否为紧密连接的点(densely connected nodes),该位置目前存在一定的存储浪费。

2.关系存储

       相应的,关系被存储关系文件中,文件名为“store.relationshipstore.db”。和节点存储一样,关系的记录也一样固定大小的。每个关系记录(即上述长长的一条) 包含关系的起始节点id和终止节点id,一个指向关系类型的指针,起始节点的上一个关系和下一个关系,以及指示当前位于是关系链(relationship chain)中的第一个。

三、Neo4j结构的优缺点

3.1 优点

1.其整体的存储思想,符合图的关联存储特性

传统的数据库常围绕“实体”这以核心概念,在设计时对关联的意识并不强,所以在做复杂关联操作时往往无法胜任。而Neo4j这里提出的存储,其核心时关联,所以在复杂关联时速度会比传统的快。

2.各个内容的分模块存储

将节点、联系、属性分别存储。节点存储文件和关系存储文件只关注图的结构,而不是属性数据,并且这两个文件使用固定大小进行记录,从而可以跟进Id进行快速的其在文件中的位置减少不必要的搜索和IO开销。

3.neo4j的免索引邻接

可以快速定位并且进行邻居,即减少了索引的IO抢占,并且可以实现O(1)复杂度的快速定位。

当然Neo4j的优点还有很多,远不止我所说的三点,在此就不一一讲述了。感兴趣的可以去neo4j官网自行阅读, 地址: Graph Data Platform | Graph Database Management System | Neo4j

3.2 缺点(个人见解,不一定准确,仅供参考)

任何事物我们都应该带着辩证的眼光去看待它,应该多去想想其背后的逻辑。

比如neo存储结构的设计上:

  1. neo4采用链表的形式存储真的好吗,性能能是最优的吗?
  2. 属性的存储是否存在一定的空间浪费呢?

想必大家在使用neo4j数据量达到一定的规模,在实时计算要求较高的情况下,其表现就有点拉跨了。

四、总结

首先Neo4j可以说是一款很棒的图数据库。其产品设计对无接触过图数据库的使用者来说还是挺友好的。其对开源所做的贡献是非常巨大并且它的生态相对而言也是非常完善的。所以如果你想学习图数据库或者深入研究其背后实现逻辑,neo4j是非常好的练手工具。

国外图数据库在蓬勃发展的同时,其实国内的数据库也在飞速发展并且很多产品也的做的非常nice,值得我们去学习。最后希望上述内容对读者有所帮助, 如果让你收获一定的知识或者对图数据库有进一步的了解,那么本人写作就变的有意义了。

文章最后本人想知道你们现在用的图数据库是Neo4j吗?

A:是 B:否 C:未使用。

大家私信或者评论都可以,先在此谢谢大家。

五、参考引用

  1. “Graph Databases” Specs By Ian Robinson, Jim Webber and Emil Eifrem By O'Reilly Media

地址: https://neo4j.com/graph-databases-book

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值