【问题标题】:How Neo4j stores data internally?Neo4j 如何在内部存储数据?
【发布时间】:2014-08-13 12:03:26
【问题描述】:

我的问题是从开发人员的角度来看的(不是特别尊重用户),可能有点混乱。 我想知道节点和关系的结构是如何在逻辑上存储在数据库中的。就像,当我说我有 bla bla 信息时。在哪里? - 那么答案是,在 BOOK 中,可以是网格形式,也可以是页面上的线条形式。在 RDBMS 的情况下,数据以网格/表格格式存储。但我无法理解图形是如何存储在 Neo4j/graph 数据库中的。 我正在使用 neo4j 客户端 2.1.2。

【问题讨论】:

标签: data-structures neo4j


【解决方案1】:

http://www.slideshare.net/thobe/an-overview-of-neo4j-internals 已经过时了,但它可以让您很好地了解 Neo4j 的逻辑表示。

一个节点引用:

  • 它的第一个标签(我的猜测是标签存储为单链表)
  • 它的第一个属性(属性被组织成一个单链表)
  • 它的开始/结束关系

关系被组织为双向链表。 关系指向:

  • 它的第一个属性(与节点相同)
  • 其起始节点的前继和后继关系
  • 其结束节点的前继关系和后继关系

由于这种链式结构,遍历的概念(即查询数据的方式)很容易出现。这就是为什么像 Neo4j 这样的图数据库擅长遍历图结构数据的原因。

我的粗略猜测也是,因为 Neo4j 版本 2.1(和 its newly introduced dense node management),节点的关系按类型隔离。这样,如果一个节点 N 是例如 5 个 A 类型关系和 500 万个 B 类型关系的起始节点,则遍历 N 的 A 类型关系仍然是 O(n=5)。

【讨论】:

  • 我很难理解如何确定其起始节点的前任和后继关系?一个节点可以有许多传入边或许多传出边,那么哪一个是前一个和下一个?
  • 可以假设关系按插入顺序存储(并且很可能按类型分组,因此一种关系类型的高基数不会影响低基数类型的查找时间)。
  • 我没有看到双向链表结构,我用谷歌搜索了一遍我仍然看不到开始和结束节点的 prev 和 next 是如何填充和更新的?你能解释一下吗?它看起来不像邻接列表
  • 恐怕没有记录。唯一的选择是阅读源代码,因为这是 Neo4j 的“内功”。
  • 是的,有什么具体的文件吗?导航需要很长时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多