示例查询
以下查询返回标签的计数
特定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.
答案 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
会更好。