1

以下查询将每个给定的输入顶点与其相邻顶点和它们之间的货币对分组,然后在每组分组边上使用两个聚合函数 sum 和 count。

gremlin> g.V([2367552, 2367728]).as("v0")
              .bothE().as("e")
              .otherV().as("v1")
              .select("e").values("currency").as("c")
              .select("v0","e","v1","c")
              .group()
                  .by(select("v0","v1","c"))
                  .by(fold().match(__.as("x").count(local).as("count"), 
                                   __.as("x").unfold().select("e").by("trxn_amt").sum().as("sum")).select("count","sum"))

==>{{v0=v[2367552], v1=v[2343088], c=USD}={count=1, sum=12082.0595703125}, {v0=v[2367728], v1=v[2338888], c=USD}={count=10, sum=358.8999938964844}}

虽然查询有效,但当我翻译成gremlinpython时,它给了我错误"TypeError: Object of type GraphTraversal is not JSON serializable"。(我无法解决这个问题,所以我认为最好修改导致问题的查询)。

在高层次上,我怀疑如果我改变输出格式,那么问题就可以解决。

主要问题是,有没有办法“扁平化”分组输出?

由此:

==>{{v0=v[2367552], v1=v[2343088], c=USD}={count=1, sum=12082.05}, ...}

进入这个:

==>{{v0=v[2367552], v1=v[2343088], c=USD, count=1, sum=12082.05}, ...}

或这个:

==>{{v[2367552], v[2343088], USD, 1, 12082.05}, ...}

编辑

原来这可能与输出格式无关。这似乎是group破坏它并导致“JSON 可序列化”错误的命令。奇怪的查询,但是有没有不使用 group 命令进行分组的方法?

4

1 回答 1

3

这就是我要做的:

g.V(2367552, 2367728).as("v0").bothE().as("c").otherV().as("v1").
  select("v0","c","v1").
    by().
    by(valueMap("currency","trxn_amt").by(unfold())).
  group().
    by(select("v0","c","v1").
         by().
         by(select("currency"))).
    by(select("c").select("trxn_amt").fold()).unfold().
  map(union(select(keys).unfold(),
            select(values).
            project("count","sum").
              by(count(local)).
              by(sum(local)).unfold()).
      group().
        by(keys).
        by(select(values)))

它应该是最高效的解决方案,因为只有前几个步骤(第 1-4 行)实际查询数据(并且只有必要的数据),查询的其余部分在内存中处理并且只是关于重组。

结果是一个简单地图的列表:

gremlin> g.V(2367552, 2367728).as("v0").bothE().as("c").otherV().as("v1").
......1>   select("v0","c","v1").
......2>     by().
......3>     by(valueMap("currency","trxn_amt").by(unfold())).
......4>   group().
......5>     by(select("v0","c","v1").
......6>          by().
......7>          by(select("currency"))).
......8>     by(select("c").select("trxn_amt").fold()).unfold().
......9>   map(union(select(keys).unfold(),
.....10>             select(values).
.....11>             project("count","sum").
.....12>               by(count(local)).
.....13>               by(sum(local)).unfold()).
.....14>       group().
.....15>         by(keys).
.....16>         by(select(values)))
==>[c:USD,count:1,v0:v[2367552],sum:12082.0595703125,v1:v[2343088]]
==>[c:USD,count:10,v0:v[2367728],sum:358.89999389648440,v1:v[2338888]]
于 2019-12-13T19:15:37.160 回答