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

时间:2017-06-01 09:48:04

标签: titan gremlin tinkerpop3

示例查询
以下查询返回标签的计数 特定id(0)的“Asset”具有>>>
g.V()。hasId(0).repeat(下())。发射()。hasLabel( '资产')。计数()

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

我可以单独执行此操作,但我的要求是获取具有该标签的所有节点的计数“资产”。

所以我期待像

这样的事情

{v [0]:2
 {V [1]:1}
{V [2]:1}
  }
其中v [1]和v [2]在它们下面有一个节点,标签分别为“资产”,使整体计数v [0] = 2.

1 个答案:

答案 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会更好。