【发布时间】:2021-05-31 10:17:20
【问题描述】:
我正在尝试检索一些身份顶点以及它们所属的任何组。图结构看起来像这样。请注意,组织有多个用户,我试图选择所有这些用户,并且每个用户都可以在多个组中。 (这本质上是标准的用户-帐户-组安排。)
alice = g.addV('Identity').property('email', 'alice@example.test').next()
alfred = g.addV('Identity').property('email', 'alfred@example.test').next()
org = g.addV('Organization').property('name', 'Example Inc').next()
[alice, alfred].each { g.V(org).addE('user').to(it).iterate() }
a = g.addV('Group').property('name', 'starts with A').next()
f = g.addV('Group').property('name', 'five letters').next()
[a, f].each { g.V(it).addE('member').to(alice).iterate() }
g.V(A).addE('member').to(alfred).iterate()
我的遍历的主要逻辑按预期工作:
gts.V(organization)
.out(ORG_USERS).as('i')
.in(GROUP_USERS)
.valueMap('name').with(tokens)
.as('g')
.select('i', 'g')
.by(__.valueMap('email').with(tokens))
.toList()
然而,这会产生一个带有键 i 和 g 的映射列表,特别是如果它位于多个组中,则会复制一个身份。相反,我想折叠组。我试过这样(还没有尝试对实际的组结果进行重复数据删除,只是按身份对它们进行分组):
gts.V(organization)
.out(ORG_USERS).as('i')
.in(GROUP_USERS)
.valueMap('name').with(tokens)
.fold()
.as('gs')
.select('i', 'gs')
.by(__.valueMap('email').with(tokens))
.toList()
然而,即使 fold() 接收到带有传入 Group-as-map 的遍历器,并且简单地返回 fold() 的结果会产生预期的嵌套列表,select('i', 'gs') 也会返回零结果。 (我可以select('gs'),但select('i') 和select('i', 'gs') 都是空的。)
我应该如何构造一个遍历,以便获得所需的 (Identity, List[Group]) 元组?
【问题讨论】:
-
在
fold步骤之后,之前的标签如i将丢失。您应该能够只重写一点并使用project。如果您可以添加一些基本的addE和addV步骤来构建示例图,从而更轻松地测试答案。 -
@KelvinLawrence 添加。在实际代码中,还有一个“组由组织定义”的反向引用;如果它会产生重大影响,我将对其进行编辑以包含它,但这似乎只是在
in(GROUP_USERS)之后挂一个.where(...)。
标签: java groovy gremlin tinkerpop3