如何计算 Gremlin 中子树的聚合?
How to calculate aggregates for sub-trees in Gremlin?
我有一棵有很多层的树,其中叶节点可能有 属性 "count"。
我想计算每个子树的总数,并将这些值缓存在每个子树的根节点中。
这在 Gremlin 中可能吗?
您可以使用 sideEffect
来完成 - 这非常简单。我们设置了一个简单的树:
gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> v1 = g.addVertex()
==>v[0]
gremlin> v2 = g.addVertex()
==>v[1]
gremlin> v3 = g.addVertex([count:2])
==>v[2]
gremlin> v4 = g.addVertex([count:3])
==>v[3]
gremlin> v1.addEdge('child',v2)
==>e[4][0-child->1]
gremlin> v1.addEdge('child',v3)
==>e[5][0-child->2]
gremli
gremlin> v2.addEdge('child',v4)
==>e[6][1-child->3]
然后是完整树中每个子树的计算:
gremlin> g.V().filter{it.outE().hasNext()}.sideEffect{
gremlin> c=0;
gremlin> it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate()
gremlin> it.setProperty('total',c)
gremlin> }
==>v[0]
==>v[1]
gremlin> g.v(0).total
==>5
gremlin> g.v(1).total
==>3
该查询分解如下。先说这篇:
g.V().filter{it.outE().hasNext()}
获取树中不是叶节点的任何部分(即应该至少有一个出边不是叶节点)。其次,我们使用sideEffect
来处理一个子树的每个根:
it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate()
将每个子树的 "count" 属性 的总和存储在名为 c
的变量中。在这些情况下,elvis 运算符 (?:
) 有一些 groovy 优点可以检查没有 "count" 属性 和 return 为零的顶点。遍历树计算 c
后,您可以通过以下方式将 c
的值存储在子树的根节点中:
it.setProperty('total',c)
我有一棵有很多层的树,其中叶节点可能有 属性 "count"。 我想计算每个子树的总数,并将这些值缓存在每个子树的根节点中。 这在 Gremlin 中可能吗?
您可以使用 sideEffect
来完成 - 这非常简单。我们设置了一个简单的树:
gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> v1 = g.addVertex()
==>v[0]
gremlin> v2 = g.addVertex()
==>v[1]
gremlin> v3 = g.addVertex([count:2])
==>v[2]
gremlin> v4 = g.addVertex([count:3])
==>v[3]
gremlin> v1.addEdge('child',v2)
==>e[4][0-child->1]
gremlin> v1.addEdge('child',v3)
==>e[5][0-child->2]
gremli
gremlin> v2.addEdge('child',v4)
==>e[6][1-child->3]
然后是完整树中每个子树的计算:
gremlin> g.V().filter{it.outE().hasNext()}.sideEffect{
gremlin> c=0;
gremlin> it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate()
gremlin> it.setProperty('total',c)
gremlin> }
==>v[0]
==>v[1]
gremlin> g.v(0).total
==>5
gremlin> g.v(1).total
==>3
该查询分解如下。先说这篇:
g.V().filter{it.outE().hasNext()}
获取树中不是叶节点的任何部分(即应该至少有一个出边不是叶节点)。其次,我们使用sideEffect
来处理一个子树的每个根:
it.as('a').out().sideEffect{leaf -> c+=(leaf.getProperty('count')?:0)}.loop('a'){true}.iterate()
将每个子树的 "count" 属性 的总和存储在名为 c
的变量中。在这些情况下,elvis 运算符 (?:
) 有一些 groovy 优点可以检查没有 "count" 属性 和 return 为零的顶点。遍历树计算 c
后,您可以通过以下方式将 c
的值存储在子树的根节点中:
it.setProperty('total',c)