neo4j:关系性质方差最小的最短路径

neo4j:关系性质方差最小的最短路径,neo4j,cypher,shortest-path,Neo4j,Cypher,Shortest Path,我创建了下图来模拟公交网络,其中站点通过服务节点(服务节点定义特定的服务天数)连接到其他站点。这些关系具有不同的类型和属性。具体来说,GOES_TO relationships有一个标识在站点之间行驶的行程(如公共汽车)的id属性 我希望找到一条最短的路径,在所有路径上的关系中,具有最少数量的不同id值 在上述情况下,最短路径应为: (A) -[:使用]-(1:服务)-[:转到{id:7}]->(B)-[:使用]-(2:服务)-[:转到{id:7}]->(D) 此路径使用单个id 7从a到D

我创建了下图来模拟公交网络,其中站点通过服务节点(服务节点定义特定的服务天数)连接到其他站点。这些关系具有不同的类型和属性。具体来说,GOES_TO relationships有一个标识在站点之间行驶的行程(如公共汽车)的id属性

我希望找到一条最短的路径,在所有路径上的关系中,具有最少数量的不同id

在上述情况下,最短路径应为:

(A) -[:使用]-(1:服务)-[:转到{id:7}]->(B)-[:使用]-(2:服务)-[:转到{id:7}]->(D)

此路径使用单个id 7从a到D

请注意,该条件仅适用于:GOES_TO relationships.:使用关系根本没有和id属性


我尝试了几种方法,但似乎无法用cypher解决这个看似简单的问题

Cypher还不能有效地执行加权最短路径(希望很快!),但一个解决方法是使用reduce对路径进行聚合——警告是它需要查看所有路径。也许是这样的:

MATCH p=(a:Stop)-[*]->(d:Stop)
WHERE a.name='A' and d.name='D'
RETURN p, 
  length(reduce(acc=[], r in rels(p)| acc + 
  case 
    when type(r) = "GOES_TO" 
     and NOT r.id IN acc 
    then r.id 
    else [] 
  end)) as distinctIds
ORDER BY distinctIds ASC;

如果速度不够快,您可以通过graphalgo包(或嵌入式)在服务器上的非托管扩展中使用dijskstra的算法轻松实现此功能。

谢谢您的回答,但是我已经用我的图形尝试了此功能,但它不起作用。查询执行大约一分钟,然后以“未知错误”失败。显然,塞弗不是来这里的路。我将如何使用java中的graphalgo实现这一点?我可以使用任何有用的资源/示例吗?如果您将关系类型/深度更改为
-[:USES | GOES_to*1..10]
,是否会产生影响?如果您使用的是2.0-RC1,您还可以匹配属性,即
(a:Stop{name:'a'})
。可能执行引擎已经为您做到了这一点,但值得一试。是的,我正在使用节点属性来匹配初始节点,并且我还在关系上使用深度限制,但是对于这个图来说,深度10非常小,因为您可以轻松地进行一次跨越25-50站的旅行,这就形成了50-100个关系(每跳停止服务)。我想跟进@WesFreeman提出的建议,并用java编写这篇文章。我查阅了
org.neo4j.graphalgo.GraphAlgoFactory
,但可以找到如何通过不同的
:GOES_to.id
值来限制dijkstra。我非常感谢一些java代码示例。你解决了问题吗?你能描述一下,你是如何解决的吗解决了的?