как собрать всех родителей и всех детей (содержать всех детей, внуков и т. д.) в одном AQL - PullRequest
0 голосов
/ 16 октября 2019

мой график выглядит следующим образом:

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

и когда я выбираю H узел, я хочу получить его всех родителей A, E и всех потомков I, J ...

Результат, которого я с нетерпением жду, будет A, E, H, I, J ...

Я использую два AQL в JAVA, код выглядит следующим образом:

Фахтеры:

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

childs:

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

и, наконец, объедините отцов и детей.

Как видите, я должен выполнить дважды , могу ли я выполнить один раз и получить такой же результат ?

Я прочитал документацию и не нашел подходящего метода. Может быть, я пропустил это.

Спасибо

1 Ответ

0 голосов
/ 16 октября 2019

Для некоторых графиков модификатор направления обхода ANY может работать, но здесь он также будет следовать за исходящими ребрами родителя (E -> F -> G и B -> C -> D), которые вы не хотите включать в результат.

Вы можете выполнить как INBOUND, так и OUTBOUND в одном запросе AQL, используя подзапросы, а затем объединить их результаты:

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

...