![](/img/trans.png)
[英]Shortest path between two nodes vs shortest path from one node to all other nodes
[英]How to get a path from one node to another including all other nodes and relationships involved in between
如评论中所述,在Cypher中,您不能使用针对某些关系使用不同方向的有向可变长度关系。
但是, APOC程序刚刚添加了根据关系序列进行扩展的功能。 您可以尝试一下:
MATCH (start:station), (end:station)
WHERE start.name='NBW' AND end.name='THT'
CALL apoc.path.expandConfig(start, {terminatorNodes:[end], limit:1,
relationshipFilter:'has_platform>, can_board>, goto>, can_alight>, <has_platform'}) YIELD path
RETURN path
我添加了一个限制,以便仅返回到终端站的第一个(也是最短的)路径。 不建议取消限制,因为这将继续在扩展中重复从站到站的关系,直到找到找到到达终端站的所有可能方式,这可能会挂起查询。
编辑
关于新模型的更改,上述方法不起作用的原因是关系序列中不能包含可变长度序列。 您有2个goto>
关系可以遍历,但是序列中仅指定了一个。
这是一种不使用序列的替代方法,只是将允许的关系列入白名单。 spanningTree()
过程使用NODE_GLOBAL唯一性,因此到找到的每个节点将只有一条唯一路径(路径不会回溯或重新访问以前访问的节点)。
MATCH (start:station), (end:station)
WHERE start.name='NBW' AND end.name='RD'
CALL apoc.path.spanningTree(start, {terminatorNodes:[end], limit:1,
relationshipFilter:'has_platform>|can_board>|goto>|can_alight>|<has_platform'}) YIELD path
RETURN path
您的查询是针对-->
,并非两个工作站之间的所有关系都朝相同的方向运行。 如果删除关系方向,您将得到结果。
然后,一旦获得结果,我认为类似的事情可能会使您指出正确的方向,以便在工作后从结果路径中提取特定细节。
本质上,我假设您感兴趣的一切都在返回的路径中,您只需要过滤掉返回的不同部分即可。
正如@InverseFalcon指出的那样,此查询应限制在较大的图中,否则可能会轻易消失。
MATCH p = (a:Station)-[r:Goto|can_board|can_alight|has_platfrom*0..]-(c:Station)
WHERE (a.name='NBW')
AND c.name='THT'
RETURN filter( n in nodes(p) WHERE 'Platform' in labels(n)) AS Platforms
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.