Arangodb AQL&x27;s PRUNE:如何组合条件?

Arangodb AQL&x27;s PRUNE:如何组合条件?,arangodb,aql,Arangodb,Aql,我正在运行ArangoDB3.4.5,并且一直在使用PRUNE语句。我在组合条件时遇到了一些困难 假设路径p上的一些顶点v具有整数属性ia,而一些v具有布尔属性ba。甚至沿着p索引v,例如p。顶点[2]都有ba PRUNE有(v,“ia”)和v.ia!=5 它自己工作。 PRUNE p.vertices[2]。ba==false或p.vertices[4]。ba==false 它本身也可以工作 我注意到,我不能通过多个PRUNE语句或将它们放在一个查询中组合它们 修剪(条件1)或(条件2)。此外

我正在运行ArangoDB
3.4.5
,并且一直在使用
PRUNE
语句。我在组合条件时遇到了一些困难

假设路径
p
上的一些顶点
v
具有整数属性
ia
,而一些
v
具有布尔属性
ba
。甚至沿着
p
索引
v
,例如
p。顶点[2]
都有
ba

PRUNE有(v,“ia”)和v.ia!=5
它自己工作。
PRUNE p.vertices[2]。ba==false或p.vertices[4]。ba==false
它本身也可以工作

我注意到,我不能通过多个
PRUNE
语句或将它们放在一个查询中组合它们
修剪(条件1)或(条件2)
。此外,我不能将一个放在
PRUNE
语句中,将下一个放在
FILTER
语句中。 还有其他人经历过这种情况吗?还是只有我

更新:
FILTER
PRUNE
语句没有返回所需的结果,但是原因是缺少
选项{uniqueEdges:“none”}
。与
唯一顶点
相反,
不是默认值。

我无法在ArangoDB 3.4.5中重现您的问题 如果创建集合
顶点
,并使用示例树填充这些集合:

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]",
  ...
[
  "[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]", 
   ...
接下来,我将
“stop”:true
“hide”:1
添加到顶点
\u键:7
,并将一些其他组合添加到顶点17和18。现在,如果条件满足,修剪应该停止遍历。请小心,结果中包含顶点本身

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]",
  "[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]",
  ...
[
  "[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]", 
   ...
[
"[0]",
"[0,1]",
"[0,1,3]",

“[0,1,3,7]”,这看起来相当不错,类似于
PRUNE(HAS(v,“ia”)和v.ia!=5)或(p.vertices[2]。ba==false或p.vertices[4]。ba==false)
应该按照您的期望进行操作。至少,如果对应的顶点包含与此条件匹配的任何此类属性。您将获得与
修剪
条件匹配的顶点的路径,但不会检查更多的传出边。感谢您的帮助!我终于找到了我这边的问题。是什么导致了令人困惑的是,
OPTIONS{uniquedges:“none”}
不是默认值,而
OPTIONS{uniqueVertices:“none”}
是默认值。谢谢,这个例子证明了它是按设计工作的!我终于找到了问题所在。请参阅我之前的评论和更新。