在Neo4j中找到bfs树

时间:2016-05-21 11:28:46

标签: neo4j cypher breadth-first-search

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

Merge = "foo 1" & "1234"

查询从源返回lenght< = 5的所有路径,但destNode不会是不同的。所以结果可以有多条路径到同一个dest节点。

使用以下查询:

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

查询仅返回destNodes而不是路径。如果我将return子句更改为 Match c=(sourceNode:Person {name:'Demi Moore'})-[relation*1..5]-(destNode) return distinct destnode limit 10 ,则查询也将返回每个路径找到的行! 我知道我可以获得从源到每个不同的destnode的最短路径如果找到但它有性能问题。 结果可以通过单个bfs找到,我认为任何图形数据库都默认使用该工具,我错了吗?

2 个答案:

答案 0 :(得分:0)

我认为你需要:

  • 可选添加关系方向;
  • 按路径长度排序;
  • 按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

答案 1 :(得分:0)

这样做你想要的吗?

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查找其中一个最短路径< / em>到每个destNode