Azure cosmosdb gremlin/tinkerpop-限制冗余的高效树状遍历结果

Azure cosmosdb gremlin/tinkerpop-限制冗余的高效树状遍历结果,azure-cosmosdb,gremlin,tinkerpop,Azure Cosmosdb,Gremlin,Tinkerpop,我有以下情况: 我正在尝试生成类似以下结果集的内容: [ { node: A, tags: [T1.title, T2.title] }, { node: B, tags: [T2.title] } ] 但我能做的最好的事情是产生大量冗余数据: [ { node:A, tag: T1.title }, { node:A, tag: T2.title }, { node:B, tag: T2.title } ] 比如说: g.

我有以下情况:

我正在尝试生成类似以下结果集的内容:

[
  {
    node: A,
    tags: [T1.title, T2.title]
  },
  {
    node: B,
    tags: [T2.title]
  }
]
但我能做的最好的事情是产生大量冗余数据:

[ 
  { node:A, tag: T1.title }, 
  { node:A, tag: T2.title }, 
  { node:B, tag: T2.title } 
]
比如说:

g.V()
  .has('label','stuff').as('n')
  .outE('tagged').inV().values('title').as('x')
  .select('n', 'x')

我不知道重复、封盖或折叠是否能帮我解决问题

当问小精灵问题时,以小精灵语句的形式提供示例数据总是很有帮助的,可以复制/粘贴到控制台会话中:

g.addV('stuff').property('name','a').as('a').
  addV('stuff').property('name','b').as('b').
  addV('tag').property('title','t1').as('t1').
  addV('tag').property('title','t2').as('t2').
  addE('tagged').from('a').to('t1').
  addE('tagged').from('a').to('t2').
  addE('tagged').from('b').to('t2').iterate()
您可以使用组获取基于地图的格式:

gremlin> g.V().hasLabel('stuff').
......1>   group().
......2>     by('name').
......3>     by(out('tagged').values('title').fold())
==>[a:[t1,t2],b:[t2]]

美好的不过有两个问题-如果我想要整个顶点标记为“东西”,而不仅仅是名称,我有机会吗我想,要访问顶点道具,我需要像outE.inV一样,但是你似乎可以跳过它,如果你想要顶点本身,那么就传递一个空的by,而不是“name”,它获得了顶点文本的一个特定属性。如果需要更复杂的内容,还可以通过传递匿名遍历。第一个by的要点是对Gremlin说,这是我想要的地图键,也就是说,要分组。请注意,outE.inV刚刚退出。如果出于某些原因(例如,可能是边上的过滤器)关心边的属性,则只需执行outE.inV。这可能特定于Cosmos的实现,但保留为空会将顶点的关键点作为分组关键点。我的意思是,这有点道理,因为一个完整的顶点可能不能作为一个键工作-那么,你在查询中得到完整的顶点是作为键还是仅仅是id?在GraphSON 3.0中,完整的顶点只能作为键的一部分返回。如果他们只支持2.0,那么这可能是有意义的。也就是说,TinkerPop倾向于建议您不要在生产代码中返回完整的顶点-只返回您需要的数据,就像您不会在SQL中指定SELECT*FROM table一样-您只会键入您想要的字段。