过滤由Gremlin遍历和Groovy生成的列表。

问题描述 投票:0回答:2

我正在做下面的遍历。

g.V().has('Transfer','eventName','Airdrop').as('t1').
outE('sent_to').
inV().dedup().as('a2').
inE('sent_from').
outV().as('t2').
where('t1',eq('t2')).by('address').
outE('sent_to').
inV().as('a3').
select('a3','a2').
by('accountId').toList().groupBy { it.a3 }.collectEntries { [(it.key): [a2 : it.value.a2]]};

如你所见,我基本上是在做一个遍历,最后我用groovy和collectEntries 把结果汇总成我需要的样子,在这个例子中是由a3汇总的。结果是这样的。

==>0xfe43502662ce2adf86d9d49f25a27d65c70a709d={a2=[0x99feb505a8ed9976cf19e757a9536117e6cdc5ba, 0x22019ad32ea3adabae68003bdefd099d7e5e3886]} 

(这是好的,因为a2中的数值至少是2)

==>0x129e0131ea3cc16fe5252d7280bd1258f629f20f={a2=[0xf7958fad496d15cf9fd9e54c0012504f4fdb96ff]} 

(这不好,我想在我的列表中只返回那些a2至少有两个值的组合)

我试过在遍历本身中使用过滤器和额外的where步骤,但我一直没能做到。我不知道这是否是我应该在最后一行使用Groovy跳过的东西。如果有任何帮助或指导,我将非常感激

groovy gremlin
2个回答
4
投票

我不认为你需要掉进Groovy中才能得到你想要的答案。最好是在Gremlin中完成这一切,尤其是你打算过滤结果,这可能会产生一些性能上的好处。Gremlin有它自己的 group() 的步骤,以及过滤所产生的 Map:

g.V().has('Transfer','eventName','Airdrop').as('t1').
  out('sent_to').
  dedup().as('a2').
  in('sent_from').as('t2').
  where('t1',eq('t2')).by('address').
  out('sent_to').inV().as('a3').
  select('a3','a2').
    by('accountId').
  group().
    by('a3').
    by('a2').
  unfold().
  where(select(values).limit(local,2).count(local).is(gte(2)))

这个想法是建立你的 Mapgroup() 然后将其分解为带有 unfold(). 你可以通过以下方式过滤每个条目 where() 通过选择该条目的值,这是一个。List 的 "a2",然后在当地计算该项目。List. 我用的是 limit(local,2) 以避免不必要的迭代,超过2,因为过滤器是 gte(2).


0
投票

最简单的方法是用 findAll { }.

.groupBy { it.a3 }
.findAll { it.value.a2.size() > 1 }
.collectEntries { [(it.key): [a2: it.value.a2]] }

如果一些a2为空,那么 value.a2 也会计算为null,并过滤结果,而不需要显式的null检查。

© www.soinside.com 2019 - 2024. All rights reserved.