首页 文章

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

提问于
浏览
1

我正在使用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 回答

  • 3

    这是我使用的示例数据:

    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)
    

    我的第一个念头是:“我们真的需要match步”吗?其次,当然,我想用TP3方式写这个,而不是使用lambda / closure . 我在第一次迭代中尝试了所有方式,而我得到的最接近的是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]]
    

    所以在这里我们使用local步骤将 local 内的遍历限制为当前元素 . 这有效,但我们在 select 中丢失了"user"标签 . 为什么? groupCountReducingBarrierStep ,在这些步骤之后路径将丢失 .

    好吧,让我们回到 match . 我想我可以尝试使用 local 进行 match 步遍历:

    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]]
    

    好的 - 成功 - 当Kuppitz先生闭上最后的答案时,那是好的,这个答案大量使用了by步骤:

    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]]
    

    如您所见, by 可以链接(在某些步骤中) . 第一个 by 按顶点分组,第二个 by 用"local" groupCount 处理分组的元素 .

相关问题