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

Neo4j如何使用关系ID'遍历图形;nodestore文件中的s,neo4j,graph-databases,datamodel,Neo4j,Graph Databases,Datamodel,有件事把我弄糊涂了我想知道你能不能帮我一下 根据Neo4j图形数据库手册,节点存储文件中有4个字节包含节点关系的ID。如果节点有100个关系(所有关系都是节点在关系链中的第一个关系),neo4j如何理解选择哪个id???例如,我编写了Match(a:user{Name:'a')-[r:Has skill]->(b:skill) 假设用户节点有很多关系,但我们对[has_skill]关系感兴趣neo4j如何理解与此关系相关的id?您所说的关系链与“路径”不同。一个节点没有多个关系,而该关系是链中的

有件事把我弄糊涂了我想知道你能不能帮我一下 根据Neo4j图形数据库手册,节点存储文件中有4个字节包含节点关系的ID。如果节点有100个关系(所有关系都是节点在关系链中的第一个关系),neo4j如何理解选择哪个id???例如,我编写了Match(a:user{Name:'a')-[r:Has skill]->(b:skill)


假设用户节点有很多关系,但我们对[has_skill]关系感兴趣neo4j如何理解与此关系相关的id?

您所说的关系链与“路径”不同。一个节点没有多个关系,而该关系是链中的第一个关系

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

  • 跟随从节点记录到包含该节点所有关系的链表的第一个元素的指针(第一个元素是“链中的第一个关系”)
  • 对于链接列表的每个元素:
    • 检查是否与搜索到的关系的条件匹配(这里,它的类型应该是
      has\u SKILL
    • 如果该关系与条件匹配,则保留该关系以备将来使用;如果不匹配,则丢弃该关系
    • 按照指针指向关系链表(在“链”中)中的下一个元素;如果最后一个元素已经存在,则退出循环
  • 对于通过扫描链表检索到的每个关系,跟随它们到它们指向的节点,并继续评估模式
  • 实际算法可能略有不同;例如,它可能使用深度优先遍历而不是宽度优先遍历,或者可能以不同的方式进行优化,但最终结果是相同的


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

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



    最后,@InverseFalcon指出,对于密集相关的节点,这将以不同的方式实现,因为它们估计有50+个以上的关系。在这一点上,使用了稍微不同的结构,按类型和方向分组,因此搜索成本降低。

    请注意,对于密集节点,这一方法的效果稍有不同(通常为50+个关系),有一个不同的结构,它按类型和方向对节点进行分组,以减少搜索所有节点以找到相关关系的成本。