具有最高聚合关系属性的 Neo4j 最短路径
Neo4j shortestPath with highest aggregated relationship propertie
我想找到两个节点之间的最短路径。路径本身不是问题...更大的问题是,我想要 return 路径,路径上的聚合关系 属性 最高。
为了更好地理解,这是我想要的:
这是我的查询
MATCH
(startNode:Person {id:"887111"}),
(endNode:Person {id:"789321"}),
paths = allShortestPaths((startNode)-[r:KNOWS *..20]-(endNode))
RETURN paths
在这个例子中,我想要从 Elissa (id: 887111) 到 Kasey (id: 789321) 的路径,其中关系的聚合计数是 MAX。
我也看过 'shortestPath',它只给了我一条路。另一种方法是调用 'dijkstra'-algo,这样我只会得到具有最低 'cost'(而不是最高)的路径。
所以在我的示例中,应该显示的唯一路径是 Elissa->Travon->Kasey
我认为,问题并没有那么复杂,但此刻我陷入了困境..
在此先致谢。
更新
调用建议的查询后
MATCH (startNode:Person {id:"789321"}), (endNode:Person {id:"887111"})
CALL apoc.algo.dijkstra(startNode, endNode, 'KNOWS', '_duration') YIELD path, weight
RETURN path, -weight AS weight
我的结果如下
[更新]
我提供 2 个答案,具体取决于您要执行的操作。
1。寻找总重量最大的路径
要找到总权重最大的路径,您可以将原始权重属性的否定提供给 Dijkstra 算法。生成的 "lowest" 总权重将是一个负值,当取反时,实际上将是最高的总权重(基于原始权重属性)。
有一个 APOC 程序 apoc.algo.dijkstra 实现了 Dijkstra 算法,但它不允许您使用指定权重的负值 属性。因此,要使用该过程,您需要向每个具有适当负值的 KNOWS
关系添加一个新的 属性。例如,将负权重添加到现有关系中(假设 w
是原始权重 属性,而 _w
将包含相应的负值):
MATCH ()-[k:KNOWS]->()
SET k._w = -k.w;
一旦你有负权重,下面应该给你最大权重的路径:
MATCH (startNode:Person {id:"887111"}), (endNode:Person {id:"789321"})
CALL apoc.algo.dijkstra(startNode, endNode, 'KNOWS', '_w') YIELD path, weight
RETURN path, -weight AS weight;
2。从最短路径中选择总权重最大的路径
MATCH
(startNode:Person {id:"887111"}),
(endNode:Person {id:"789321"}),
path = allShortestPaths((startNode)-[:KNOWS *..20]-(endNode))
RETURN path, REDUCE(s = 0, r IN RELATIONSHIPS(path) | s + r.duration) AS weight
ORDER BY weight DESC
LIMIT 1;
我想找到两个节点之间的最短路径。路径本身不是问题...更大的问题是,我想要 return 路径,路径上的聚合关系 属性 最高。
为了更好地理解,这是我想要的:
这是我的查询
MATCH
(startNode:Person {id:"887111"}),
(endNode:Person {id:"789321"}),
paths = allShortestPaths((startNode)-[r:KNOWS *..20]-(endNode))
RETURN paths
在这个例子中,我想要从 Elissa (id: 887111) 到 Kasey (id: 789321) 的路径,其中关系的聚合计数是 MAX。 我也看过 'shortestPath',它只给了我一条路。另一种方法是调用 'dijkstra'-algo,这样我只会得到具有最低 'cost'(而不是最高)的路径。 所以在我的示例中,应该显示的唯一路径是 Elissa->Travon->Kasey
我认为,问题并没有那么复杂,但此刻我陷入了困境..
在此先致谢。
更新
调用建议的查询后
MATCH (startNode:Person {id:"789321"}), (endNode:Person {id:"887111"})
CALL apoc.algo.dijkstra(startNode, endNode, 'KNOWS', '_duration') YIELD path, weight
RETURN path, -weight AS weight
我的结果如下
[更新]
我提供 2 个答案,具体取决于您要执行的操作。
1。寻找总重量最大的路径
要找到总权重最大的路径,您可以将原始权重属性的否定提供给 Dijkstra 算法。生成的 "lowest" 总权重将是一个负值,当取反时,实际上将是最高的总权重(基于原始权重属性)。
有一个 APOC 程序 apoc.algo.dijkstra 实现了 Dijkstra 算法,但它不允许您使用指定权重的负值 属性。因此,要使用该过程,您需要向每个具有适当负值的 KNOWS
关系添加一个新的 属性。例如,将负权重添加到现有关系中(假设 w
是原始权重 属性,而 _w
将包含相应的负值):
MATCH ()-[k:KNOWS]->()
SET k._w = -k.w;
一旦你有负权重,下面应该给你最大权重的路径:
MATCH (startNode:Person {id:"887111"}), (endNode:Person {id:"789321"})
CALL apoc.algo.dijkstra(startNode, endNode, 'KNOWS', '_w') YIELD path, weight
RETURN path, -weight AS weight;
2。从最短路径中选择总权重最大的路径
MATCH
(startNode:Person {id:"887111"}),
(endNode:Person {id:"789321"}),
path = allShortestPaths((startNode)-[:KNOWS *..20]-(endNode))
RETURN path, REDUCE(s = 0, r IN RELATIONSHIPS(path) | s + r.duration) AS weight
ORDER BY weight DESC
LIMIT 1;