【问题标题】:ArangoDB copy Vertex and Edges to neighborsArangoDB 将顶点和边复制到邻居
【发布时间】:2016-03-07 22:14:46
【问题描述】:

我正在尝试复制一个顶点节点并将其关系保留在 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'
`;

【问题讨论】:

  • 答案是否满足您的需求?如果是的话,你能把它标记为接受吗?如果没有,缺少什么?

标签: graph deep-copy arangodb aql


【解决方案1】:

这个问题是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 - 插入后不允许后续提取。

【讨论】:

  • 感谢@dothebart 的回答!这看起来会解决我的问题。我已经被其他事情淹没了,在我的项目中还没有回到这个问题上。我现在会接受它作为答案,如果我有任何问题,我会发布更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多