最短路径算法只能确定一条最短路径。
例如,如果这是完整的图表:
...那么从A 到C 的最短路径查询可能会返回路径A -> B -> C 或A -> D -> C,但不确定是哪一个(此处不考虑边权重)。
但是,您可以使用有效的最短路径算法来确定最短路径长度:
RETURN LENGTH(
FOR v IN OUTBOUND
SHORTEST_PATH "verts/A" TO "verts/C" edges
RETURN v
)
示例图的结果为 3(包括起始顶点)。现在,减 1 得到边数/遍历深度。您可以运行模式匹配遍历以查找具有此长度的所有路径(或通过增加最小和最大深度来查找更长的路径)。起点再次是A,对v(或p.vertices[-1])的文档ID 进行过滤可确保我们只检索以C 结尾的路径:
FOR v, e, p IN 2..2 OUTBOUND "verts/A" edges
FILTER v._id == "verts/C"
RETURN CONCAT_SEPARATOR(" -> ", p.vertices[*]._key)
[
"A -> B -> C",
"A -> D -> C"
]
3..3 的遍历深度将返回 A -> E -> F -> C 和 2..3 所有三个路径。
请注意,需要两个单独的查询来计算最短路径长度并根据最短路径长度(减 1)进行模式匹配,因为 min 和 max depth 不能是表达式(它们必须在提前,所以要么是数字文字或绑定参数)。