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()))
我已经编写了一个脚本来避免为顶点和边创建重复项,但我在处理边时遇到了一些问题。 这是脚本:
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()))