2016-03-06 80 views
2

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

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' 
`; 
+0

答案满足您的需求吗?如果是的话,你可以标记它接受?如果没有,缺少什么? – dothebart

回答

3

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

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

Sally的最后一个插入必须是子查询之外的,否则此语句将尝试在我们遍历的每条边上插入一个Sally。我们不能在查询前面插入Saly,因为您已经发现了 - 插入后不允许后续提取。

+0

感谢@dothebart寻求答案!这看起来会解决我的问题。我已经被其他东西淹没了,并没有在我的项目中回过神来。我现在接受它作为答案,如果我有任何问题,我会发布更新。 – Nikordaris