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 edgeholds
toBox
顶点和Box
vertex has edgecontains
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”根级别键,因为
映射中没有其他键,添加额外级别似乎没有什么用处请考虑用GRMLIN脚本更新你的问题,创建一些示例数据,如图所示:好的建议。我添加了基本数据。谢谢@stephan。我用更多的数据和回答样本更新了我的问题。请更新你的答案,很好。如果我的属性多于id
,name
则应将所有属性作为by('xxx')
包含在内。是否有默认包含所有属性的解决方案?在sql中,您不会执行SELECT*FROM table
——您会显式地使用字段——因此单独包含它们通常是最好的。不过,有一些方法可以满足您的要求-您可以在这里阅读:嗨,如果我向其中一个顶点添加任何附加属性,则上面的查询将中断,因为以前的数据没有该属性。有什么建议吗?有很多方法可以解决。一个简单的方法是使用coalesce()
-