如何在一个AQL中让所有父母和所有孩子(包括所有孩子或孙子等)

时间:2019-10-16 09:25:33

标签: arangodb

我的图如下:

 A -> B -> C ->D
   \> E -> F -> G
       \>  H -> I- J - ...

,当我选择 H 节点时,我想获得他的所有父级 A,E 和所有子级 I,J ...

我期待的结果是 A,E,H,I,J ...

我在JAVA中使用两个AQL,一些代码如下:

脚步:

FOR v,e,p IN 1..9999 INBOUND  'xx/xx' xxGraph
RETURN e

孩子:

FOR v,e,p IN 1..999999999 OUTBOUND  'xx/xx' xxGraph
RETURN e

最后合并父亲和孩子。

如您所见,我必须执行两次,我可以执行一次并获得相同的结果吗?

我阅读了文档,但找不到合适的方法。也许我错过了。

谢谢

1 个答案:

答案 0 :(得分:0)

对于某些图形,ANY遍历方向修饰符可能会起作用,但是在这里它也会跟随父级的输出边(E -> F -> GB -> C -> D),而您不想将其包括在内结果。

您可以使用子查询在单个AQL查询中同时进行INBOUNDOUTBOUND遍历,然后合并它们的结果:

LET start = 'vert/H'
LET parents = (FOR v IN 0..9999 INBOUND start edge RETURN v)
LET children = (FOR v IN 1..9999 OUTBOUND start edge RETURN v)
RETURN APPEND(REVERSE(parents[*]._key), children[*]._key)

请注意父级的最小遍历深度为0。这将包括起始顶点H。我使用REVERSE()来颠倒父文档的顺序,因此AE排在第一位。 APPEND()连接两个数组的元素(这里只是文档键)。

https://www.arangodb.com/docs/stable/aql/examples-combining-queries.html