在同一指令中验证边和创建边 (gremlin python)
Verify edge and create edge in the same instruction (gremlin python)
我最初检查边是否存在和创建边的逻辑需要查询。我正在尝试在一条指令中验证和创建边缘。
这个查询似乎不起作用
ipdb> prop = self._graph.V('pppp').outE('friend').hasId('testEdge').as_('e').inV()
.hasId('dddd').select('e').
coalesce(__.property('testedder', 1111).fold().unfold(),
__.V('dddd'). as_('to_a').V('pppp').addE('friend').to('to_a')).
toList()
1) 合并的第一部分 - 更新边的 属性 工作正常
2) 合并的第二部分要么没有被调用,要么没有工作。它作为一个独立的查询工作。 'as'在匿名遍历中不起作用吗?
PS:我正在使用 AWS Neptune
你的想法是正确的,但你需要一些简化。我会尝试分步进行。首先,每当我看到带标签的步骤时,我都会尝试查看是否有办法避免使用它们。在这种情况下,它们可以分解出来:
g.V('pppp').outE('friend').
filter(hasId('testEdge').inV().hasId('dddd')).
coalesce(__.property('testedder', 1111).fold().unfold(),
__.V('dddd'). as_('to_a').V('pppp').addE('friend').to('to_a'))
遍历的可读性在前两行得到改善,因为 reader 可以立即看到您想要根据一些标准找到一条边,这仅由步骤标记方法暗示。接下来,我查看了coalesce()
。就目前而言,如果 filter()
returns 没有边缘,那么 coalesce()
将永远没有机会执行,这就是为什么 coalesce()
的第二部分永远没有机会为你工作.那么,让我们清理一下那部分:
g.V(1).outE('knows').
filter(hasId(6).inV().hasId(2)).
fold().
coalesce(unfold().property('testedder', 1111),
V('dddd').as_('to_a').V('pppp').addE('friend').to('to_a'))
如果不清楚为什么 fold()
和 unfold()
在它们所在的位置,您应该查看我对方法 的详细解释。因此,fold()
和 unfold()
在它们应该在的位置,coalesce()
现在应该根据边沿是否通过 filter()
来触发这两个条件。 coalesce()
的第一部分很好,但第二部分仍然需要一些工作,因为如果不需要的话,我想再次分解步骤标签:
g.V('pppp').outE('friend').
filter(hasId('testEdge').inV().hasId('dddd')).
fold().
coalesce(unfold().property('testedder', 1111),
addE('friend').from(V('pppp')).to(V('dddd')))
上面的 Gremlin 假定您知道 "pppp" 个顶点存在。如果你不这样做,那么你可以尝试(正如 Daniel Kuppitz 所建议的那样):
g.V('pppp').
not_(outE('friend').hasId('testEdge').
filter(inV().hasId('dddd')).
property('testedder', 1111)).as('p').
V('dddd').
addE('friend').from('p')
我最初检查边是否存在和创建边的逻辑需要查询。我正在尝试在一条指令中验证和创建边缘。
这个查询似乎不起作用
ipdb> prop = self._graph.V('pppp').outE('friend').hasId('testEdge').as_('e').inV()
.hasId('dddd').select('e').
coalesce(__.property('testedder', 1111).fold().unfold(),
__.V('dddd'). as_('to_a').V('pppp').addE('friend').to('to_a')).
toList()
1) 合并的第一部分 - 更新边的 属性 工作正常
2) 合并的第二部分要么没有被调用,要么没有工作。它作为一个独立的查询工作。 'as'在匿名遍历中不起作用吗?
PS:我正在使用 AWS Neptune
你的想法是正确的,但你需要一些简化。我会尝试分步进行。首先,每当我看到带标签的步骤时,我都会尝试查看是否有办法避免使用它们。在这种情况下,它们可以分解出来:
g.V('pppp').outE('friend').
filter(hasId('testEdge').inV().hasId('dddd')).
coalesce(__.property('testedder', 1111).fold().unfold(),
__.V('dddd'). as_('to_a').V('pppp').addE('friend').to('to_a'))
遍历的可读性在前两行得到改善,因为 reader 可以立即看到您想要根据一些标准找到一条边,这仅由步骤标记方法暗示。接下来,我查看了coalesce()
。就目前而言,如果 filter()
returns 没有边缘,那么 coalesce()
将永远没有机会执行,这就是为什么 coalesce()
的第二部分永远没有机会为你工作.那么,让我们清理一下那部分:
g.V(1).outE('knows').
filter(hasId(6).inV().hasId(2)).
fold().
coalesce(unfold().property('testedder', 1111),
V('dddd').as_('to_a').V('pppp').addE('friend').to('to_a'))
如果不清楚为什么 fold()
和 unfold()
在它们所在的位置,您应该查看我对方法 fold()
和 unfold()
在它们应该在的位置,coalesce()
现在应该根据边沿是否通过 filter()
来触发这两个条件。 coalesce()
的第一部分很好,但第二部分仍然需要一些工作,因为如果不需要的话,我想再次分解步骤标签:
g.V('pppp').outE('friend').
filter(hasId('testEdge').inV().hasId('dddd')).
fold().
coalesce(unfold().property('testedder', 1111),
addE('friend').from(V('pppp')).to(V('dddd')))
上面的 Gremlin 假定您知道 "pppp" 个顶点存在。如果你不这样做,那么你可以尝试(正如 Daniel Kuppitz 所建议的那样):
g.V('pppp').
not_(outE('friend').hasId('testEdge').
filter(inV().hasId('dddd')).
property('testedder', 1111)).as('p').
V('dddd').
addE('friend').from('p')