我正在尝试使用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获取所有这些记录的最佳方法是什么,所以我可以拥有所有人员信息(姓名等)?
答案 0 :(得分:0)
根据您的提及,我假设您有两个名为Person
和Child
的顶点。
在这种情况下,您可以做的是维护另一个名为Partners
的边缘或类似的东西。
现在创建从Person
到自身的边缘。这有助于保持Partners
的记录。
此外,还有一个Children
边缘可以保持从Person
到Child
顶点的链接。始终建议不要使用默认的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 )