我的图如下:
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
最后合并父亲和孩子。
如您所见,我必须执行两次,我可以执行一次并获得相同的结果吗?
我阅读了文档,但找不到合适的方法。也许我错过了。
谢谢
答案 0 :(得分:0)
对于某些图形,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()
来颠倒父文档的顺序,因此A
和E
排在第一位。 APPEND()
连接两个数组的元素(这里只是文档键)。
https://www.arangodb.com/docs/stable/aql/examples-combining-queries.html