Gremlin 将图形遍历的一部分的属性用作另一部分的过滤器

Gremlin 将图形遍历的一部分的属性用作另一部分的过滤器,gremlin,tinkerpop3,Gremlin,Tinkerpop3,我想接着说: 图的遍历部分 从第一次遍历获取属性 将其作为筛选器放入其他遍历 获取筛选值 当我在Gremlin控制台中运行下一步时: g = TinkerGraph.open().traversal() g.addV('a').property(id, 1).property('b',2) g.addV('a').property(id, 2).property('b',2).property('c',3) g.V(2).properties().key().limit(1).as('q').s

我想接着说:

  • 图的遍历部分
  • 从第一次遍历获取属性
  • 将其作为筛选器放入其他遍历
  • 获取筛选值
  • 当我在Gremlin控制台中运行下一步时:

    g = TinkerGraph.open().traversal()
    g.addV('a').property(id, 1).property('b',2)
    g.addV('a').property(id, 2).property('b',2).property('c',3)
    g.V(2).properties().key().limit(1).as('q').select('q')
    g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
    g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
    g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
    g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))
    
    我得到:

    gremlin>     g = TinkerGraph.open().traversal()
    ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
    gremlin>     g.addV('a').property(id, 1).property('b',2)
    ==>v[1]
    gremlin>     g.addV('a').property(id, 2).property('b',2).property('c',3)
    ==>v[2]
    gremlin>     g.V(2).properties().key().limit(1).as('q').select('q')
    ==>b
    gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
    ==>b
    gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
    ==>b
    gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
    ==>b
    gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))
    gremlin>
    
    因此,我可以看到:

  • 我的第一个遍历路径获取“b”属性
  • 直接使用文字“b”作品进行选择
  • 使用投影按“b”过滤不起作用
  • 所以问题是-在上述情况下,如何使用遍历的一部分的值作为其他遍历的过滤器?

    我的用例是我有
    原型
    顶点。我想绘制它的所有属性(可能是值),并找到与原型类似的所有顶点

    另一种方法是将查询存储在
    prototype
    的属性中,读取它并对其求值,以获得由它过滤的顶点

    我知道我可以做应用程序端的字符串连接,但我只想留在Gremlin的无代码部分,以获得适当的提供者可移植性

    更新:

    官方文件中的示例:

    gremlin> firstYear = g.V().hasLabel('person').
                               local(properties('location').values('startTime').min()).
                               max().next()
    ==>2004
    gremlin> l = g.V().hasLabel('person').as('person').
                       properties('location').or(has('endTime',gt(firstYear)),hasNot('endTime')).as('location').
                       valueMap().as('times').
                       select('person','location','times').by('name').by(value).by().toList()
    

    如果控制台中没有变量,我如何使用
    firstYear
    ,而是从查询中引用变量?

    我看到您的问题在Gremlin用户列表中得到了回答。[1] 为可能搜索相同问题的其他人复制此处的答案

    您需要的是:

    g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(eq('q'))
    
    有关了解where的不同使用模式的步骤,请参阅文档

    [1]