我正在尝试在这里进行图遍历
我在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-结束”吗?
答案 0 :(得分:0)
您的遍历具有1..10的可变深度,它将找到以下路径:
请注意,还如何返回具有一跳(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" ]