你有正确的想法,但你需要一些简化。我会尝试分步进行。首先,每当我看到带标签的步骤时,我都会尝试看看是否有办法避免使用它们。在这种情况下,它们可以被分解:
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'))
遍历的可读性在前两行上有所提高,因为读者可以立即看到您想要在给定某些标准的情况下找到一条边,而这些标准仅由步骤标记方法暗示。接下来,我看了看coalesce()
。就目前而言,如果filter()
没有返回任何优势,那么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')