首页 > 解决方案 > 如何在一个 AQL 中获取所有父母和所有子女(包含所有子女或孙子女等)

问题描述

我的图表如下:

 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

最后合并父亲和孩子。

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

我阅读了文档并没有找到合适的方法。也许我错过了。

谢谢

标签: arangodb

解决方案


对于某些图形,遍历方向修饰符可能会起作用,但在这里它也将遵循您不希望包含在结果中ANY的父级的传出边 (E -> F -> G和)。B -> C -> D

您可以使用子查询在单个 AQL 查询中同时执行INBOUND和遍历,然后组合它们的结果:OUTBOUND

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()以便先行。连接两个数组的元素(这里只是文档键)。AEAPPEND()

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


推荐阅读