gremlin-python在一次交易中删除多个顶点和边

时间:2018-11-22 14:21:29

标签: python gremlin amazon-neptune

我的环境:

  • gremlin-python
  • AWS Neptune

我的问题是:

1)考虑到我要删除的所有顶点和边的特定ID,我可以在一个事务中递归地删除顶点和边吗?目的是编写评估每个边缘的python函数,确定是否需要删除它,并链接一个gremlin查询以删除它。

例如:

要删除的顶点ID:

'vertex1', 'vertex2', 'vertex3'

要删除的边缘ID:

'edge1', 'edge2', 'edge3'

链接到g的python函数示例如下:

def chain_drop(g, vertex_id):
    g = g.V(vertex_id).drop()
    return g

我希望作为一个事务执行的链接查询理想上看起来像这样:

g.E('edge1').drop()
 .V('vertex1').drop()
 .E('edge3').drop()
 .V('vertex3').drop()
 .iterate() # execute all these queries as one transaction

上面的方法不起作用...似乎在我的gremlin查询中间无法.E('someid')。

稍微偏离主题,但我的最佳尝试(非递归)如下所示:

g.E('edge1', 'edge2', 'edge3').as_('edges')
 .V('vertex1', 'vertex2', 'vertex3').as_('vertices')
 .union(__.select('edges'),
        __.select('vertices'))
 .drop()
 .iterate()

任何帮助,不胜感激!

1 个答案:

答案 0 :(得分:2)

您不能完全按照自己的意愿去做,这有两个原因:

  1. 没有遍历E(),因为这只是开始步骤。
  2. drop()会杀死所有遍历器,因此后续的遍历V()将永远不会执行。

不过,您可以采用另一种方法,只需收集所有要删除的元素,然后删除这些元素即可。

g.V(1).aggregate('x').V(2).aggregate('x').select('x').unfold().drop()

请注意,放下顶点也会放下边缘,因此,如果要放下的那些边与要放下的顶点相连,则无需显式放下它们。