ArangoDB 将顶点和边复制到邻居

ArangoDB copy Vertex and Edges to neighbors

我正在尝试复制一个顶点节点并在 ArangoDB 中保留它的关系。我收到 "access after data-modification" 错误 (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'
`;

这个问题是 somewhat similar to 'In AQL how to re-parent a vertex' - 让我用类似的方式解释一下。

应该use the ArangoDB 2.8 pattern matching traversals解决这个问题。

我们将复制Alice成为Sally,关系相似:

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 的属性更改为 Alice 的 uniq,因此之后我们有一个 Sally

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

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