【问题标题】:How does Neo4j Traverse a graph using relationship ID's in nodestore fileNeo4j 如何使用节点存储文件中的关系 ID 遍历图形
【发布时间】:2018-09-26 00:27:24
【问题描述】:

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

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

【问题讨论】:

    标签: neo4j graph-databases datamodel


    【解决方案1】:

    您所说的关系链与“路径”不同。一个节点在链中的第一个关系不能超过一个。

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

    1. 从节点记录中的指针指向包含该节点所有关系的链表的第一个元素(这个第一个元素是“链中的第一个关系”)。
    2. 对于链表的每个元素:
      • 检查是否与搜索到的关系的条件匹配(在这里,它的类型应该是HAS_SKILL)。
      • 如果确实符合条件,则保留该关系以供将来跟踪;如果不匹配,则丢弃。
      • 跟随指向关系链表中下一个元素的指针(在“链”中);如果已经在最后一个元素处,则退出循环。
    3. 对于通过扫描链表检索到的每个关系,跟随它们到它们指向的节点并继续评估模式。

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


    来自 Graph Databases, 2nd Edition,作者 Ian Robinson、Jim Webber 和 Emil Eifrem,第 154 页:

    要找到一个节点的关系,我们按照该节点的关系指针指向它的第一个关系(本例中的 LIKES 关系)。然后,我们从这里开始跟踪该特定节点的关系的双向链表(即,开始节点双向链表或结束节点双向链表),直到找到我们感兴趣的关系。


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

    【讨论】:

    • 请注意,这对于密集节点(通常是 50 多个关系)的工作方式略有不同,有一个不同的结构,它按类型和方向对节点进行分组,以减少必须搜索所有节点以找到相关关系。
    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多