我创建了以下图表来模拟传输网络,其中停靠点通过服务节点连接到其他站点(服务节点定义特定的服务天数)。这些关系具有不同的类型和属性。具体而言,GOES_TO关系具有 id 属性,该属性标识在站点之间行进的行程(例如,公共汽车)。
我希望找到路径中所有: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 属性。
我尝试了几种方法但似乎无法通过密码解决这个看似简单的问题。
答案 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算法很容易地使用它。