[英]AQL - graph traversal - filtering on path with complex condition
我想问一问如何最好地遍历图,并根据复杂的条件仅返回子图,这是从根到叶的所有节点都必须满足的条件。 换句话说,我需要某种机制,以便在不满足任何中间级别的条件时,停止遍历(不处理任何嵌套节点并返回到输出)
假设我有以下图表:
A -> B -> C (active=false) -> D
在这里我停用了节点C(请注意,标记active = false表示所有子图都已停用,包括C和D)。
根据文档,我可以通过对路径,通配符[*]和ALL关键字进行过滤来轻松构造此类过滤器,当不满足C的条件时,它们也将停止遍历。 在简单的条件下,这很好用:
for v,e,p in 1..100 outbound 'test/A' graph 'testGraph'
filter p.vertices[*].active ALL != false return v
// returns A, B
现在,我有另一个图,其中每个节点都是固定的,或者具有一些有效时间跨度(从,到)属性:
A (type="fixed") -> B (from=2,to=3) -> C (from=1, to=5) -> D (type="fixed")
现在,我只想返回子图,其中所有(中间)节点都是固定的,或者满足从> = 2到<= 3的时间条件。 我需要退还A,B。
for v,e,p in 0..100 outbound 'test/A' graph 'testGraph'
filter p.vertices[*].type ALL == 'fixed' or
(p.vertices[*].from ALL >= 2 and p.vertices[*].from ALL <= 3)
return v
但是,这显然是错误的(并且仅返回A),从逻辑上讲,我需要在条件的开头添加ALL关键字(我需要将条件应用于每个级别,并且当不满足条件时,将停止遍历)不支持:
filter ALL(p.vertices[*].type == 'fixed' or
(p.vertices[*].from >= 2 and p.vertices[*].from <= 3)
通过对顶点进行过滤的经典方法无法满足我的需求,因为在不满足条件时它不会停止遍历,即以下返回A,B,D(C被跳过,但我还需要修剪C的子树,以便D不在输出上):
for v,e,p in 0..100 outbound 'test/A' graph 'testGraph'
filter v.type == 'fixed' or
(v.from >= 2 and v.from <= 3)
return v
有任何想法吗? 谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.