ArangoDB: порядок в обходе графа - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть довольно стандартный graphql, который представляет древовидную структуру:

graph

Я хотел бы сделать обход графика и форсировать порядок согласноorder Я установил на каждом ребре:

A -> C

A -> B -> E

A -> B -> D

Я пытался добавить SORT в свой запрос, но он сортирует весь результирующий массив, а это не то, что мне нужно:

FOR v, e, p IN 1..1000 OUTBOUND A
    edge_collec
    SORT e.order
    RETURN v

Есть ли способ сделать это с помощью AQL?

1 Ответ

0 голосов
/ 05 декабря 2018

Что делает запрос:

  • Следовать всем исходящим ребрам в наборе ребер edge_collec от начальной вершины A
  • Затем сортировать в порядке возрастанияатрибут ребра order
  • Возвращает вершины (последнюю вершину каждого найденного пути)

Атрибут ребра e.order имеет значение 0 или 1:

  • A --[ order: 1 ]--> B
  • A --[ order: 0 ]--> C
  • B --[ order: 1 ]--> D
  • B --[ order: 0 ]--> E

Сортировка по order вернет C и E (0) до B и D (1).Поскольку два ребра имеют одинаковое значение, не определено, будет ли C или E возвращаться первым, а B или D - третьим.

Если вы хотите, чтобы вершины на глубине = 1 были возвращены перед вершинами на глубине= 2, но все равно сортируйте по order на каждом уровне глубины, вы можете использовать:

SORT LENGTH(p.edges), e.order

LENGTH(p.edges) дает текущую глубину обхода.Сначала выполняется сортировка по глубине, а затем по атрибуту ребра, и вы получите желаемый порядок результата: CBED

...