【问题标题】:Find bfs tree in Neo4j在 Neo4j 中查找 bfs 树
【发布时间】:2016-05-21 11:28:45
【问题描述】:

我是 Neo4j 的新手。我有一个简单的图表,我希望所有节点几乎接近(例如距离小于 5)到单个节点。我也想要从源到它们的路径。 这可以通过来自源的单个 bfs 简单地完成。 使用以下密码查询:

    Match c=(sourceNode:Person {name:'Demi Moore'})-[relation*1..5]-(destNode)
    return c
    limit 10

查询从源返回长度

使用以下查询:

    Match c=(sourceNode:Person {name:'Demi Moore'})-[relation*1..5]-(destNode)
    return distinct destnode
    limit 10

查询只返回 destNodes 而不是路径。如果我将return 子句更改为return distinct destnode, c,查询也将在它找到的每个路径中返回一行! 我知道如果找到,我可以获得从源到每个不同目标节点的最短路径,但它有性能问题。 结果可以通过单个bfs找到,我认为任何图形数据库默认都有该工具,我错了吗?

【问题讨论】:

    标签: neo4j cypher breadth-first-search


    【解决方案1】:

    我认为你需要:

    • 可选添加关系方向;
    • 按路径长度排序;
    • 按destNode分组并收集路径;
    • 从 collect 中返回 destNode 和第一条路径。

    Match (sourceNode:Person {name:'Demi Moore'})
      With sourceNode
      Match path = (sourceNode) -[:relation*1..5]-> (destNode:Person)
        With destNode, path 
          Order By Length(path) ASC
    Return destNode, Head( Collect( path) ) As path
      Order By Length(path) ASC
    Limit 10
    

    【讨论】:

    • 这个查询不会导致它找到每个节点的所有路径吗?!
    • 不是全部,而是五步内到每个节点最短的一个。这不是你想要的吗?
    • 这就是我想要的,但我认为 Neo4j 应该找到从源到一个节点的所有路径,然后按长度对它们进行排序。不是吗?!
    • 此查询在五个步骤内找到所有节点和到它们的路径。然后在节点处分组(节点路径),并对路径长度进行升序排序。在每个节点旁边收集一组路径并返回第一个(即最短的一个)。并返回一对(主机、路径)。
    • 这比我认为的单个 bfs 重得多。它比单个 bfs 消耗更多的内存和 cpu。
    【解决方案2】:

    这是你想要的吗?

    MATCH p = (:Person {name:'Demi Moore'})-[*1..5]-(destNode)
    WITH destNode, COLLECT(p) AS paths
    RETURN destNode, REDUCE(s = paths[0], x IN paths[1..] | CASE WHEN LENGTH(x) < LENGTH(s) THEN x ELSE s END) AS path
    limit 10;
    

    它使用COLLECT 聚合同一个destNode 的所有路径,然后使用REDUCE 找到其中一个到每个@ 的最短路径 987654325@.

    【讨论】:

    • 这个查询不会导致它找到每个节点的所有路径吗?!
    • 它返回距离Demi Moore 节点不超过5 的所有节点,其中其中一个 是到每个此类节点的最短路径。
    • 是的,但在 neo4j 的情况下,它会查找从源节点到节点的所有路径,收集路径,然后找到最短的路径。我认为这比单个 bfs 慢得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多