Обратный путь в родословной ArangoDB - PullRequest
0 голосов
/ 06 июля 2018

У меня есть пример родословной со структурой, показанной здесь . Моя конечная цель состоит в том, чтобы извлечь происхождение определенных людей в так называемом формате трио, который представляет собой таблицу с колонками id mom dad.

В моем примере результат для родословной двух самых последних людей G и H будет

+-----+-----+-----+
| id  | mom | dad |
+-----+-----+-----+
|  D  |  A  |  B  |
|  E  |  C  |  B  | 
|  G  |  D  |  E  |
|  H  |  F  |  E  |
+-----+-----+-----+

Самым близким, что я мог придумать в AQL, является следующий запрос.

LET last_generation = ['people/G', 'people/H']
FOR person IN last_generation
FOR v, e, p in 1..10 OUTBOUND person is_mom, is_dad
LET role = contains('mom', e._id) ? 'mom': 'dad'
SORT e._from DESC
RETURN DISTINCT {'id': DOCUMENT('people', e._from)._key,
                 'parent': DOCUMENT('people', e._to)._key,
                 'role': role}

Хотя результат еще не в правильном формате, постобработка проста.

Теперь мои вопросы:

  1. Я вынужден использовать ключевое слово DISTINCT, чтобы обеспечить уникальность строк. Тем не менее, я бы хотел избежать ненужного обхода, а не фильтрации. В идеале, мне кажется, мне нужна опция uniqueEdges: "global", которая, к сожалению, больше не доступна. Например, после обработки родословной человека G, я не хочу снова пересекать часть родословной, разделяемой между G и H (то есть человеком E и его родителями). Использование uniqueVertices: "global" не вариант, потому что тогда я бы пропустил границу между H --> E.

  2. Есть ли какая-то опция, чтобы узнать тип коллекции ребер во время обхода, вместо того, чтобы использовать какую-то громоздкую проверку, которую я делаю? Пожалуйста, обратите внимание, что я не могу передать пол в собственность человека (что разумно для большинства людей), потому что на самом деле я имею дело с растениями, которые могут (обычно) быть одновременно матерью и отцом время.

...