【问题标题】:Add or update an edge in Gremlin在 Gremlin 中添加或更新边
【发布时间】:2019-09-02 10:51:48
【问题描述】:

我在 Azure CosmoDB 中有一个图形数据库,它存储顶点的相似程度,边包含它们相似程度的数值。

复杂之处在于我想通过增加相似度值来添加边或更新。这是我要添加的当前代码:

g.V('A').addE('similar').to(g.V('B')).property('x', 10)

如果边缘存在,我需要增加 X 的东西,如果不存在,则创建它。伪代码举例说明:

g.V('A').updateE('similar').to(g.V('B')).property('x', currentValue+2).ifNulll({g.V('A').addE('similar').to(g.V('B')).property('x', 10)})

有没有简单的方法来实现这一点?

【问题讨论】:

    标签: gremlin azure-cosmosdb-gremlinapi


    【解决方案1】:

    有一个known recipe 用于检查是否存在,通过使用模式fold().coalesce(unfold()...) 用于顶点和类似模式用于边缘。在您的情况下,您还想更新属性值。

    假设有 ID 为 AB 的顶点,并且边来自 A-->B,查询可能如下所示:

    g.withSack(0).V('B').as('toV').V('A').coalesce(
        outE('similar').where(inV().as('toV')),
        addE('similar').to('toV').property('similarity', 0)
    )
    .sack(assign).by('similarity').sack(sum).by(constant(2))
    .property('similarity', sack())
    

    说明:

    获取B(目标)顶点并保存参考,获取A(源)顶点。

    使用coalesce,检查是否存在连接它们的边,否则创建这样的边并将相似度设置为0。

    将“相似性”值分配给sack,并对附加值求和。

    最后,将新值存储在边缘属性中。

    另一个不使用sack的查询:

    g.V('B').as('toV').V('A').coalesce(
        outE('similar').where(inV().as('toV')),
        addE('similar').to('toV').property('similarity', 0)
    ).property('similarity', values('similarity').fold(10, sum))
    

    【讨论】:

    • 如果边不存在则创建边正常工作,但添加到相似性值时无效:无法在当前上下文中解析符号“分配”。 @ 第 1 行,第 156 列。无法在当前上下文中解析符号“总和”。 @ 第 1 行,第 186 列。无法在当前上下文中解析符号“sack”。可能是因为 CosmoDb 中的 Gremlin 版本较旧
    • 我也尝试了 .property('similarity', union(values('similarity'), constant(1.0)).sum()),正如另一个 StackOverflow 问题中所建议的那样,但它会抛出错误'无法在非原始类型 GraphTraversal 上创建 ValueField。'
    • 我没有 CosmosDB 环境可以检查。我已经用另一个不使用 sack() 的查询更新了答案。
    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2021-09-08
    • 1970-01-01
    • 2020-12-13
    • 2022-06-12
    • 2013-06-11
    相关资源
    最近更新 更多