通过要打印的起始节点对路径进行分组 - Gremlin

Group paths by starting node to print - Gremlin

我对 Gremlin 语言还很陌生,仍在学习它的基础知识。我想对源节点的输出进行分组。

例如,以 ToyGraph 为例,使用 graph = TinkerFactory.createModern()。假设对于每个软件,我想计算其创建者的平均年龄,我将不得不做类似的事情 g.V('software').in('created').mean(),但是这会给我所有软件的所有创建者的平均值,我将如何获得以下形式的输出: {softA:31.0,softB:40.6,...}。 我已经尝试了 group 子句和 aggregrate,但不确定如何去做。

这是一个很好的例子,说明您何时希望使用 project() 步骤。 project() 步骤将创建一个具有指定标签的值映射,从图中的当前位置开始。在这种情况下,我们找到所有 software 个顶点,然后 project() 个名称,并从每个 software 个顶点中老化。我在下面举了一个例子,其中还包括它发现的所有 age 值,以表明它正在正确计算 mean()

g.V().hasLabel('software').project('software', 'ages', 'mean_age').
by().
by(__.in('created').values('age').fold()).
by(__.in('created').values('age').mean())

==>[software:v[3],ages:[29,32,35],mean_age:32.0]
==>[software:v[5],ages:[32],mean_age:32.0]

您确实可以为此使用 group。查询的第一部分找到任何软件,然后小组计算创作者的平均年龄。

gremlin>    g.V().hasLabel('software').
......1>          group().
......2>            by('name').
......3>            by(__.in('created').values('age').mean()) 

==>[ripple:32.0,lop:32.0]                                                

为了验证我们得到了正确的答案:

gremlin>    g.V().hasLabel('software').
......1>          group().
......2>            by('name').
......3>            by(__.in('created').values('age').fold())    
   
==>[ripple:[32],lop:[29,32,35]]