【问题标题】:Group paths by starting node to print - Gremlin按要打印的起始节点对路径进行分组 - Gremlin
【发布时间】:2021-12-08 11:35:08
【问题描述】:
我对 Gremlin 语言还很陌生,仍在学习它的基础知识。我想对源节点的输出进行分组。
以 ToyGraph 为例,使用创建的
graph = TinkerFactory.createModern()。假设对于每个软件,我想计算其创建者的平均年龄,我必须做类似的事情
g.V('software').in('created').mean(),但是这会给我所有软件的所有创建者的平均值,我将如何获得表单的输出:
{softA:31.0,softB:40.6,...}。
我已经尝试过group 子句和aggregrate,但不确定如何去做。
【问题讨论】:
标签:
graph
gremlin
graph-databases
tinkerpop3
【解决方案1】:
这是一个很好的例子,说明您何时希望使用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]
【解决方案2】:
您确实可以为此使用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]]