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

时间:2019-12-29 23:22:29

标签: neo4j cypher

我有一个要解决的问题:找到所有在一定重量范围内的可达节点路径。 已经从编程语言的角度解决了问题,但是现在我想 通过调用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搜索,则结果符合预期-所有节点。

2 个答案:

答案 0 :(得分:1)

我在Neo4j上工作,我们让分析团队的一些人员来了一下。我们已经确认这是一个同时影响dfs和bfs实现的错误,我们将在下一个algos修补程序版本中进行修复。

答案 1 :(得分:0)

在代码中执行bfs过程似乎存在问题。 我写了一个查询,在这里也能正常工作

Match p=(n:Place {name:'one'})-[r:connection*]-(place:Place) WHERE n<>place WITH place,[n in nodes(p)|n.name] as list ,REDUCE (sm = 0, k in r| sm+k.distance) as sm ORDER BY sm WHERE sm <=5 RETURN place.name as endNode, COLLECT(list)[0] as path,COLLECT(sm)[0] as weight

相关问题