Как получить ключ корневого узла графа в ArangoDB?

У меня есть граф в ArangoDB, корневой узел которого - «X». Теперь «a, b, c, d, e, f» являются братьями и сестрами прямых или великих братьев и сестер «X». Теперь из заданного узла-брата «a, b, c, d, e или f» я хочу перейти к узлу «X». Есть ли какой-либо общий запрос AQL для прямого перехода к корневому узлу любого графа?


person Haseb Ansari    schedule 05.06.2016    source источник
comment
Ответ сработал для вас? если да, можете ли вы отметить его как «принятый»? Если нет, чего не хватает?   -  person dothebart    schedule 14.07.2016


Ответы (3)


Чтобы привести точный пример, мне нужно знать немного больше, но это одно из нескольких решений.

Предполагая, что узлы соединены «дочерними» ребрами и направление ребер идет от родителя к потомку. Вы пройдете по дереву вверх или INBOUND

FOR v,e,p IN 1..50 INBOUND '(id of starting node a,b,etc.)' child RETURN p.vertices

Если вы знаете, сколько максимумов переходов до корня, измените 50 на это значение.

Этот оператор вернет все пути и промежуточные пути от начального узла через дочерние ссылки к головному узлу. Чтобы вернуть только путь к головному узлу, вам придется отфильтровать промежуточные пути. Это можно сделать с помощью проверки отсутствия родительской вершины.

FOR v,e,p IN 1..50 INBOUND '(id of starting node a,b,etc.)' child 
  FILTER LENGTH(EDGES(child,v._id,'inbound'))==0 RETURN p.vertices

который отфильтрует все пути, не заканчивающиеся в корневой вершине.

person ggendel    schedule 05.06.2016
comment
Я попытался сделать то же самое, как и установить максимальное значение для прыжка, но я не знаю, сколько прыжков мне нужно сделать, чтобы достичь узла ....... любой разумный способ сделать это - person Haseb Ansari; 06.06.2016
comment
На этот раз нет, просто поставил большое значение. Просто убедитесь, что вы обеспечиваете фильтрацию пути, чтобы остановить обход, когда вы доберетесь до нужного места назначения. Так как они находятся во главе дерева и, следовательно, не имеют родителей, все равно следует остановиться. - person ggendel; 06.06.2016

Ответ RHSMan помог мне, но здесь немного почистили

LET ref_people = (
    FOR p IN people RETURN p._id
)
LET l = (
     FOR id IN ref_people 
         FOR link IN links FILTER id == link._from RETURN id
)

RETURN MINUS(ref_people, l)
person James    schedule 03.09.2020

Я столкнулся с этим, так как у меня была такая же проблема, но приведенное выше устарело:

Я сделал следующее:

let ref_items = (for s in skills
return s._id)


let c = (for item in ref_skills
for sk in skill_skill
    filter item == sk._to

    return item)
return MINUS(ref_skills, c)
person RHSMan    schedule 14.03.2019