代码之家  ›  专栏  ›  技术社区  ›  flq

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

  •  1
  • flq  · 技术社区  · 7 年前

    考虑以下数据:

    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') 我似乎得到了一棵名为键的树,但我正在尝试找到一种方法,允许我选择一个顶点的多个属性,或者仅选择具有特定元属性的某个属性。

    这可能吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   stephen mallette    7 年前

    这个 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())
    

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