【问题标题】:Recursively query simpler tree-like structures with Gremlin使用 Gremlin 递归查询更简单的树状结构
【发布时间】:2018-08-08 21:15:00
【问题描述】:

考虑以下数据:

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()-step 获得的东西:

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

但是,这会拉出完整的顶点。在这种情况下我真正需要的是顶点的属性,例如名称,这样我们就可以得到一棵树,其中包含例如只是 Vertex 的名称属性。

我知道,如果我写.tree().by('name'),我似乎会得到一棵以名称为键的树,但我正在尝试找到一种方法来让我选择例如顶点的多个属性,或者例如只是具有某些特定元属性的某个属性。

这可能吗?

【问题讨论】:

    标签: gremlin tinkerpop3


    【解决方案1】:

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

    这里要带走的要点是,通过匿名遍历,您可以开发几乎任何您想要的输出。

    【讨论】:

    • 非常好 - 把树弄成我需要的形状。对于新手来说,文档中的“by()”调制器实际产生的功率并不总是很清楚。
    • 我倾向于为 GraphTraversal 保持打开 javadoc,以便您可以看到所有可用的重载步骤 - tinkerpop.apache.org/javadocs/current/core/org/apache/tinkerpop/…
    • 如何在 cosmosdb 的上下文中获得相同的结果?当我尝试执行此查询时,我收到一个错误:GraphSON V1_0 serializer cannot serialize object of type: CollectionField to a primitive value to perform the desired Gremlin step
    • 不确定该错误是什么。也许你应该写一个新问题,提供更多关于错误和你想要做什么的上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2014-01-25
    • 1970-01-01
    相关资源
    最近更新 更多