AQL的PRUNE:如何组合条件?
AQL's PRUNE: How to combine conditions?
我是 运行 ArangoDB 3.4.5
,我一直在研究 PRUNE
语句。我在组合条件时遇到了一些困难。
假设我的路径 p
上的某些顶点 v
具有整数属性 ia
而某些 v
具有布尔属性 ba
。甚至索引 v
沿 p
例如 p.vertices[2]
都有 ba
.
PRUNE HAS(v, "ia") AND v.ia != 5
自己工作。
PRUNE p.vertices[2].ba == false OR p.vertices[4].ba == false
也可以单独使用。
我观察到,我不能将它们组合在一个查询中,既不能通过多个 PRUNE
语句,也不能将它们放在一个查询中
PRUNE (condition_1) OR (condition_2)
。此外,我不能将一个放在 PRUNE
中,将下一个放在 FILTER
语句中。
有没有其他人遇到过这种情况,还是只有我遇到过这种情况?
更新:
FILTER
和 PRUNE
语句没有 return 预期的结果,原因是缺少 OPTIONS {uniqueEdges: "none"}
。与 uniqueVertices
相反,none
不是默认值。
我无法在 ArangoDB 3.4.5 中重现您的问题
如果您创建集合 edge
和 vertex
并使用示例树填充它们:
FOR n in 0..100000
INSERT {_key: TO_STRING(n), val: n, modulo: n%2} INTO vertex
FILTER n > 0
INSERT {_from: CONCAT("vertex/", FLOOR((n-1)/2)), _to: NEW._id} INTO edge
现在我运行一个遍历:
WITH vertex
FOR v,e,p IN 0..5 OUTBOUND "vertex/0" edge
RETURN TO_STRING(p.vertices[*].val)
结果:
[
"[0]",
"[0,1]",
"[0,1,3]",
"[0,1,3,7]",
"[0,1,3,7,15]",
"[0,1,3,7,15,31]",
"[0,1,3,7,15,32]",
"[0,1,3,7,16]",
"[0,1,3,7,16,33]",
"[0,1,3,7,16,34]",
"[0,1,3,8]",
"[0,1,3,8,17]",
"[0,1,3,8,17,35]",
"[0,1,3,8,17,36]",
"[0,1,3,8,18]",
"[0,1,3,8,18,37]",
"[0,1,3,8,18,38]",
"[0,1,4]",
...
接下来,我将"stop": true
和"hide": 1
添加到顶点_key: 7
,并将其他一些组合添加到顶点17和18。现在如果满足条件,PRUNE应该停止遍历。请注意,顶点本身包含在结果中。
WITH vertex
FOR v,e,p IN 0..5 OUTBOUND "vertex/0" edge
PRUNE v.hide == 1 AND v.stop == true
RETURN TO_STRING(p.vertices[*].val)
结果:
[
"[0]",
"[0,1]",
"[0,1,3]",
"[0,1,3,7]", <-- stop: true, hide: 1
"[0,1,3,8]",
"[0,1,3,8,17]", <-- stop: true, hide: 1
"[0,1,3,8,18]",
"[0,1,3,8,18,37]",
"[0,1,3,8,18,38]",
...
PRUNE 条件可以使用 AND / OR,但只支持一种 PRUNE 条件(与 FILTERS 相反)。
我是 运行 ArangoDB 3.4.5
,我一直在研究 PRUNE
语句。我在组合条件时遇到了一些困难。
假设我的路径 p
上的某些顶点 v
具有整数属性 ia
而某些 v
具有布尔属性 ba
。甚至索引 v
沿 p
例如 p.vertices[2]
都有 ba
.
PRUNE HAS(v, "ia") AND v.ia != 5
自己工作。
PRUNE p.vertices[2].ba == false OR p.vertices[4].ba == false
也可以单独使用。
我观察到,我不能将它们组合在一个查询中,既不能通过多个 PRUNE
语句,也不能将它们放在一个查询中
PRUNE (condition_1) OR (condition_2)
。此外,我不能将一个放在 PRUNE
中,将下一个放在 FILTER
语句中。
有没有其他人遇到过这种情况,还是只有我遇到过这种情况?
更新:
FILTER
和 PRUNE
语句没有 return 预期的结果,原因是缺少 OPTIONS {uniqueEdges: "none"}
。与 uniqueVertices
相反,none
不是默认值。
我无法在 ArangoDB 3.4.5 中重现您的问题
如果您创建集合 edge
和 vertex
并使用示例树填充它们:
FOR n in 0..100000
INSERT {_key: TO_STRING(n), val: n, modulo: n%2} INTO vertex
FILTER n > 0
INSERT {_from: CONCAT("vertex/", FLOOR((n-1)/2)), _to: NEW._id} INTO edge
现在我运行一个遍历:
WITH vertex
FOR v,e,p IN 0..5 OUTBOUND "vertex/0" edge
RETURN TO_STRING(p.vertices[*].val)
结果:
[
"[0]",
"[0,1]",
"[0,1,3]",
"[0,1,3,7]",
"[0,1,3,7,15]",
"[0,1,3,7,15,31]",
"[0,1,3,7,15,32]",
"[0,1,3,7,16]",
"[0,1,3,7,16,33]",
"[0,1,3,7,16,34]",
"[0,1,3,8]",
"[0,1,3,8,17]",
"[0,1,3,8,17,35]",
"[0,1,3,8,17,36]",
"[0,1,3,8,18]",
"[0,1,3,8,18,37]",
"[0,1,3,8,18,38]",
"[0,1,4]",
...
接下来,我将"stop": true
和"hide": 1
添加到顶点_key: 7
,并将其他一些组合添加到顶点17和18。现在如果满足条件,PRUNE应该停止遍历。请注意,顶点本身包含在结果中。
WITH vertex
FOR v,e,p IN 0..5 OUTBOUND "vertex/0" edge
PRUNE v.hide == 1 AND v.stop == true
RETURN TO_STRING(p.vertices[*].val)
结果:
[
"[0]",
"[0,1]",
"[0,1,3]",
"[0,1,3,7]", <-- stop: true, hide: 1
"[0,1,3,8]",
"[0,1,3,8,17]", <-- stop: true, hide: 1
"[0,1,3,8,18]",
"[0,1,3,8,18,37]",
"[0,1,3,8,18,38]",
...
PRUNE 条件可以使用 AND / OR,但只支持一种 PRUNE 条件(与 FILTERS 相反)。