在单个投影内选择并排列多个结果

问题描述 投票:0回答:1

抱歉没有示例图。

我有一个有向非循环图映射,其中多个称为“曾祖父母”的节点具有到“祖父母”的边,“祖父母”具有到多个“父母”的边,又具有到多个“孩子”的边。

类似的东西,

greatgrandparent1 -> grandparent1 -> parent1 -> child1
greatgrandparent1 -> grandparent1 -> parent1-> child2 
greatgrandparent1 -> grandparent1 -> parent2 -> child3 
greatgrandparent1 -> grandparent1 -> parent2 -> child4

… 那么……

我从祖父母开始,一直走到有联系的曾祖父母。 也从祖父母到父母,然后到相连的孩子。

我需要一个返回如下所示内容的查询。

{‘greatgrandparent’:  ‘greatgrandparent1’ , ‘parent’ : ‘parent1’ , ‘children’ : '['child1', 'child2', …..]'}
{‘greatgrandparent’:  ‘greatgrandparent1’ , ‘parent’ : ‘parent2’ , ‘children’ : '['child3', 'child4', …..]'}
…..

….

到目前为止,我能够让每个孩子像这样单独排队,

{‘greatgrandparent’:  ‘greatgrandparent1’ , ‘grandparent’ : ‘grandparent1’, ‘parent’ : ‘parent1’ , ‘children’ : ‘child1’}
{‘greatgrandparent’:  ‘greatgrandparent1’  ‘grandparent’ : ‘grandparent1’, ,‘parent’ : ‘parent1’ , ‘children’ : ‘child2’}
{‘greatgrandparent’:  ‘greatgrandparent1’  ‘grandparent’ : ‘grandparent1’,  ‘parent’ : ‘parent2’ , ‘children’ : ‘child3’}
{‘greatgrandparent’:  ‘greatgrandparent1’  ‘grandparent’ : ‘grandparent1’,  ‘parent’ : ‘parent2’ , ‘children’ : ‘child4}

..

如何获取列表中的所有孩子?
我正在使用 amazon Neptune 和 gremlin_python。

g.V()
.has('grandparent', 'name', 'grandparent1’).as_(‘grandparent')
.repeat(timeLimit(1000).in()).until(hasLabel('greatgrandparent'))
.dedup().order().by('name').as_(‘greatgrandparent')
.select('grandparent').repeat(timeLimit(1000).out()).until(hasLabel(‘parent))
.dedup().order().by('name').as_(‘parent')
.repeat(timeLimit(1000).out()).until(hasLabel('children'))
.dedup().order().by('name').as_(‘children')
.select(‘greatgrandparent’,grandparent','parent', 'children').by(‘name’)
gremlin tinkerpop amazon-neptune gremlinpython
1个回答
0
投票

解决此问题的一种方法是研究

path
group
的使用。为了模拟关系(g-祖父母、祖父母、父母、孩子),我将使用航线数据集中的机场。首先让我们看一下
path
的简单用法,从
ZKE
开始,它将扮演我们曾祖父母的角色。

g.V().has('code','ZKE').
  repeat(out().simplePath()).
  times(3).
  path().
    by('code')

运行时我们得到

1   path[ZKE, YFA, YMO, YKQ]
2   path[ZKE, YFA, YMO, YTS]

为了保留这种关系,但将子项折叠到列表中,我们可以在查询中添加

group..by

g.V().has('code','ZKE').
  repeat(out().simplePath()).
  times(3).
  path().
    by('code').
  group().
    by(limit(local,3)).
    by(tail(local).fold())

这给了我们

1   {('ZKE', 'YFA', 'YMO'): ['YKQ', 'YTS']}

也许使用这些构建模块您可以实现您正在寻找的结果,

© www.soinside.com 2019 - 2024. All rights reserved.