【问题标题】:How is data stored in a graph database? [duplicate]数据如何存储在图形数据库中? [复制]
【发布时间】:2018-02-14 09:53:05
【问题描述】:

我刚刚了解了图形数据库,而不是关系数据库 (RDBMS)。我浏览了 neo4j 网站上的一些资源,并阅读了 Oreilly Book on Graph Databases 中的一些章节。但是我无法理解图形数据库如何实际存储其数据?

如果我必须在 RDBMS 中存储图形,我将为顶点和节点创建不同的列表。图数据库有何不同?我真的很难在脑海中想象如何,例如neo4j 以不同的方式将其数据(节点和顶点)存储并链接到传统的 RDBMS。

如果有人能帮助我理解和了解图形数据库的内部工作原理,我将不胜感激。如果您不太了解我的问题,我很乐意更具体地解释一下。

【问题讨论】:

  • 我不知道 neo4j,但我使用过软件图像和图形。图形和线工作存储为向量。当我们在方格纸上绘制形状时,回想一下基本的代数和几何。你知道什么?图上的点。这就是存储的内容。构成图的向量的点。

标签: database graph neo4j cypher graph-databases


【解决方案1】:

您的答案是O’Reilly’s Graph Databases 关于图形数据库内部的书的第 6 章。本章介绍 Neo4j 内部的工作原理,包括 Native Graph Storage 的工作原理。

Neo4j 将节点、关系、标签和属性存储在单独的文件中。

节点存储在文件neostore.nodestore.db 中。每个新创建的节点都有一个固定大小的文件。对于添加到数据库的每个节点,此文件增加 9 个字节。这样可以很容易地在文件的 900 字节中找到一个 id 为 100 的节点(每个节点 id 100 x 9 字节 = 900 字节)。节点记录有指向第一个节点关系、第一个节点属性和节点标签的指针。

关系存储在文件neotore.relationshipstore.db 中。这也是一个固定大小的文件。每个关系都有指向开始和结束节点的指针、关系类型(在neostore.relationshiptypestore.db 文件中)、每个开始和结束节点的下一个和上一个关系记录,以及一个指示关系是否是关系链中的第一个的标志.

节点和关系的属性存储在文件neostore.propertystore.db 中。每个属性记录都有一个指向下一个属性的指针,最多可以保存 4 个属性。每个属性都有一个指向属性名称(neostore.propertystore.db.index 文件)、属性类型的指针。对于大字符串 (neostore.propertystore.db.strings) 和数组 (neostore.propertystore.db.arrays file),属性值可以是内联值或指向动态文件的指针。

【讨论】:

  • 非常感谢,但我仍然对查找效率如此之高感到困惑...当您想知道特定节点的所有关系时,您是否还必须搜索整个关系列表以找到所有关系?
  • @Maclaren 部分。例如,在此查询中:match (n:Node)-[r]->() return type(r) Neo4j 将选择 n 作为起点来遍历图形。为了得到这个起点,Neo4j 将使用为:Node 标签隐式创建的索引。然后扩展到 r 关系 Neo4j 将仅迭代连接到 r 起点的关系,并且不会遍历整个图中的所有关系
  • @Maclaren 同样,由于index-free adjacency and native graph processing engine,在处理高度连接的数据时应该认真考虑 Neo4j。 Neo4j 没有JOINS。为了横断图,Neo4j 以非常低的成本跟踪连接到每个节点的关系,而不是像在传统的关系数据库中那样做 JOINS 和 calc 笛卡尔积。
  • 基本上这是一种权衡。在关系数据库中执行大量键查找可能会变得非常昂贵。 (数以万计。)这使得键查找与跟踪指针一样便宜,但代价是对大量数据进行索引扫描非常非常昂贵。
猜你喜欢
  • 2014-11-11
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2013-09-17
相关资源
最近更新 更多