首页 > 解决方案 > Gremlin 查询到 groupcount 边缘,并返回最大/最近日期以及标识符

问题描述

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

事件-----HappenedAt----->位置

Event 和 Location 顶点都具有 name 和 id 属性。HappenedAt 边缘有一个名为“on”的日期属性(以刻度为单位)。

我在编写查询时遇到问题,该查询对于给定位置(因此从已知位置开始)返回在该位置发生的所有不同事件的列表,每个事件发生的次数的计数(因此发生的组数边缘) 以及每个事件发生的最大/最近日期。

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

事件 A,2,2018 年 5 月 27 日

事件 B,2,2018 年 7 月 1 日

我可以自己获得组数和最大日期,但似乎无法正确获取查询,将它们组合成单个查询以产生该输出。

可能很简单,但总的来说,我对 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()

标签: azure-cosmosdbgremlin

解决方案


这是我首先想到的——可能还有其他解决方案:

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]

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

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


推荐阅读