代码之家  ›  专栏  ›  技术社区  ›  Nikordaris

ArangoDB将顶点和边复制到邻居

  •  2
  • Nikordaris  · 技术社区  · 9 年前

    我试图复制一个顶点节点,并在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'
    `;
    
    1 回复  |  直到 9 年前
        1
  •  3
  •   dothebart    9 年前

    这个问题是 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
    

    因此,我们首先加载 爱丽丝 我们 UNSET ArangoDB应自行设置属性。我们将必须为uniq的属性更改为uniq 爱丽丝 所以我们有一个 俏皮话 之后

    然后我们打开一个子查询来遍历 ANY 爱丽丝的一级关系。在这个子方程中,我们要复制边- e 。我们需要 未设置 再次显示必须由ArangoDB自动生成的文档属性。我们需要找出 _from _to 指向 爱丽丝 并将其重新定位到 俏皮话 .

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