我想执行路径遍历,在所有顶点上应用多条件过滤器。
基本上,我希望每个顶点都匹配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
...
答案 0 :(得分:2)
您可以使用inline projection或inline 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}}。因此,它会在后台进行一些额外的遍历/计算,但仍会返回您期望的结果。
如果您想将此过滤器用于一个非常大的图形,我相信正确的方法是为您的数据添加一点冗余,并将true
或false
值放入一个单独的属性中您可以在过滤条件下有效使用它。