在Gremlin中添加或更新边

在Gremlin中添加或更新边,gremlin,azure-cosmosdb-gremlinapi,Gremlin,Azure Cosmosdb Gremlinapi,我在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+

我在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)})
有没有一种简单的方法可以实现这一点?

有一种方法可以通过使用模式
fold()来检查是否存在。合并(展开()…)
用于顶点,类似模式用于边。在您的情况下,还需要更新属性值

假设存在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())
说明:

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))
获取B(目标)顶点并保存引用,获取A(源)顶点

使用
合并
,检查是否存在连接它们的边,否则创建此类边并将相似度设置为0

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

最后,将新值存储在edge属性上

不使用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))
通过使用模式
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())
说明:

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))
获取B(目标)顶点并保存引用,获取A(源)顶点

使用
合并
,检查是否存在连接它们的边,否则创建此类边并将相似度设置为0

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

最后,将新值存储在edge属性上

不使用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))

如果边不存在,则创建边是可行的,但添加到相似度值的操作不是:无法在当前上下文中解析符号“assign”。@第1行第156栏。无法在当前上下文中解析符号“sum”。@第1行第186栏。无法在当前上下文中解析符号“sack”。可能是因为CosmoDbI中的一个较旧版本的Gremlin也尝试了.property('similarity',union(values('similarity'),constant(1.0)).sum(),这是另一个StackOverflow问题中建议的,但它抛出错误“无法在非原始类型GraphTraversal上创建ValueField”。我没有Cosmodb环境来检查。我已使用另一个不使用sack()的查询更新了答案。如果边不存在,则创建边是可行的,但添加到相似度值的操作不是:无法在当前上下文中解析符号“assign”。@第1行第156栏。无法在当前上下文中解析符号“sum”。@第1行第186栏。无法在当前上下文中解析符号“sack”。可能是因为CosmoDbI中的一个较旧版本的Gremlin也尝试了.property('similarity',union(values('similarity'),constant(1.0)).sum(),这是另一个StackOverflow问题中建议的,但它抛出错误“无法在非原始类型GraphTraversal上创建ValueField”。我没有Cosmodb环境来检查。我已经用另一个不使用sack()的查询更新了答案。