如何按链接顶点分组

时间:2015-03-05 02:19:23

标签: orientdb

我正在尝试使用OrientDB构建一个家族树数据库(如果它有所不同,则为v2.0.2)。我有一个名为' Person'和一个名为“儿童”的边缘(因此边缘离开父母并进入孩子)。

对于某些示例数据,让我们说'简'有2个孩子,有2个不同的伴侣(总共4个)。随着Janes的摆脱,我希望得到一份由其他父母分组的所有孩子的清单。所以我想要的结果集应该是

with Bob          with Joe
--------          --------
Alpha             Gamma
Beta              Delta

我可以通过简单的查询select expand( out('Child') ) from #12:6让孩子们接受,但是从这一点来看,我很难过。另请注意,在某些情况下,其他父母可能不知道,因此应列在另一个“未知”的组中。父节点。

我通过pyorient(python)使用数据库,所以我总是可以遍历结果并手动将它们添加到dict中的组中,但这听起来并不像是正确的解决方案。


编辑:经过多次试验和错误后,我想出了

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获取所有这些记录的最佳方法是什么,所以我可以拥有所有人员信息(姓名等)?

1 个答案:

答案 0 :(得分:0)

根据您的提及,我假设您有两个名为PersonChild的顶点。

在这种情况下,您可以做的是维护另一个名为Partners的边缘或类似的东西。
现在创建从Person到自身的边缘。这有助于保持Partners的记录。

此外,还有一个Children边缘可以保持从PersonChild顶点的链接。始终建议不要使用默认的E


要找回一个名叫John' John的人的孩子。与他的所有合作伙伴一起,你可以做到:

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 )