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

Safe removal of vertexes in ArangoDB (using _ids)?

我正在使用 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

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

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

programming language specific driver usually offers wrappers for the REST interfaces to these methods.

如果您想设计一个 AQL 查询来为您执行此操作,您必须知道一个顶点是否仅在一个图中使用,以及此删除可能涉及的边集合的数量。您可能希望使用 more modern graph traversals. Lets try to 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

我绞尽脑汁想找出为什么 对我不起作用,直到我做了实验并发现了几件事:

  • 我自动生成了 _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