ArangoDB:查找具有条件的所有最短路径

时间:2017-03-27 15:23:12

标签: arangodb aql

问题:我有一个起始节点,我正在搜索具有某个属性的节点。但我只想要与最短节点连接的节点。

示例:绿色节点已设置属性,但我只想要“A”和“C”,因为“E”的路径较长

graph

到目前为止我得到了什么:

LET source = (FOR x IN Entity FILTER x.objectID == @nodeId
    return x)[0]
FOR node, edge, path IN 1..5 ANY source._id GRAPH 'm' 
 FILTER CONTAINS(node.label,  @search)
  LIMIT @limit
  RETURN path

但这会返回所有内容而不是最短路径

1 个答案:

答案 0 :(得分:0)

您可以使用LENGTH(path.edges)获取原点节点的距离,因此如果您将遍历放入子查询中,您可以找到之后的最短路径长度,然后按该长度过滤:

LET allMatches = (
  FOR node, edge, path IN 1..3 ANY "[vertex_id]" GRAPH "[my_graph]"
    FILTER CONTAINS(node.label,  @search)
    LIMIT @limit
    RETURN {node,path})
LET shortestPathLength = MIN(FOR m IN allMatches COLLECT len = LENGTH(m.edges) RETURN len)
FOR m IN allMatches
  FILTER LENGTH(m.path.edges) == shortestPathLength
  RETURN m.node

在一个查询中可能有更好的方法来执行此操作(例如,执行广度优先遍历然后以某种方式停止它)但我没有看到它。