Neo4j(3.5.14)互连节点的BFS / DFS故障

问题描述 投票:2回答:1

我有一个要解决的问题:找到所有处于一定权重的可到达节点的路径。已经从编程语言的角度解决了问题,但是现在我想通过调用neo4j以正确的方式进行操作。考虑以下节点连接:

 1-(2)--3
 | \    |
(3)(9) (1) 
 |   \  |
 2-(9)--4-(1)-5

如果格式不明确:

1->2 distance:3
1->3 distance:2
1->4 distance:9
3->4 distance:1
2->4 distance:9
4->5 distance:1

假设是,对于起点1,总权重= 5,我们可以到达每个节点:1-> 2(3)1-> 3-> 4-> 5(4)

我知道也可以通过搜索到db中每个节点的最短路径并找到所有权重小于5的最短路径来“手动”完成,但是,我认为bfs / dfs更适合此操作,因为对于大型数据集手动解决方案对于任何查询而言都将非常缓慢。所以我为bfs / dfs找到了以下解决方案:

Match(n:Place {name:"one"})
call algo.bfs.stream("Place", "Connection", "BOTH", id(n),
{maxCost:5, weightProperty:'distance'})
yield nodeIds
unwind nodeIds as nodeId
return algo.asNode(nodeId)

但是,结果只有节点1、2和3(可直接访问),我不太清楚,为什么会这样。如果我删除连接1-> 4和2-> 4,则结果符合预期。为什么algo.bfs / dfs在这种情况下不起作用?如果我使用maxCost 11搜索,则结果符合预期-所有节点。

neo4j cypher
1个回答
1
投票

[不确定,如果这是一个合适的解决方案,但是,我发现使用algo.bfs在neo4j中玩耍时,您可以为搜索指定maxDepth。如果为查询指定maxDepth:3,则将获得所需的结果。示例:

Match(n:Place {name:"one"})
call algo.bfs.stream("Place", "Connection", "BOTH", id(n),
{maxCost:5, weightProperty:'distance', maxDepth:3})
yield nodeIds
unwind nodeIds as nodeId
return algo.asNode(nodeId)
© www.soinside.com 2019 - 2024. All rights reserved.