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

用project()和select()汇总Gremlin中的路径信息

  •  0
  • Gyromite  · 技术社区  · 6 年前

    我正在尝试编写一个Gremlin查询,它将遍历几个顶点,并返回叶子以及一些关于它到达那里所遵循的路径的信息。

    用一个例子很容易解释:

    # Sample graph diagram
    # 1 --> 2* --> 3* --> 4
    #  \     \---> 5* --> 6
    #   \-> 7
    
    # Create sample graph
    g.addV('V').as('1').property('id','1').property('notable',false)
     .addV('V').as('2').property('id','2').property('notable',true)
     .addE('E').from('1')
     .addV('V').as('3').property('id','3').property('notable',true)
     .addE('E').from('2')
     .addV('V').as('4').property('id','4').property('notable',false)
     .addE('E').from('3')
     .addV('V').as('5').property('id','5').property('notable',true)
     .addE('E').from('2')
     .addV('V').as('6').property('id','6').property('notable',false)
     .addE('E').from('5')
     .addV('V').as('7').property('id','7').property('notable',false)
     .addE('E').from('1')
    

    out() 尽可能使用 as() .

    g.V('1')
    .out()
    .until(out().count().is(0))
    .repeat(
        optional(has('notable', true).as("notables"))
        .out()
    )
    .project('Id','NotableAncestors')
    .by(id())
    .by(coalesce(
        select('notables').unfold().id(), inject([])
    ))
    

    [
        {
            "Id": "7",
            "NotableAncestors": []
        },
        {
            "Id": "4",
            "NotableAncestors": ["2", "3"]
        },
        {
            "Id": "6",
            "NotableAncestors": ["2", "5"]
        }
    ]
    

    NotableAncestors 作为一个数组,我只得到第一个值,因为 unfold() ,我得到一个数组,但它总是空的。

    [
        {
            "Id": "7",
            "NotableAncestors": []
        },
        {
            "Id": "4",
            "NotableAncestors": "2"
        },
        {
            "Id": "6",
            "NotableAncestors": "2"
        }
    ]
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   stephen mallette    6 年前

    我想你可以简化一点。首先要注意的是 as() 是一个步骤标签,您可以引用它来检查遍历过程中某个特定点上的遍历器,以便它不是真正的“收集”对象。还有一条路要走:

    gremlin> g.V('1').
    ......1>   repeat(out()).
    ......2>     emit(outE().count().is(0)).
    ......3>   project('Id','NotableAncestors').
    ......4>     by(id()).
    ......5>     by(path().unfold().has('notable',true).id().fold())
    ==>[Id:7,NotableAncestors:[]]
    ==>[Id:4,NotableAncestors:[2,3]]
    ==>[Id:6,NotableAncestors:[2,5]]
    

    out() 重复地远离顶点“1”,只发射你所关心的叶顶点。然后,我只是分析 path() 对于任何“显著的”顶点,都需要到达该叶并将其添加到 List 为了“名人”。

    推荐文章