ArangoDB:最长最短路径-不只是距离

时间:2019-01-04 14:11:36

标签: arangodb

我正在尝试解决一个问题,即找到图形中实际最长的最短路径是什么。我正在使用arangosh函数_diameter,但它只会为我提供图形直径的数值。我需要知道实际的路径是什么。有可能吗?

1 个答案:

答案 0 :(得分:1)

以下AQL查询返回最长的最短路径。

LET ids = UNION(
(FOR x IN vertices1 RETURN x),
(FOR x IN vertices2 RETURN x)
)
FOR source IN ids
  FOR target IN ids
    FILTER source._id < target._id
      LET path = (FOR v, e IN ANY SHORTEST_PATH source TO target GRAPH @graphName RETURN [v, e]) 
      /* ==> [ [source, null], [v1, source->v1], .... [ target, vn -> target] ] */
  SORT LENGTH(path) DESC
  LIMIT 1
 RETURN path
L。 1-4通过遍历每个顶点集合将所有顶点存储在一个数组中。如果只使用一个顶点集合,则可以删除这些行,并用顶点集合替换“ ids”。

L。 5-8计算列出的顶点之间的最短路径的所有组合,并以[ [source, null], [v1, source->v1], .... [ target, vn -> target] ]的形式提供路径输出。

L.7 FILTER source._id < target._id仅在与ANY一起使用无向边的情况​​下才应使用,因为当不使用任何方向时,路径的顶点1->顶点2等于顶点2->顶点1。如果您改用INBOUND/OUTBOUND路线,请删除此行。

L。 10-11将所有路径按降序排序(最开始的最长路径),并将结果集限制为1个对象。

L。 12最终返回最长的最短路径的路径。

但是,此查询非常昂贵,对所有顶点进行两次迭代,并为每个顶点对计算最短路径,结果为O(n³log n)。因此,此查询只能用于较小的顶点集。