有没有一种方法可以在计算特征之前存储滤波后的边缘

时间:2020-06-05 18:19:49

标签: gremlin

对于一个给定的顶点,我想计算多个聚合特征,这些特征彼此之间是不清楚的,我可以按照以下步骤进行操作。

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))P1P2)时,我都在计算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),但是我正在寻求一种更通用的方法,并且我正在努力使其适应一组通用功能。

1 个答案:

答案 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())

通过这种方式,您不需要副作用或路径跟踪。