首页 文章

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

提问于
浏览
0

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

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

1 回答

  • 0

    你所谈论的关系链与“路径”不同 . 节点没有多个链接中的第一个关系 .

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

    • 跟随指针从节点记录到链接列表的第一个元素,该元素包含该节点的所有关系(第一个元素是"first relationship in the chain") .

    • 对于链表的每个元素:

    • 检查是否符合搜索关系的条件(此处,它的类型为 HAS_SKILL ) .

    • 如果它符合标准,则保留该关系以供将来使用;如果不匹配,则将其丢弃 .

    • 按照指向关系链表中的下一个元素(在"chain"中);如果已经在最后一个元素,退出循环 .

    • 对于通过扫描链接列表检索的每个关系,将它们跟随到它们指向的节点并继续评估模式 .

    实际算法可能略有不同;例如它可以使用深度优先遍历而不是广度优先,或者可以以不同的方式进行优化,但最终结果是相同的 .


    来自Graph Databases,第2版,Ian Robinson,Jim Webber和Emil Eifrem,第154页:

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


    最后,@ InverseFalcon指出,对于密集相关的节点,这将通过它们在大约50个关系处的估计来实现 . 此时,使用稍微不同的结构,其按类型和方向分组,因此降低了搜索成本 .

相关问题