Neo4j如何使用nodestore文件中的关系ID遍历图形

时间:2018-04-16 09:51:31

标签: neo4j graph-databases datamodel

有些东西让我困惑很多我想知道如果你能帮我这个请 根据Neo4j图数据库书,节点存储文件中有4个字节包含节点关系的ID。如果节点有100个关系(并且它们都是节点在关系链中的第一个关系)neo4j如何理解选择哪个id?例如我写了Match(a:user {Name:'a') - [r:Has-skill] - >(b:skill)

想象一下,用户节点有很多关系但我们对[has_skill]关系感兴趣neo4j如何理解与这种关系有关的id?

1 个答案:

答案 0 :(得分:0)

您所谈论的关系链与"路径"不同。一个节点没有多个链接中的第一个关系。

关系链是一个包含该节点关系的双向链表。鉴于Neo4J已经在模式中找到了第一个用户,它将执行以下步骤(或类似的东西):

  1. 按照指针从节点记录到链接列表的第一个元素,该元素包含所有节点的关系(第一个元素是"链中的第一个关系")。 / LI>
  2. 对于链表的每个元素:
    • 检查是否符合搜索关系的条件(此处,它的类型为HAS_SKILL)。
    • 如果符合标准,则保留该关系以供将来使用;如果不匹配,则将其丢弃。
    • 将指针指向关系链表中的下一个元素(在"链"中);如果已经在最后一个元素,退出循环。
  3. 对于通过扫描链接列表检索到的每个关系,请按照它们指向的节点进行操作,然后继续评估模式。
  4. 实际算法可能略有不同;例如它可以使用深度优先遍历而不是广度优先,或者可以以不同的方式进行优化,但最终结果是相同的。

    来自图形数据库,第2版,作者:Ian Robinson,Jim Webber和Emil Eifrem,第154页:

      

    要查找节点的关系,我们将该节点的关系指针指向其第一个关系(本例中为LIKES关系)。从这里开始,我们将遵循该特定节点的关系的双向链接列表(即,起始节点双向链表或结束节点双向链表),直到找到我们感兴趣的关系为止。 / p>

    最后,@ InverseFalcon指出,对于密集相关的节点,它将以不同的方式实现,估计大约有50多个关系。此时,使用略有不同的结构,按类型和方向分组,从而降低搜索成本。