繁体   English   中英

在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)

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

["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..10,可以找到以下路径:

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

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

您的name属性FILTER条件针对v进行了测试, 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"]
  • 不要让遍历器使用PRUNE (自v3.4.5和v3.5.0起可用)通过"execute1"
    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" ]

文档: 图遍历中的修剪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM