ArangoDB 将顶点和边复制到邻居
ArangoDB copy Vertex and Edges to neighbors
我正在尝试复制一个顶点节点并在 ArangoDB 中保留它的关系。我收到 "access after data-modification" 错误 (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'
`;
这个问题是 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 - 插入后不允许进行后续提取。
我正在尝试复制一个顶点节点并在 ArangoDB 中保留它的关系。我收到 "access after data-modification" 错误 (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'
`;
这个问题是 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 - 插入后不允许进行后续提取。