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

时间:2019-02-28 13:41:35

标签: arangodb

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

基本上,我希望每个顶点都匹配type Point = [number, number] type Points = Array<Point> const ok: Points = [[0, 0]] const fail: Points = [0].map(() => [0, 0]) 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 ...

1 个答案:

答案 0 :(得分:2)

您可以使用inline projectioninline filter来获得所需的结果。

以下是使用在线投影的示例AQL:

xdebug.remote_enable = 1
xdebug.remote_mode = req
xdebug.remote_port = 9001
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal

以下是使用在线过滤器的示例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

重要提示::仅当您遍历较小的图形时,此方法才能很好地执行。如果您的图确实很大且很深,则性能可能会受到影响,因为ArangoDB查询优化器将内联投影和内联过滤器都视为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的第一个顶点上停止遍历。由于滤波器条件具有计算所得的值,因此它必须继续遍历,并且无法预先知道下一个顶点的计算结果是否为false的{​​{1}}。因此,它会在后台进行一些额外的遍历/计算,但仍会返回您期望的结果。

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