具有最高聚合关系特性的Neo4j shortestPath

时间:2017-05-22 18:11:00

标签: 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'-algo,用这个我只得到最低'成本'的路径(而不是最高的)。 所以在我的例子中,应该显示的唯一路径是 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

1 个答案:

答案 0 :(得分:2)

[增订]

我提出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;