2015-03-05 5 views
0

Я пытаюсь построить базу данных генеалогического древа с 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, поэтому я могу получить информацию о всех лицах (имя и т. Д.)?

ответ

0

Из того, что вы упомянули, я предполагаю, что у вас есть две вершины, называемые Person и Child.

В этом случае вы можете сохранить другой край, называемый Partners, или что-то в этом роде.
Теперь создайте край от Person к себе. Это поможет сохранить рекорд Partners.

Также есть краеугольный камень Children, который поддерживает ссылки с Person на Child вершины. Всегда рекомендуется не использовать значение по умолчанию E.


Чтобы получить ребенка от человека под названием 'Джон' со всеми своими партнерами, вы можете сделать:

select expand($f) let 
$a = (select expand(out()) from 
      (select expand(out('Partners')) from Person where personName='John')), 
$b = (select expand(out('Children')) from Person where personName='John'), 
$f = UNIONALL($a, $b) 

Смежные вопросы