【问题标题】:Safe removal of vertexes in ArangoDB (using _ids)?安全删除 ArangoDB 中的顶点(使用 _ids)?
【发布时间】:2016-01-29 00:03:07
【问题描述】:

我正在使用 AQL 在 ArangoDB 中为顶点和边创建一些删除查询,并且我认为会有一种“安全”的方式来删除也会删除关联边的顶点。但我在文档或其他任何地方都找不到。以下是进行安全删除的最佳方法吗?

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

结合

REMOVE docKey IN DocumentClass

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

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    目前不通过 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
    

    【讨论】:

    • 谢谢。我在 Node 中使用 arangojs,所以我尝试了这个功能:github.com/arangodb/arangojs#graphvertexcollectionremove。但是,它似乎仍然没有删除相邻的边缘。知道我可能做错了什么吗?简单地使用 curl 调用 REST 接口确实会删除顶点和相邻边。
    • @ropeladder 该函数的行为在上一个次要版本中发生了变化,以匹配预期的行为。以前它只是使用可能导致边缘悬空的原始集合 API,现在它使用图形集合 API。你能确定你使用的是最新版本的 arangojs 吗?
    • 是的,不使用最新的 arangojs 是问题所在。谢谢!
    • 我在 ArangoDB 文档中看到:>“数据修改查询仅限于每次查询修改单个集合中的数据。这意味着数据修改查询不能通过单个查询修改多个集合中的数据。”我想知道文档是否已过时,是否确实可以在单个 AQL 查询中从多个集合中删除文档?
    • 是的,它同时被移除了。文档需要修复。
    【解决方案2】:

    我拼命想知道为什么@dothebart's answer 对我不起作用,直到我做了实验并发现了几件事:

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

    结果我不得不在查询中引用_key 并完全删除了绑定变量。我不确定这是错误还是设计。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多