我是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找到,我认为任何图形数据库都默认使用该工具,我错了吗?
答案 0 :(得分:0)
我认为你需要:
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
。