最短路径和全路径问题

Docker部署的,v3.5版本
问题:在查询由a点到c点并且经过b点的最短路径,应该怎样写,如图所示,像我这样写,返回了两条数据,它的意思应该是说a到b的路径,和a到c的路径,实际上我想要的结果应该是一条数据,由a到b再到c,这种该怎么处理


您好,或许您可以把 a 经过 b 到达 c的最短路径转化为 a到b的最短路径 + b到c的最短路径,然后将两者拼接。

MATCH p = shortestPath((a)-[e*…5]-(b)), p1 = shortestPath((b)-[e1*…5]-(c))
WHERE id(a) == “player101” and id(b) == “player102” and id(c) == “player105”
RETURN [p,p1];

1 个赞

还能那么用,学习了。

多谢多谢,但是想请问,如果是多个点的呢,例如a到e并且经过b c d的最短路径,这种该怎么查询呢

按照 Salieri 的这个语句,如果 bcd 是有序的话,应该就是这样

MATCH p = shortestPath((a)-[e0*…5]-(b)), p1 = shortestPath((b)-[e1*…5]-(c)), p2 = shortestPath((c)-[e2*…5]-(d)), p3 = shortestPath((d)-[e3*…5]-(e)) WHERE id(a) == “player101” and id(b) == “player102” and id(c) == “player105” and id(d) == “player103” and id(e) == “player106”
RETURN [p,p1,p2,p3];

可是并不能确定需要它想经过几个点,这个都是动态的,所以有没有其他的方式可以动态的接收经过多点的最短路径的语句呢

印象中没有这种语法,或许需要拿出所有路径做过滤,或者上图计算。
过滤的话可以这么搞,但是可能会很慢。

MATCH p = (a)-[e*…5]-(b)
WHERE id(a) == “player147” and id(b) == “player148”
WITH p, nodes(p) as nodes_p
WHERE all(player in [“player147”, “player136”,“player137”,“player148”] WHERE (any(n in nodes_p WHERE id(n) == player)))
RETURN p ,size(nodes_p) as sz
ORDER BY sz
LIMIT 1

2 个赞

目前应该没有太好的动态接收的方式,要么像 @Salieri 说的,查询出来以后做过滤,但这样应该会比较慢。
可以考虑在语句层面动态拼接,或许会容易点

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。