【问题标题】:Tinkerpop Gremlin group by key and get latestTinkerpop Gremlin 按键分组并获取最新信息
【发布时间】:2020-06-23 17:48:54
【问题描述】:

我正在创建 2 个用户(uid=1 & uid=2),每个用户有 2 个版本。

g.addV('user1').property('uid',1).property('version',1)
 .addV('user1').property('uid',1).property('version',2)
 .addV('user1').property('uid',2).property('version',1)
 .addV('user1').property('uid',2).property('version',2)

我想从每个 uid 中获取最新版本,我使用 uid 作为 groupBy 键并获取最新版本,如图所示

g.V().hasLabel('user1')
.group().by('uid').by(fold().order(Scope.local).by('version', Order.desc).unfold().limit(1)) //GraphTraversal<Vertex,Map<Object, Object>>
.flatmap(t -> t.get().values().iterator()) // convert to GraphTraversal<Vertex, Vertex>
//traverse out and get the path
.out('friend').path().by(elementMap())
  1. 是满足此要求的最佳方法吗?
  2. 将地图转换为平面地图内的顶点而不是使用 lambda 的 gremlin 首选方法是什么?假设我想在此之后添加更多步骤。

感谢任何帮助!

【问题讨论】:

  • 你能分享你想要得到的结果吗?你在寻找这样的东西吗? gremlin> g.V().group().by('uid').by(values('version').max()) ==>[1:2,2:2]
  • @KelvinLawrence 我想继续遍历 [g.V().group().by('uid').by(values('version').max())..out ('朋友').path().by(elementMap())]
  • 在这种情况下,您可以通过给该组一个标签 g.V().group('x').by('uid').by(values('version') 来使该组成为副作用.max()).out()....然后当你完成后,只需组装最终结果。
  • 是的,这就是我想要的。我假设第二组副作用也可以添加到输出中,对吗?例如 [g.V().group('x').by('uid').by(values('version').max()).out().group('x').by('uid' )。旁路()...]。谢谢!
  • 如果其他人有同样的问题,我会快速输入答案

标签: gremlin tinkerpop


【解决方案1】:

group 步骤有两种模式。如果没有标签,它会充当屏障,但如果有标签,它就会产生副作用。您可以使用您的数据使结果流经一个组,如下所示。

gremlin> g.V().group('x').by('uid').by(values('version').max())
==>v[42306]
==>v[42309]
==>v[42312]
==>v[42315]
==>v[42318]  

gremlin> g.V().group('x').by('uid').by(values('version').max()).cap('x')
==>[1:2,2:2]  

在决定要对组做什么之前,当然可以添加更多遍历步骤。如:

g.V().group('x').by('uid').by(values('version').max())out()...

【讨论】:

  • 我想将 .out() 应用于分组顶点 [1:2,2:2] 的结果,而不是所有顶点。这可能吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多