我有一个简单的图形结构,如下所示:
事件---发生在------>位置
事件和位置顶点都具有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()
答案 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()
。