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 语句中。 有没有其他人遇到过这种情况,还是只有我遇到过这种情况?

更新: FILTERPRUNE 语句没有 return 预期的结果,原因是缺少 OPTIONS {uniqueEdges: "none"}。与 uniqueVertices 相反,none 不是默认值。

我无法在 ArangoDB 3.4.5 中重现您的问题 如果您创建集合 edgevertex 并使用示例树填充它们:

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 相反)。