验证edge并在同一指令中创建edge(gremlin python)

时间:2018-09-26 05:15:35

标签: graph-databases gremlin gremlin-server amazon-neptune

我最初的逻辑是检查是否存在边缘并创建边缘。我试图在一条指令中验证并创造优势。

此查询似乎无效

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)合并的第一部分-更新Edges的属性可以正常工作

2)合并的第二部分未调用或不起作用。它正在作为一个独立的查询。 'as'在匿名遍历中不起作用吗?

PS:我正在使用AWS Neptune

1 个答案:

答案 0 :(得分:2)

您有正确的想法,但需要一些简化。我将尝试逐步进行。首先,每当看到带有标签的步骤时,我都会尝试查看是否有避免使用它们的方法。在这种情况下,可以将它们排除在外:

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()为何在哪里,您应该查看我对方法here的详细说明。因此,将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')