首页 > 解决方案 > 如何折叠与主顶点相关的顶点列表?

问题描述

我正在尝试检索一些身份顶点以及它们所属的任何组。图结构看起来像这样。请注意,组织有多个用户,我试图选择所有这些用户,并且每个用户都可以在多个组中。(这本质上是标准的用户-帐户-组安排。)

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]) 元组?

标签: javagroovygremlintinkerpop3

解决方案


使用您的示例数据,我更改了查询,例如,使用一个project步骤。如果这不是您想要的,我们可以迭代一下。

gremlin>   g.V(org).
......1>     project('i','g').
......2>       by(out().valueMap().fold()).
......3>       by(out().in().valueMap().fold()) 

==>[i:[[email:[alice@example.test]]],g:[[name:[starts with A]],[name:[five letters]],[name:[Example Inc]]]] 

如果您需要project从 org 应用到 f​​an out 的步骤,可以使用

gremlin>  g.V(org).
......1>     out().
......2>     project('i','g').
......3>       by(valueMap().fold()).
......4>       by(__.in().valueMap().fold())      

==>[i:[[email:[alice@example.test]]],g:[[name:[starts with A]],[name:[five letters]],[name:[Example Inc]]]] 

根据下面的讨论更新。使用该group步骤会产生从电子邮件到他们拥有的连接的分组。

gremlin> g.V(org).
......1>    out().
......2>    group().
......3>      by(values('email')).
......4>      by(__.in().values('name').fold()).
......5>    unfold()

==>alfred@example.test=[starts with A, Example Inc]
==>alice@example.test=[starts with A, five letters, Example Inc]  

推荐阅读