当前位置: 首页 > 知识库问答 >
问题:

如何在Gremlin/Tinkerpop 3中查询多个顶点及其关系的计数?

龙承德
2023-03-14

我正在使用Gremlin/Tinkerpop 3查询存储在TitanDB中的图形。

该图包含具有属性(例如“描述”)的用户顶点和表示用户之间关系的边。

我想使用Gremlin按属性获取1)用户和2)与其他用户(例如,id=123)的关系数(在这种情况下为任何类型)。为了实现这一点,我使用Gremlin 3中的匹配操作,如下所示:

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()

除非返回多个用户顶点,否则此查询工作正常,例如,因为多个用户的描述中有“开发者”一词。在这种情况下,关系中的计数是所有返回用户和id为123的用户之间的所有关系的总和,而不是每个返回用户的单个计数。

我是做错了什么还是这可能是一个错误?

PS:这个问题与我不久前在Tinkerpop 2中发布的一个类似查询有关,我在那里遇到了另一个问题:如何使用Gremlin选择可选的图形结构?

共有1个答案

韦高阳
2023-03-14

这是我使用的示例数据:

graph = TinkerGraph.open()
g = graph.traversal()
v123=graph.addVertex(id,123,"description","developer","name","bob")
v124=graph.addVertex(id,124,"description","developer","name","bill")
v125=graph.addVertex(id,125,"description","developer","name","brandy")
v126=graph.addVertex(id,126,"description","developer","name","beatrice")
v124.addEdge('follows',v125)
v124.addEdge('follows',v123)
v124.addEdge('likes',v126)
v125.addEdge('follows',v123)
v125.addEdge('likes',v123)
v126.addEdge('follows',v123)
v126.addEdge('follows',v124)

我的第一个想法是:“我们真的需要匹配步骤吗”?其次,当然,我想以TP3的方式编写这个,而不是使用lambda/闭包。我在第一次迭代中尝试了各种方法,我得到的最接近的是Daniel Kuppitz的内容:

gremlin> g.V().as('user').local(out().hasId(123).values('name')
              .groupCount()).as('relationships').select()
==>[relationships:[:]]
==>[relationships:[bob:1]]
==>[relationships:[bob:2]]
==>[relationships:[bob:1]]

所以在这里,我们使用局部步长将局部中的遍历限制为当前元素。这是可行的,但我们在选择中丢失了“user”标签。为什么groupCount是一个reductingbarriers步骤,这些步骤之后路径将丢失。

那么,让我们回到匹配。我想我可以尝试使用局部遍历来匹配步长遍历:

gremlin> g.V().match('user',__.as('user').has('description','developer'),
gremlin>             __.as('user').local(out().hasId(123).values('name').groupCount()).as('relationships')).select()
==>[relationships:[:], user:v[123]]
==>[relationships:[bob:1], user:v[124]]
==>[relationships:[bob:2], user:v[125]]
==>[relationships:[bob:1], user:v[126]]

好的-成功-这就是我们想要的:没有Lambda和本地计数。但是,这仍然让我感觉:“我们真的需要比赛步骤吗?”?这时,库皮茨先生终于得出了最终答案,该答案充分利用了分步法:

gremlin> g.V().has('description','developer').as("user","relationships").select().by()
              .by(out().hasId(123).values("name").groupCount())
==>[user:v[123], relationships:[:]]
==>[user:v[124], relationships:[bob:1]]
==>[user:v[125], relationships:[bob:2]]
==>[user:v[126], relationships:[bob:1]]

如您所见,可以链接(在某些步骤上)。第一个按顶点分组,第二个按“局部”组数处理分组的元素。

 类似资料:
  • 我在我的应用程序中使用gremlin REST服务器,我想在单个查询中为一个顶点创建多个边。我有从哪里创建边缘到单个顶点的顶点ID列表。 对于eg-g.V(12,13,14,15)。添加(“使用”,g.V(100)) 我已经尝试了许多遍历步骤,但无法使其工作。

  • 我的场景是在单个查询中在顶点之间添加多条边: 假设下面的节点:这些是我拥有的标签和ID 用户: 4100 歌曲: 4200 4355 4676 我必须在这些顶点之间建立边 我们通常可以通过在节点之间创建单条边来实现。如果我们想一次在50多个顶点之间创建边,这不是一种有效的方法。我正在使用Tinkerpop 3.0.1。

  • 小精灵:计算连接忽略边,在这个问题中,平行边在相反的方向,我想知道是否有方法找到从给定顶点以两种方式连接的顶点。我们知道重复数据消除()是为了避免重复。但是有没有办法找到具有平行边的顶点?

  • 我只是在玩Cosmos DB中的Graph API,它使用Gremlin语法进行查询。 我在图中有许多用户(顶点),每个用户对其他用户都有“知道”的属性。其中一些是外边缘(outE),另一些是内边缘(inE),具体取决于关系的创建方式。我现在尝试创建一个查询,该查询将返回给定用户(顶点)的所有“已知”关系。我可以通过以下方式轻松获取inE或outE的ID: 其中是我正在查询的用户的ID,但我无法提

  • 我是gremlin查询的新手。我有一个如下图,我的源顶点是P3,我想编写一个查询,它将获取所有父\祖先顶点(如果有一条从该顶点到P3的路径,其边缘类型为“包含”)类型为“部分”,并与它们关联一个Owner。所以在这种情况下,查询应该返回P1和P2,而不是P。 查询以创建样本数据: 这是我提出的查询,但遍历一旦找到一个具有相关所有者顶点的零件顶点,就会停止。如何更新它以返回P1和P2。 我还尝试了使

  • 如何在单个gremlin查询中合并两个顶点详细信息和边缘属性详细信息。 我有两个顶点: 使用Gremlin查询:g.v(2569472).out('\u label','WallPost')[0..1] 我正在获取UserPost顶点细节,我想在响应中添加UserVertex细节(即性别)和边缘属性细节(即EdgeMessage) 我试图将sql等价的innerjoin操作与sql2gremlin