Orientdb 如何按链接的垂直方向分组

Orientdb 如何按链接的垂直方向分组,orientdb,Orientdb,我正在尝试使用OrientDB v2.0.2构建一个家谱数据库,如果它有什么不同的话。我有一个称为“Person”的顶点和一个称为“Child”的边,因此该边从父对象延伸到子对象 例如,假设“Jane”有两个孩子,有两个不同的伴侣,总共有4个。有了Janes rid,我想得到一份她所有孩子的名单,按他们的另一位家长分组。所以我想要的结果集应该是 with Bob with Joe -------- -------- Alpha Gamm

我正在尝试使用OrientDB v2.0.2构建一个家谱数据库,如果它有什么不同的话。我有一个称为“Person”的顶点和一个称为“Child”的边,因此该边从父对象延伸到子对象

例如,假设“Jane”有两个孩子,有两个不同的伴侣,总共有4个。有了Janes rid,我想得到一份她所有孩子的名单,按他们的另一位家长分组。所以我想要的结果集应该是

with Bob          with Joe
--------          --------
Alpha             Gamma
Beta              Delta
我可以通过一个简单的查询从12:6开始选择展开“Child”来得到孩子们,但是我现在很困惑该怎么做。还要注意的是,在某些情况下,另一个父项可能不为人所知,因此应与“未知”父项一起列在另一个组中

我通过pyorientpython使用数据库,因此我可以始终循环结果并手动将它们添加到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]

这是最好的吗?通过RID获取所有这些记录的最佳方式是什么,这样我就可以获得所有人员的信息、姓名等?

根据你提到的,我假设你有两个顶点,叫做Person和Child。 在这种情况下,您可以做的是维护另一个称为Partners之类的优势。 现在创建一条从人到自身的边。这将有助于保持合作伙伴的记录。 此外,还有一条子边,用于保持从人到子顶点的链接。始终建议不要使用默认的E

要检索名为“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 )