如何在ArangoDB中进行图遍历时消除通过特定文档或顶点的所有路径

时间:2019-08-30 07:44:02

标签: arangodb graph-traversal

我正在尝试在这里进行图遍历

Example Graph

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

我在下面的查询中尝试查找以 end error 节点结尾的路径:

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)

上面的查询按预期工作,并返回两条路径:

["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)

但是它不起作用-它仍然返回两条路径。

任何人都可以帮助我重新构造该查询以使其仅返回一条路径,即“开始-决定-execute2-结束”吗?

1 个答案:

答案 0 :(得分:0)

您的遍历具有1..10的可变深度,它将找到以下路径:

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

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

针对name测试了您的v属性FILTER条件,该条件代表每个路径的最后一个顶点

  • "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