我正在做下面的遍历。
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中完成这一切,尤其是你打算过滤结果,这可能会产生一些性能上的好处。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)))
这个想法是建立你的 Map
与 group()
然后将其分解为带有 unfold()
. 你可以通过以下方式过滤每个条目 where()
通过选择该条目的值,这是一个。List
的 "a2",然后在当地计算该项目。List
. 我用的是 limit(local,2)
以避免不必要的迭代,超过2,因为过滤器是 gte(2)
.
最简单的方法是用 findAll { }.
.groupBy { it.a3 }
.findAll { it.value.a2.size() > 1 }
.collectEntries { [(it.key): [a2: it.value.a2]] }
如果一些a2为空,那么 value.a2
也会计算为null,并过滤结果,而不需要显式的null检查。