对所有顶点进行多条件过滤的路径遍历

Path traversal with multiple conditions filter on all vertices

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

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

您可以使用inline projection or inline 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。 IE。 ArangoDB 不会在条件 returns false 的第一个顶点停止遍历。它必须继续遍历,因为过滤条件有一个计算值,它无法提前知道下一个顶点的计算结果是 true 还是 false。因此,它会在幕后做一些额外的 traversals/calculations,但它仍然会 return 您期望的结果。

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