克隆节点
APOC 库包含一个可用于克隆节点的存储过程。
克隆节点和关系的存储过程
| 限定名称 | 类型 |
|---|---|
|
过程 |
示例
以下示例将更详细地解释此过程。
仅克隆节点
以下代码创建了一个包含 Foo 和 Bar 两个节点的图
CREATE (f:Foo{name:'Foo'}),(b:Bar{name:'Bar'})
以下代码创建了这两个节点的副本
MATCH (f:Foo{name:'Foo'}),(b:Bar{name:'Bar'})
CALL apoc.refactor.cloneNodes([f,b])
YIELD input, output, error
RETURN *
在上述查询中,input 是源节点 ID,output 是被克隆的节点,error 是可能出现的错误信息。
该查询将生成以下图表
克隆节点和约束
以下示例将演示当对带有约束的节点调用 apoc.refactor.cloneNodes 时会发生什么。
以下代码为所有具有特定标签的节点创建属性约束
CREATE CONSTRAINT ON (n:UniqueLabel) ASSERT n.key IS UNIQUE
以下代码创建一个 key 属性设置为 1 的节点
CREATE (:UniqueLabel {key: 1})
以下代码尝试克隆带有约束的节点
MATCH (n:UniqueLabel)
CALL apoc.refactor.cloneNodes([n])
YIELD error, output
RETURN error, output
上述查询的结果将报错,因为原始节点上存在唯一性约束。
| 错误 (error) |
|---|
输出 |
"节点(<NNN>)已存在,标签为 `UniqueLabel`,属性 `key` = 1" |
null |
跳过克隆节点上的属性
在克隆节点时可以排除某些属性。这可以通过在参数中指定 skipProperties 列表来实现。
在以下示例中,原始节点的 age 属性在克隆节点时被跳过。
以下代码创建一个节点
CREATE (f:Foo{name:'Bar', surname: 'Baz', age: 66})
以下代码克隆该节点,并跳过其 age 属性
MATCH (n:Foo)
CALL apoc.refactor.cloneNodes([n], false, ["age"])
YIELD output
RETURN properties(output) AS props
| props |
|---|
{ "surname": "Baz", "name": "Bar" } |