1

我在 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)})

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

4

1 回答 1

0

有一个已知的方法fold().coalesce(unfold()...)可以通过使用顶点模式和边缘模式来检查存在性。在您的情况下,您还想更新属性值。

假设有 ID 为A和的顶点B,并且边从 开始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))
于 2019-09-02T17:49:39.833 回答