首页 > 解决方案 > 在所有顶点上具有多个条件过滤器的路径遍历

问题描述

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

基本上我希望每个顶点都匹配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

但我不知道如何在每个顶点上实现其中一个a或每个...b

标签: arangodb

解决方案


您可以使用内联投影内联过滤器来获得您想要的结果。

这是使用内联投影的示例 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。它将不得不继续遍历,因为过滤条件具有计算值,并且它无法提前知道该计算的结果是否true用于false下一个顶点。所以,它会在底层做一些额外的遍历/计算,但它仍然会返回你期望的结果。

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


推荐阅读