Azure cosmosdb 具有嵌套顶点的Gremlin查询

Azure cosmosdb 具有嵌套顶点的Gremlin查询,azure-cosmosdb,gremlin,tinkerpop3,graph-traversal,Azure Cosmosdb,Gremlin,Tinkerpop3,Graph Traversal,我的用例是:Bagvertex has edgeholdstoBox顶点和Boxvertex has edgecontainsto水果顶点。这是三个顶点之间的父子关系 是否可以编写返回所有相关3个顶点的gremlin查询。例如,我需要通过id获取所有行李,包括Box顶点,并进一步向下到该行李id的水果顶点。在类似SQL的语法中,这是一个简单的从行李中选择*,其中id=1 样本结构: g.addV('bag').property('id',1).property('name','bag1').pr

我的用例是:
Bag
vertex has edge
holds
to
Box
顶点和
Box
vertex has edge
contains
to
水果
顶点。这是三个顶点之间的父子关系

是否可以编写返回所有相关3个顶点的gremlin查询。例如,我需要通过
id
获取所有行李,包括
Box
顶点,并进一步向下到该行李id的
水果
顶点。在类似SQL的语法中,这是一个简单的
从行李中选择*,其中id=1

样本结构:

g.addV('bag').property('id',1).property('name','bag1').property('size','12').as('1').
  addV('box').property('id',2).property('name','box1').property('width','12').as('2').
  addV('fruit').property('id',3).property('name','apple').property('color','red').as('3').
  addV('bag').property('id',4).property('name','bag2').property('size','44').as('4').
  addV('box').property('id',5).property('name','box2').property('width','14').as('5').
  addV('fruit').property('id',6).property('name','orange').property('color','yellow').as('6').
  addE('holds').from('1').to('2').
  addE('contains').from('2').to('3').
  addE('holds').from('4').to('5').
  addE('contains').from('5').to('6').iterate()
我想在查询顶点时获取
1
2
3
的所有属性

我想要以下格式的回复

“行李”:[{
“id”:“1”,
“名称”:“bag1”,
“大小”:“12”,
“盒子”:[{
“id”:“2”,
“名称”:“框1”,
“宽度”:“12”,
“水果”:[{
“id”:“3”,
“名称”:“苹果”,
“颜色”:“红色”
}]
}]
},
{
“id”:“4”,
“名称”:“bag2”,
“大小”:“44”,
“盒子”:[{
“id”:“5”,
“名称”:“框2”,
“宽度”:“44”,
“水果”:[{
“id”:“6”,
“名称”:“橙色”
“颜色”:“黄色”
}]
}]
}]


但不确定gremlin中是否可能出现类似情况,因为顶点之间没有隐式关系。

我可能会使用
project()
来实现这一点:

gremlin> g.V().hasLabel('bag').
......1>   project('id', 'name','boxes').
......2>     by('id').
......3>     by('name').
......4>     by(out('holds').
......5>        project('id','name','fruits').
......6>          by('id').
......7>          by('name').
......8>          by(out('contains').
......9>             project('id','name').
.....10>               by('id').
.....11>               by('name').
.....12>             fold()).
.....13>        fold())
==>[id:1,name:bag1,boxes:[[id:2,name:box1,fruits:[[id:3,name:apple]]]]]
==>[id:4,name:bag2,boxes:[[id:5,name:box2,fruits:[[id:6,name:orange]]]]]

我省略了“bags”根级别键,因为
映射中没有其他键,添加额外级别似乎没有什么用处id
name
则应将所有属性作为
by('xxx')
包含在内。是否有默认包含所有属性的解决方案?在sql中,您不会执行
SELECT*FROM table
——您会显式地使用字段——因此单独包含它们通常是最好的。不过,有一些方法可以满足您的要求-您可以在这里阅读:嗨,如果我向其中一个顶点添加任何附加属性,则上面的查询将中断,因为以前的数据没有该属性。有什么建议吗?有很多方法可以解决。一个简单的方法是使用
coalesce()
-