克隆节点

APOC 库包含一个可用于克隆节点的存储过程。

克隆节点和关系的存储过程

限定名称 类型

apoc.refactor.cloneNodes(nodes LIST<NODE>, withRelationships BOOLEAN, skipProperties LIST<STRING>) - 克隆给定的 NODE 值及其标签和属性。可以使用 skipProperties 跳过任何 NODE 属性(注意:这仅跳过 NODE 值上的属性,而不跳过其 RELATIONSHIP 值)。

过程

示例

以下示例将更详细地解释此过程。

仅克隆节点

以下代码创建了一个包含 Foo 和 Bar 两个节点的图
CREATE (f:Foo{name:'Foo'}),(b:Bar{name:'Bar'})
apoc.refactor.cloneNodes.dataset
以下代码创建了这两个节点的副本
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

克隆节点和约束

以下示例将演示当对带有约束的节点调用 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

上述查询的结果将报错,因为原始节点上存在唯一性约束。

表 1. 结果
错误 (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
表 2. 结果
props

{ "surname": "Baz", "name": "Bar" }