ArangoDB将Vertex和Edges复制到邻居

时间:2016-03-06 10:37:07

标签: graph deep-copy arangodb aql

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

#include <iostream>
#include <algorithm>
#include <vector>

int main() {

    using namespace std;

    vector<double> x = {1.8, 2.4, 3.3, 4.2, 5.6,7.9, 8.5, 9.3};
    vector<double> y = {0.5, 0.98, 1.8, 3.1, 5.6, 6.6, 9.3, 9.3, 9.5};

    vector<bool> z(y.size());
    for (int i = 0; i != y.size(); ++i)
        z[i] = binary_search(x.begin(), x.end(), y[i]);

    for (vector<bool>::const_iterator i = z.begin(); i != z.end(); ++i)
        cout << *i << " ";

    return 0;
}

1 个答案:

答案 0 :(得分:3)

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

应该{​​{3}}来解决这个问题。

我们会将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应该自己设置。我们将Alice的uniq属性更改为uniq,因此我们之后会有Sally

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

Sally 的最终插入必须在子查询之外,否则此语句将尝试在每个遍历的边缘插入一个Sally。我们无法在查询前面插入Saly - 在插入后不允许后续提取。