安全删除ArangoDB中的顶点(使用_ids)?

时间:2016-01-29 00:03:07

标签: arangodb aql

我正在使用AQL为ArangoDB中的顶点和边创建一些删除查询,我认为会有一个" safe"删除顶点的方法也会删除相关的边。但我无法在文档或其他任何地方找到任何内容。以下是安全删除的最佳方法吗?

FOR e IN GRAPH_EDGES('EdgeClass',docId,{direction:'any',maxDepth:1, includeData:false})
    REMOVE e._key FROM EdgeClass

结合

REMOVE docKey IN DocumentClass

此外,有没有办法使用_id删除顶点(或边)或是否有必要使用_key?我无法让前者工作。

2 个答案:

答案 0 :(得分:3)

当前不通过AQL处理删除顶点。 The graph management interface offers vertex deletion functionality

programming language specific driver通常提供包装for the REST interfaces to these methods

如果您想设计一个为您执行此操作的AQL查询,您必须知道顶点是否仅用于一个图形,以及此删除可能涉及的边缘集合的数量。您可能想要使用more modern graph traversals。让我们尝试remove eve from the knows graph

LET keys = (
  FOR v, e IN 1..1 ANY 'persons/eve' GRAPH 'knows_graph' RETURN e._key)
     LET r = (FOR key IN keys REMOVE key IN knows) REMOVE 'eve' IN persons

所以,我们让the traversal give us the _key of all edges of Eve。然后,我们从knows边集合中删除所有这些边。之后我们自己删除了Eve。

但是,您可以很容易地看到,您必须针对您的情况制作此类查询。

编辑:人们可以这样做更优雅:

LET keys = (FOR v, e IN 1..1 ANY 'persons/eve' GRAPH 'knows_graph'
            REMOVE e._key IN knows)
  REMOVE 'eve' IN persons

答案 1 :(得分:0)

我不停地摸索,以找出为什么@dothebart's answer对我不起作用的原因,直到我进行了实验并发现了几件事:

  • 我已经自动生成了数字格式的_key
  • REMOVE 'eve' IN persons必需的字符串值
  • bindvar并未将@cartKey数字转换为字符串

因此,我不得不在查询中引用_key并完全删除了bindvars。我不确定这是错误还是故意的。

LET edgeKeys = (FOR v, e IN 1..1 ANY 'cart/2648355' GRAPH 'cart_graph' RETURN e._key)
LET r = (
  FOR key IN edgeKeys
    REMOVE key IN store_cart OPTIONS { ignoreErrors: true }
    REMOVE key IN product_cart OPTIONS { ignoreErrors: true }
  )
REMOVE '2648355' IN cart
相关问题