neo4j:具有最小关系属性方差的最短路径

时间:2013-12-05 16:34:19

标签: neo4j cypher shortest-path

我创建了以下图表来模拟传输网络,其中停靠点通过服务节点连接到其他站点(服务节点定义特定的服务天数)。这些关系具有不同的类型和属性。具体而言,GOES_TO关系具有 id 属性,该属性标识在站点之间行进的行程(例如,公共汽车)。

neo4j graph model

我希望找到路径中所有:GOES_TO关系中具有最小数量的不同 id 值的最短路径。

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

(A) - [:用途] - (1:服务) - [:GOES_TO {id:7}] - >(B) - [:用途] - (2:服务) - [:GOES_TO {id :7}] - GT;(d)

此路径使用单个id:7从A到D.

请注意,该条件仅适用于:GOES_TO关系。 :USES关系根本没有 id 属性。

我尝试了几种方法但似乎无法通过密码解决这个看似简单的问题。

1 个答案:

答案 0 :(得分:1)

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算法很容易地使用它。