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一样-您只会键入您想要的字段。