我需要编写一个gremlin查询,它可以对一组顶点上的2个或多个属性求和,并将它们作为单独的值返回.
声明1:
g.V().has('label1').values('p1').sum()
Run Code Online (Sandbox Code Playgroud)
这将返回所有'label1'顶点的p1值之和 - 假设为100
声明2:
g.V().has('label1').values('p2').sum()
Run Code Online (Sandbox Code Playgroud)
这将返回所有'label1'顶点的p2值之和 - 假设为200
声明3:
g.V().has('label1').values('p1','p2').sum()
Run Code Online (Sandbox Code Playgroud)
试过上面的声明,但正如预期的那样,它不会起作用,它将返回300,'label1'的所有p1和p2属性的总和
我需要一个查询,它将返回p1的总和,并在一个结果中返回总和p2.也许有一种方法可以"折叠"或将一组顶点折叠成一个顶点并通过某些规则聚合属性......在我的情况下为sum.
您可以按键对所有值进行分组:
g.V().has("label1").properties("p1","p2").
group().by(key).by(value().sum())
Run Code Online (Sandbox Code Playgroud)
编辑
证明它有效:
gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV().property("p1", 1).property("p2", 10).iterate()
gremlin> g.addV().property("p1", 2).property("p2", 20).iterate()
gremlin> g.V().properties("p1", "p2").group().by(key).by(value().sum())
==>[p1:3,p2:30]
Run Code Online (Sandbox Code Playgroud)
根据丹尼尔的原始答案,这是为我解决问题的查询:
g.V().has('label1').union(values('p1').sum(), values('p2').sum())
Run Code Online (Sandbox Code Playgroud)