使用Gremlin递归查询更简单的树状结构

时间:2018-02-28 21:31:12

标签: gremlin tinkerpop3

考虑以下数据:

g.addV('RootTopic').property('name', 'A').as('A')
.addV('RootTopic').property('name', 'M').as('M')
.addV('Topic').property('name', 'A1').as('A1')
.addV('Topic').property('name', 'A2').as('A2')
.addV('Topic').property('name', 'B1').as('B1')
.addV('Topic').property('name', 'B2').as('B2')
.addV('Topic').property('name', 'N1').as('N1')
.addV('Topic').property('name', 'N2').as('N2')
.addV('Topic').property('name', 'O1').as('O1')
.addE('refines').from('A').to('A1')
.addE('refines').from('A').to('A2')
.addE('refines').from('A1').to('B1')
.addE('refines').from('A1').to('B2')
.addE('refines').from('M').to('N1')
.addE('refines').from('M').to('N2')
.addE('refines').from('N2').to('O1')
.addE('refines').from('N2').to('O2')

我想要的是使用tree() - 步骤获得的东西:

g.V().hasLabel('RootTopic').repeat(out()).times(2).emit().tree()

但是,这会拉出整个顶点。在这种情况下我真正需要的是顶点的属性,例如这个名称,以便我们得到一个包含例如只是顶点的名称属性。

我知道如果我写.tree().by('name')我似乎得到了一个名称为关键字的树,但我试图找到一种方法可以让我选择例如Vertex的多个属性,例如只是某个具有某种特定元属性的属性。

这可能吗?

1 个答案:

答案 0 :(得分:3)

by()调制器不仅可以使用属性键值作为参数。您还可以传递匿名遍历,从而允许:

g.V().hasLabel('RootTopic').
  repeat(out()).times(2).
    emit().
  tree()
    by(values('name','k1','k2').fold())

如果输出更复杂,可以使用project()

g.V().hasLabel('RootTopic').
  repeat(out()).times(2).
    emit().
  tree()
    by(project('name','k1','degree').
         by('name').
         by('k1').
         by(both().count())

这里要点的一点是,通过匿名遍历,你可以开发出你想要的任何输出。