Gremlin python 合并边缘

Gremlin python coalesce for edges

我已经编写了一个脚本来避免为顶点和边创建重复项,但我在处理边时遇到了一些问题。 这是脚本:

g.V().has('dog', 'name', 'pluto').fold().\
    coalesce(__.unfold(), __.addV('dog').property('name', 'pluto')).store('dog').\
    V().has('person', 'name', 'sam').fold().\
    coalesce(__.unfold(), __.addV('person').property('name', 'sam')).store('person').\
    select('person').unfold().\
    coalesce(__.outE('has_dog').where(__.inV().has(T.id, __.select('dog').unfold().id())),
             __.addE('has_dog').to(__.select('person').unfold())).toList()

有了这个,我创建了新的两个顶点和新边。如果我再次执行它,则不会创建新的顶点和边。目前一切正常。

如果我将 'pluto' 更改为 'charlie' 以创建一个新的 'dog' 顶点,此脚本将创建新顶点,但 return 使用 [=30 创建的前一条边=].因此,如果 'person' 已经具有该关系,则脚本不会创建新关系。

我不明白的是代码

__.select('dog').unfold().id()

应该 return new/old 'dog' 顶点的 ID 并检查是否存在带有 'person' 的边。 如果我执行该脚本以获取 id 并将该脚本替换为 id,例如

__.outE('has_dog').where(__.inV().has(T.id, 42))

脚本正常工作并使用新的 'dog' 顶点创建边。

为什么用脚本获取 id 不起作用,但用整数可以?这没有意义,因为我应该有相同的结果。

谢谢。

您 运行 遇到的问题是 has 步骤不能进行任意遍历,但 where 步骤可以。您只需将 has 步骤重新表述为 where 步骤。 has 步骤中的任意遍历如果 returns 任何结果都被视为“真”。这是 Gremlin 的东西之一,看起来好像应该工作但实际上没有。

这是一个人为设计的示例,显示了应该对您的情况有所帮助的 where...by 模式。

gremlin> g.V(3).as('x').V().where(eq('x')).by(id)
==>v[3]

当您使用 store 时,where 步骤变成这样

gremlin> g.V(3).store('x').V().where(eq('x')).by(id).by(unfold().id())
==>v[3] 

所以你代码中的行最终会像这样

filter(__.inV().where(eq('dog')).by(T.id).by(unfold().id()))