具有多个条件的路径遍历在所有顶点上进行过滤

问题描述 投票:0回答:1

我想执行路径遍历,我在所有顶点上应用多条件过滤器。

基本上我希望每个顶点匹配a == trueb == true

两个中的一个很容易做到:

FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'stix_graph'
    FILTER p.vertices[*].a ALL == true
    RETURN p

甚至两个条件重新统一:

FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'graph'
    FILTER p.vertices[*].a ALL == true AND p.vertices[*].b ALL == true
    RETURN p

但我不知道如何在每个顶点上实现ab ......

arangodb
1个回答
2
投票

你可以使用inline projectioninline filter来达到你想要的效果。

以下是使用内联投影的示例AQL:

FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'graph'
    FILTER p.vertices[* RETURN CURRENT.a OR CURRENT.b] ALL == true
    RETURN p

以下是使用内联过滤器的示例AQL:

FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'graph'
    FILTER COUNT(p.vertices[* FILTER CURRENT.a OR CURRENT.b]) == COUNT(p.vertices) 
    RETURN p

重要说明:只有遍历相对较小的图形时,此方法才会有效。如果你有非常庞大而深度的图表,性能可能会受到影响,因为内联投影和内联过滤器被ArangoDB查询优化器视为CalculationNode。即ArangoDB不会在条件返回false的第一个顶点上停止遍历。它将不得不继续遍历,因为过滤条件具有计算值,并且它无法预先知道该计算的结果是truefalse用于下一个顶点。因此,它会在引擎盖下进行一些额外的遍历/计算,但它仍将返回您期望的结果。

如果你想将这个过滤器用于一个非常大的图形,我相信正确的方法是为你的数据添加一些冗余,并将a == trueb == true值放入一个单独的属性中,你可以在过滤条件中有效地使用它。

© www.soinside.com 2019 - 2024. All rights reserved.