Neo4j 具有最高聚合关系属性的最短路径

标签 neo4j max cypher shortest-path

我想找到两个节点之间的最短路径。路径本身不是问题...更大的问题是,我想要返回路径,其中路径上的聚合关系属性最高。

为了更好地理解,这就是我想要的:

这是我的查询

MATCH
  (startNode:Person {id:"887111"}),
  (endNode:Person {id:"789321"}),
  paths = allShortestPaths((startNode)-[r:KNOWS *..20]-(endNode))
RETURN paths

Query result

在此示例中,我希望拥有从 Elissa(id:887111)到 Kasey(id:789321)的路径,其中关系上的聚合计数为 MAX。 我还查看了“shortestPath”,它只给了我一条路径。另一种方法是调用“dijkstra”算法,这样我将仅获得“成本”最低(而不是最高)的路径。 因此,在我的示例中,应该显示的唯一路径是 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

我的结果如下

updated result

最佳答案

[已更新]

我提出了 2 个答案,具体取决于您想要做什么。

1。寻找总权重最大的路径

要找到总权重最大的路径,您可以将原始权重属性的否定输入 Dijkstra 算法。由此产生的“最低”总权重将是一个负值,当取反时,实际上将是最高总权重(基于原始权重属性)。

有一个 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;

关于Neo4j 具有最高聚合关系属性的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44119453/

相关文章:

go - 对指针和值参数新主义感到困惑

Neo4j 超时不起作用

python - 在python中结合max、xrange和lambda函数的使用

java - 无法使用 Java 中的 Cypher 查询在 Neo4J 数据库中的两个节点之间创建关系

Neo4j:如何删除与密码的特定关系?

neo4j - neo4j如何取消所有约束

import - neo4j apoc 导入/导出不起作用。如何修改neo4j.conf文件?

java - Neo4j 的 php api 与 java 遍历框架

javascript - Math.max() - 如果更多元素是最大值?

algorithm - 在 OpenCL 中查找 float 组最大值的快速方法