【问题标题】:Summarize path information in Gremlin with project() and select()用 project() 和 select() 在 Gremlin 中总结路径信息
【发布时间】:2019-03-13 19:27:03
【问题描述】:

我正在尝试编写一个 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')

以下遍历从顶点 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 及其“显着”祖先的 ID 数组:

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

但是,我得到的不是NotableAncestors 是一个数组,而是第一个值,因为unfold() 将数组展平为其中的第一项,如下所示。或者,如果我省略 unfold(),我会得到一个数组,但它始终是空的。

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

【问题讨论】:

    标签: gremlin tinkerpop3 azure-cosmosdb-gremlinapi


    【解决方案1】:

    我认为你可以简化一点。首先请注意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 以获取“NotableAncestors”`。

    【讨论】:

    • 完美,谢谢!我没有看到path() 在示例中使用太多,但这很有意义。在看到您如何从路径中提取 ID 后,我意识到我可以通过添加 fold() 步骤来完成我最初的尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多