我正在使用Gremlin / Tinkerpop 3来查询存储在TitanDB中的图形 .
该图包含具有属性的用户顶点,例如“description”,以及表示用户之间关系的edge .
我想使用Gremlin通过属性获得1)用户和2)向其他用户(例如,id = 123)获得关系的数量(在这种情况下为任何类型) . 为了实现这一点,我在Gremlin 3中使用了 match
操作,如下所示:
g.V().match('user',__.as('user').has('description',new P(CONTAINS,'developer')),
__.as('user').out().hasId(123).values('name').groupCount('a').cap('a').as('relationships'))
.select()
此查询工作正常,除非返回多个用户顶点,例如,因为多个用户在其描述中包含“developer”一词 . 在这种情况下,关系中的计数是所有返回用户与id为123的用户之间的所有关系的总和,而不是根据需要,每个返回用户的个人计数 .
我做错了什么或者这可能是错误的?
PS:这个问题与我前一段时间发布的有关Tinkerpop 2中类似查询的问题有关,我还有另一个问题:How to select optional graph structures with Gremlin?
1 回答
这是我使用的示例数据:
我的第一个念头是:“我们真的需要match步”吗?其次,当然,我想用TP3方式写这个,而不是使用lambda / closure . 我在第一次迭代中尝试了所有方式,而我得到的最接近的是Daniel Kuppitz这样的东西:
所以在这里我们使用local步骤将
local
内的遍历限制为当前元素 . 这有效,但我们在select
中丢失了"user"标签 . 为什么?groupCount
是ReducingBarrierStep
,在这些步骤之后路径将丢失 .好吧,让我们回到
match
. 我想我可以尝试使用local
进行match
步遍历:好的 - 成功 - 当Kuppitz先生闭上最后的答案时,那是好的,这个答案大量使用了by步骤:
如您所见,
by
可以链接(在某些步骤中) . 第一个by
按顶点分组,第二个by
用"local"groupCount
处理分组的元素 .