2016-03-06 32 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