Я пытаюсь построить базу данных генеалогического древа с OrientDB (v2.0.2, если это имеет значение). У меня есть вершина под названием «Лицо» и ребро, называемое «Ребенок» (поэтому край выходит из родительского элемента и в него).Как сгруппировать по связанным объектам
Для некоторых примеров данных можно сказать, что у «Джейн» было 2 ребенка с 2 разными партнерами (всего 4). Когда Джанс избавился, я хотел бы получить список всех ее детей, сгруппированных их другим родителем. Таким образом, результирующий набор я хочу должен быть чем-то вроде
with Bob with Joe
-------- --------
Alpha Gamma
Beta Delta
я могу получить ребенок с помощью простого запроса select expand(out('Child')) from #12:6
, но я озадачен, что делать с этой точкой. Также обратите внимание, что в некоторых случаях другой родитель может не быть известен и поэтому должен быть указан в дополнительной группе с «неизвестным» родителем.
Я использую базу данных через pyorient (python), поэтому я всегда мог бы перебирать результаты и вручную добавлять их в группы в dict, но это не похоже на правильное решение.
Edit: после долгих проб и ошибок, я пришел с
select unionall($current) as children, $parents as parents from (select expand(out('Child')) from #12:6) let $parents = (select expand(in('Child')) from $current) group by $parents
Это дает мне сырой результат вдоль линий
"детей": [ "# 12: 0" , "# 12: 5"],
"родителей": [ "# 12: 1", "# 12: 6"],
Насколько это хорошо? Каков наилучший способ получить все эти записи через rids, поэтому я могу получить информацию о всех лицах (имя и т. Д.)?