Gremlin 查询以查找所有节点的标签计数

Gremlin query to find the count of a label for all the nodes

示例查询
下面的查询returns me count of a label say "Asset " 对于特定的 id (0) 有 >>>
g.V().hasId(0).repeat(out()).emit().hasLabel('Asset').count()

但我需要找到图表中存在的 所有节点 的计数,条件如上。

我可以单独完成,但我的要求是获取所有具有该标签的节点的计数 'Asset'。

所以我期待

{ v[0]:2
{v[1]:1}
{v[2]:1}
}
其中 v[1] 和 v[2] 下面有一个节点,标签分别为 "Asset",使得总计数 v[0] =2 .

有几种方法可以做到这一点。这可能有点奇怪,但你可以使用 group()

g.V().
  group().
    by().
    by(repeat(out()).emit().hasLabel('Asset').count())

或者你可以用 select() 来做,然后你就不会在内存中构建一个大的 Map:

g.V().as('v').
  map(repeat(out()).emit().hasLabel('Asset').count()).as('count').
  select('v','count')

如果你想保持层次结构,你可以使用 tree():

g.V(0).
  repeat(out()).emit().
  tree().
    by(project('v','count').
         by().
         by(repeat(out()).emit().hasLabel('Asset')).select(values))

基本上您从顶点 0 得到一棵树,然后在其上应用 project() 以在树中的每个顶点构建该结构。我有一个不同的方法来使用 union 但我发现了一个可能的错误并且不得不想出一个不同的方法(实际上 Gremlin Guru,Daniel Kuppitz 想出了上述方法)。我认为 project 的使用更自然和可读,所以绝对是更好的方法。当然,正如 Kuppitz 先生所指出的,使用 project 会创建一个不必要的 Map(使用 select(values) 即可将其删除)。从这个意义上说,使用 union 会更好。