图形数据库如何存储数据?

7
我刚学习了关于图形数据库和关系型数据库(RDBMS)的区别。我看了一些neo4j网站上的资源,读了一些有关图形数据库的Oreilly书籍章节。但是我不知道图形数据库实际上是如何存储数据的?
如果我必须在RDBMS中存储图形,我会为节点和边创建不同的列表。图形数据库有什么不同?我真的很难想象例如neo4j是如何将其数据(节点和边)与传统的RDBMS存储和链接方式不同。
如果有人可以帮助我理解和可视化图形数据库的内部工作原理,我将不胜感激。如果您不太明白我的问题,我很乐意进一步解释。

我不了解neo4j,但我曾经处理过软件图像和图形。图表和线条以向量形式存储。回想一下基本的代数和几何学,当我们在图纸上绘制形状时,你知道什么?就是图上的点。这就是所存储的内容,构成图表的向量的点。 - LAS
1个回答

11
你的答案是O'Reilly's Graph Databases书中关于图数据库内部的第6章。本章描述了Neo4j内部的工作原理,包括本机图存储的工作原理。
Neo4j将节点、关系、标签和属性存储在不同的文件中。
节点存储在文件neostore.nodestore.db中。每个新创建的节点都有固定的大小。对于添加到数据库中的每个节点,该文件增加9个字节。这样,可以在文件的900字节(id 100 x 9字节/节点= 900字节)处轻松找到ID为100的节点。节点记录具有指向第一个节点关系、第一个节点属性和节点标签的指针。
关系存储在文件neotore.relationshipstore.db中。这也是一个固定大小的文件。每个关系都有指向起始节点和结束节点、关系类型(在文件neostore.relationshiptypestore.db中)、起始节点和结束节点的下一个和前一个关系记录的指针以及指示关系是否为关系链中第一个关系的标志。
节点和关系的属性存储在文件neostore.propertystore.db中。每个属性记录都有一个指向下一个属性的指针,并且最多可以容纳4个属性。每个属性都有一个指向属性名称(文件neostore.propertystore.db.index)、属性类型的指针。属性值可以是内联值,也可以是指向动态文件的指针,用于存储大字符串(文件neostore.propertystore.db.strings)和数组(文件neostore.propertystore.db.arrays)。请保留{{和}}占位符。

3
非常感谢您,但我仍然不明白为什么这种查找方式更加高效。当您想要了解特定节点的所有关系时,难道不还是需要搜索整个关系列表才能找到它们吗? - MST
1
@Maclaren 部分地。例如,在此查询中:match (n:Node)-[r]->() return type(r) Neo4j将选择n作为遍历图形的起点。要获取此起始点,Neo4j将使用隐式为:Node标签创建的索引。然后,为了扩展到r关系,Neo4j仅会迭代连接到r起点的关系,而不是整个图中的所有关系 - Bruno Peres
2
@Maclaren 此外,当处理高度连接的数据时,应认真考虑使用 Neo4j,因为它具有无索引邻接和本地图处理引擎。Neo4j没有JOINS。为了遍历图形,Neo4j会跟随连接到每个节点的关系,以非常低的成本进行操作,而不是像传统关系数据库中那样执行JOINS和计算笛卡尔积。 - Bruno Peres
基本上这是一个权衡。在关系型数据库中执行大量的键查找可能会变得非常昂贵。(大量指数以万计。)这使得键查找像跟随指针一样便宜,但代价是对大量数据进行索引扫描真的非常昂贵。 - Jonathan Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接