对于一个给定的顶点,我想计算多个聚合特征,这些特征彼此之间是不清楚的,我可以按照以下步骤进行操作。
g.V(81968)
.project('P1', 'P2', 'P3')
.by(__.bothE().has('dt_int', lt(999999999999)).values('orig_amt').mean())
.by(__.bothE().has('dt_int', lt(999999999999)).values('currency').dedup().count())
.by(__.bothE().has('dt_int', lt(999999999999)).values('weight').mean())
此查询的明显问题是,每次我要创建新的聚合功能(即__.bothE().has('trxn_dt', lt(999999999999))
,P1
,P2
)时,我都在计算P3
。当我尝试为具有大量边的顶点计算这组特征时,这一点变得很清楚。
有没有办法存储经过过滤的边缘集,然后选择它以备后用?像这样的伪查询:
g.V(81968)
.hold(__.bothE().has('dt_int', lt(999999999999))).as('edges')
.project('P1', 'P2', 'P3')
.by(select('edges').values('orig_amt').mean())
.by(select('edges').values('currency').dedup().count())
.by(select('edges').values('weight').mean())
这个问题可以回溯到我问的上一个问题(here),但是我正在寻求一种更通用的方法,并且我正在努力使其适应一组通用功能。
答案 0 :(得分:2)
您建议您“保留()”结果,而Gremlin拥有aggregate()
和store()
这样的东西,如果您需要List
,只需fold()
您的结果,然后根据需要project()
List
:
g.V(81968).bothE().has('dt_int', lt(999999999999)).
fold().
project('P1', 'P2', 'P3').
by(unfold().values('orig_amt').mean()).
by(unfold().values('currency').dedup().count()).
by(unfold().values('weight').mean())
通过这种方式,您不需要副作用或路径跟踪。