2

我正在尝试复制一个顶点节点并在 ArangoDB 中保留它的关系。我收到“数据修改后访问”错误 (1579)。当我遍历源节点的边缘并在循环中插入边缘副本时,它不喜欢它。这是有道理的,但我正在努力弄清楚如何在单笔交易中做我想做的事。

var query = arangojs.aqlQuery`
        let tmpNode = (FOR v IN vertices FILTER v._id == ${nodeId} RETURN v)[0]
        let nodeCopy = UNSET(tmpNode, '_id', '_key', '_rev')
        let nodeCopyId = (INSERT nodeCopy IN 'vertices' RETURN NEW._id)[0]
        FOR e IN GRAPH_EDGES('g', ${nodeId}, {'includeData': true, 'maxDepth': 1})
            let tmpEdge = UNSET(e, '_id', '_key', '_rev')
            let edgeCopy = MERGE(tmpEdge, {'_from': nodeCopyId})
            INSERT edgeCopy IN 'edges'
`;
4

1 回答 1

3

这个问题有点类似于'In AQL how to re-parent a vertex' - 所以让我以类似的方式解释这一点。

应该使用 ArangoDB 2.8 模式匹配遍历来解决这个问题。

我们将复制AliceSally类似的关系:

let alice=DOCUMENT("persons/alice")
let newSally=UNSET(MERGE(alice, {_key: "sally", name: "Sally"}), '_id')
let r=(for v,e in 1..1 ANY alice GRAPH "knows_graph"
          LET me = UNSET(e, "_id",  "_key", "_rev")
          LET newEdge = (me._to == "persons/alice") ?
              MERGE(me, {_to:   "persons/sally"}) :
              MERGE(me, {_from: "persons/sally"})
          INSERT newEdge IN knows RETURN newEdge)
INSERT newSally IN persons RETURN newSally

因此,我们首先加载Alice. 我们UNSET应该自行设置 ArangoDB 的属性。我们将必须为 uniq 的属性更改为 uniq forAlice所以我们有一个Sally之后。

然后我们打开一个子查询来遍历ANYAlice 的第一级关系。在这个子查询中,我们想要复制边 - e。我们需要UNSET再次使用 ArangoDB 自动生成的文档属性。我们需要找出_fromand_to指向的哪一侧Alice并将其重新定位到Sally

的最终插入Sally 必须在子查询之外,否则该语句将尝试在我们遍历的每条边上插入一个 Sally。正如您已经发现的那样,我们无法在查询前面插入 Saly - 插入后不允许后续提取。

于 2016-03-07T14:14:46.957 回答