Gremlin查询到groupcount边,还返回最大/最新日期以及标识符

时间:2018-09-24 15:36:50

标签: azure-cosmosdb gremlin

我有一个简单的图形结构,如下所示:

事件---发生在------>位置

事件和位置顶点都具有name和id属性。 HappenedAt edge具有一个名为“ on”的日期属性(以刻度为单位)。

我在编写查询时遇到麻烦,该查询针对给定位置(因此从已知位置开始)返回该位置发生的所有不同事件的列表,以及每个事件发生的次数(即每个事件发生的最晚/最近日期。

理想情况下,给定位置的输出如下所示: 事件ID,计数,最近/最长日期

活动A,2,5/27/2018

活动B,2,7 / 1/2018

我可以单独获得组数和最大日期,但似乎无法正确地将查询合并到一个查询中以产生输出。

可能很简单,但是我对Gremlin和Graph数据库一般还是陌生的。任何帮助将不胜感激。

g.addV('event').property('id','e1').property('name','Event A').as('e1').
  addV('event').property('id','e2').property('name','Event B').as('e2').
  addV('location').property('id','l1').property('name','Location 1').as('l1').
  addV('location').property('id','l2').property('name','Location 2').as('l2').
  addE('happenedAt').from('e1').to('l1').property('on','5/27/2018').
  addE('happenedAt').from('e1').to('l1').property('on','4/1/2018').
  addE('happenedAt').from('e2').to('l1').property('on','6/5/2018').
  addE('happenedAt').from('e2').to('l1').property('on', '7/1/2018').iterate()

1 个答案:

答案 0 :(得分:2)

这是我想到的第一件事-可能还有其他解决方案:

gremlin> g.V().has('id','l1').
......1>   inE('happenedAt').
......2>   group().
......3>     by(outV().values('name')).
......4>   unfold().
......5>   project('event','count','mostRecent').
......6>     by(select(keys)).
......7>     by(select(values).count(local)).
......8>     by(select(values).unfold().values('on').max())
==>[event:Event B,count:2,mostRecent:7/1/2018]
==>[event:Event A,count:2,mostRecent:5/27/2018]

我在第2-3行的边缘上group()以获取唯一事件,因此基本上在第3行的末尾有一个Map,其中键是事件名称,值是该事件的“ happenedAt”边的列表。这就是您计算所需的原始数据。

在第4行,我将映射展开到该映射的条目,并将每个条目project()放入您所请求的数据结构的新映射中。请注意,在第7-8行中,我从List得到了select(values)条边线。这就是为什么我们在local中使用count(local)的原因,因为我们想计算List中的项目而不是List本身。同样,我们在第8行中的unfold() List上将“ on”属性值弹出边缘本身,以找到max()