带嵌套顶点的Gremlin查询

时间:2018-10-06 17:31:21

标签: azure-cosmosdb gremlin tinkerpop3 graph-traversal

我的用例是:Bag顶点具有边holdsBox顶点,而Box顶点具有边containsFruit顶点。因此,这是3个顶点之间的父子关系。

是否可以编写返回所有相关3个顶点的gremlin查询。例如,我需要通过id来获取所有Bags,包括Box顶点,然后进一步降到该Bag 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时,我想获取231的所有属性。

我想要以下格式的回复。

"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中是否可能出现类似情况,因为顶点之间没有隐式关系。

1 个答案:

答案 0 :(得分:2)

我可能会使用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]]]]]

由于Map中没有其他键,因此我省略了“ bags”根级别键,并且添加该额外级别似乎没有用。