在 ArangoDB 的图形遍历期间如何消除所有通过特定文档或顶点的路径

How to eliminate all paths that pass through particular document or vertex while during Graph Traversal in ArangoDB

我想在这里做一个图遍历

我在 ArangoDB 中创建了两个集合,一个文档集合 "Node" 和一个边缘集合 "Path"。我的所有节点都有一个 name 属性(标签),并通过边(线)连接,如上图所示。

我尝试通过以下查询查找以 enderror 节点结尾的路径:

FOR v, e, p IN 1..10 OUTBOUND 'Node/start_0' Path     
OPTIONS { bfs: true}     
FILTER (v.name == "end" OR v.name == "error")     
RETURN CONCAT_SEPARATOR(' - ', p.vertices[*].name)

以上查询按预期工作,return给我两条路径:

["start - decide - execute1 - error"
 "start - decide - execute2 - end"]

但我正在探索如何消除所有通过特定节点的对应路径。例如,我想消除所有通过 execute1 的路径。我试过这个查询:

 FOR v, e, p IN 1..10 OUTBOUND 'Node/start_0' Path     
 OPTIONS { bfs: true}     
 FILTER ((v.name == "end" OR v.name == "error") AND v.name != "execute1")     
 RETURN CONCAT_SEPARATOR(' - ', p.vertices[*].name)

但它不起作用 - 它仍然 return 给我两条路。

任何人都可以帮助我如何重构此查询以使其 return 只有一条路径,即 "start - decide - execute2 - end"?

您的遍历深度为 1..10,将找到以下路径:

  1. 开始-决定
  2. 开始-决定-执行1
  3. 开始-决定-执行2
  4. 开始-决定-执行1-错误
  5. 开始-决定-执行2-结束

请注意如何返回具有一跳 (1) 和两跳 (2, 3) 的路径。它们在一到十跳之内。您的期望可能是遍历只会发出叶节点 (4, 5)。但是,它为您提供了所有五个路径。

您的 name 属性 FILTER 条件已针对 v 进行测试,它表示每个路径的 最后一个顶点

  • "decide"不等于"end""error",所以过滤掉路径1。
  • "execute1""execute2"不等于"end""error",所以路径2和3也被过滤掉了。
  • "error""end" 等于这些值中的任何一个,但它们也满足条件 != "execute1" - 您正在针对停止节点而不是针对路径在这里,所以行为是正确的,但不是你想要的

您的选择是:

  • 过滤掉所有包含名称为"execute1":
    的顶点的路径 FILTER p.vertices[*].name NONE == "execute1" AND v.name IN ["end", "error"]
  • 不要让遍历器通过 "execute1" 使用 PRUNE(自 v3.4.5 和 v3.5.0 起可用):
    PRUNE v.name == "execute1" … FILTER v.name IN ["end", "error"]
  • 不要让遍历器超过"execute1""end""error"(针对上述查询的优化):
    PRUNE v.name IN ["execute1", "end", "error"] … FILTER v.name IN ["end", "error"]

请注意,PRUNE 将包括条件为真的顶点,即发现路径 2,但随后被 FILTER 条件过滤掉。 PRUNE 单独不过滤路径 2。但是,它将阻止从 "execute1" 继续遍历,这意味着不会发现路径 4。 FILTER 从结果中删除路径 1、2 和 3,仅保留路径 5。

另请注意,PRUNE 子句必须放在 OPTIONS!

之前
FOR v, e, p IN 1..10 OUTBOUND 'Node/start_0' Path
PRUNE v.name IN ["execute1", "end", "error"]
OPTIONS { bfs: true }
FILTER v.name IN ["end", "error"]
RETURN CONCAT_SEPARATOR(' - ', p.vertices[*].name)

结果:[ "start - decide - execute2 - end" ]

文档:Pruning in Graph Traversals