【问题标题】:ArangoDB - Swap _to and _from values for edge using AQLArangoDB - 使用 AQL 交换边缘的 _to 和 _from 值
【发布时间】:2023-04-04 05:56:02
【问题描述】:

是否有一种干净的方法可以使用 AQL 将 _to_from 值交换为边?根据Arango's documentation on Edges

要更改边缘端点,您需要删除旧文档/边缘并插入新的。其他字段可以像默认集合一样更新。

所以我能想出一个如下所示的查询:

FOR edge IN edge_collection
    FILTER [some criteria]
    LET tempEdge = KEEP(edge, ATTRIBUTES(edge, true))
    LET newEdge = MERGE([{'_key':edge._key}, {'_from':edge._to}, {'_to':edge._from}, tempEdge])
    REPLACE newEdge IN edge_collection
    RETURN NEW

为了稍微解释一下我自己的解决方案,我使用了ATTRIBUTES(edge, true) 函数来获取边缘上所有属性的名称,并且true 参数删除了内部属性(如_key_id_to 等)。阅读更多关于ATTRIBUTEShere的信息。

然后KEEP(edge, [attributes]) 函数返回一个新文档,该文档仅具有给定数组中指定的属性,在这种情况下,由于ATTRIBUTES 函数,它是除内部字段之外的所有内容。阅读更多关于KEEPhere的信息。

然后我使用MERGE 函数从原始边缘组合_key,交换_to_from 值,以及所有非内部属性。阅读更多关于MERGEhere的信息。

最后,我使用REPLACE 删除原始边缘并添加新边缘,就像 Arango 需要的那样。阅读更多关于REPLACEhere的信息。

就像我说的,这似乎可行,但 MERGE 尤其让人感觉做我所做的事情的方式是错误的。有没有更简单的方法来设置对象的值?例如,可以让我拨打类似于:tempEdge._from = edge._to?

【问题讨论】:

  • 声明 To change edge endpoints you would need to remove old document/edge and insert new one. 自 3.0 IIRC 以来已过时。这是过去的遗留物,需要清除。

标签: arangodb aql


【解决方案1】:

是的,有一个更简单的解决方案:

FOR edge IN edge_collection
    FILTER [some criteria]
    UPDATE edge WITH {_from: edge._to, _to: edge._from} IN edge_collection
    RETURN NEW

_from_to 可以更新(与系统属性_id_key_rev 相比),因此您不需要替换整个文档。并且由于UPDATE 将更改合并到现有文档中,您只需为_from_to 指定新值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多