带有嵌套顶点的 Gremlin 查询
Gremlin query with nested vertices
我的用例是:Bag
顶点有边holds
到Box
顶点和Box
顶点有边contains
到Fruit
顶点。所以它是3个顶点之间的父子关系。
是否可以编写 returns 所有相关 3 个顶点的 gremlin 查询。例如,我需要通过 id
获取所有包,包括 Box
顶点,并进一步向下获取该包 ID 的 Fruit
顶点。在类似于 SQL 的语法中,它是一个简单的 select * from bag where 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
.
时获取 1
、2
、3
的所有属性
我想要以下格式的回复。
"bags" : [{
"id":"1",
"name":"bag1",
"size" :"12",
"boxes":[ {
"id" : "2",
"name":"box1",
"width" : "12",
"fruits": [{
"id":"3",
"name" : "apple",
"color" : "red"
}]
}]
},
{
"id":"4",
"name":"bag2",
"size" : "44",
"boxes":[ {
"id" : "5",
"name":"box2",
"width" : "44",
"fruits": [{
"id":"6",
"name" : "orange"
"color" : "yellow"
}]
}]
}]
但不确定在 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" 根级密钥,因为 Map
中没有其他密钥,添加那个额外的级别似乎没有用。
我的用例是:Bag
顶点有边holds
到Box
顶点和Box
顶点有边contains
到Fruit
顶点。所以它是3个顶点之间的父子关系。
是否可以编写 returns 所有相关 3 个顶点的 gremlin 查询。例如,我需要通过 id
获取所有包,包括 Box
顶点,并进一步向下获取该包 ID 的 Fruit
顶点。在类似于 SQL 的语法中,它是一个简单的 select * from bag where 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
.
1
、2
、3
的所有属性
我想要以下格式的回复。
"bags" : [{
"id":"1",
"name":"bag1",
"size" :"12",
"boxes":[ {
"id" : "2",
"name":"box1",
"width" : "12",
"fruits": [{
"id":"3",
"name" : "apple",
"color" : "red"
}]
}]
},
{
"id":"4",
"name":"bag2",
"size" : "44",
"boxes":[ {
"id" : "5",
"name":"box2",
"width" : "44",
"fruits": [{
"id":"6",
"name" : "orange"
"color" : "yellow"
}]
}]
}]
但不确定在 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" 根级密钥,因为 Map
中没有其他密钥,添加那个额外的级别似乎没有用。