我想问的是,如何最好地遍历图,并基于从根到叶的所有节点都必须满足的复杂条件只返回子图。换句话说,我需要某种机制,以便当任何中间层上的条件不满足时,停止遍历(没有嵌套节点被处理并返回到输出)
假设我有以下图表:
A -> B -> C (active=false) -> D
其中I去激活节点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
有什么想法吗?谢谢。
1条答案
按热度按时间f45qwnt81#
AQL
PRUNE
特性是在ArangoDB版本3.4.5和3.5.0中引入的。使用AQL关键字PRUNE
,当满足顶点、边、路径或之前定义的任何变量的条件时,遍历将停止。剪枝是最简单的一种方法,它可以在搜索过程中减少需要检查的数据量,从而提高查询性能,减少查询开销。剪枝可以在顶点、边、路径和之前定义的任何变量上执行。
这个video tutorial通过一个实际操作的例子展示了FILTER和新的PRUNE之间的区别。你可以在文档中找到更多的细节。