У меня есть пример родословной со структурой, показанной здесь .
Моя конечная цель состоит в том, чтобы извлечь происхождение определенных людей в так называемом формате трио, который представляет собой таблицу с колонками 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}
Хотя результат еще не в правильном формате, постобработка проста.
Теперь мои вопросы:
Я вынужден использовать ключевое слово DISTINCT
, чтобы обеспечить уникальность строк. Тем не менее, я бы хотел избежать ненужного обхода, а не фильтрации. В идеале, мне кажется, мне нужна опция uniqueEdges: "global"
, которая, к сожалению, больше не доступна. Например, после обработки родословной человека G, я не хочу снова пересекать часть родословной, разделяемой между G и H (то есть человеком E и его родителями). Использование uniqueVertices: "global"
не вариант, потому что тогда я бы пропустил границу между H --> E
.
Есть ли какая-то опция, чтобы узнать тип коллекции ребер во время обхода, вместо того, чтобы использовать какую-то громоздкую проверку, которую я делаю? Пожалуйста, обратите внимание, что я не могу передать пол в собственность человека (что разумно для большинства людей), потому что на самом деле я имею дело с растениями, которые могут (обычно) быть одновременно матерью и отцом время.