我想执行路径遍历,我在所有顶点上应用多条件过滤器。
基本上我希望每个顶点匹配a == true
或b == 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
......
你可以使用inline projection或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
。即ArangoDB不会在条件返回false
的第一个顶点上停止遍历。它将不得不继续遍历,因为过滤条件具有计算值,并且它无法预先知道该计算的结果是true
的false
用于下一个顶点。因此,它会在引擎盖下进行一些额外的遍历/计算,但它仍将返回您期望的结果。
如果你想将这个过滤器用于一个非常大的图形,我相信正确的方法是为你的数据添加一些冗余,并将a == true
或b == true
值放入一个单独的属性中,你可以在过滤条件中有效地使用它。