克隆节点

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
以下创建一个键属性设置为 1 的节点
CREATE (:UniqueLabel {key: 1})
以下尝试克隆带有约束的节点
MATCH (n:UniqueLabel)
CALL apoc.refactor.cloneNodes([n])
YIELD error, output
RETURN error, output

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

表 1. 结果
错误

输出

"已存在标签为 `UniqueLabel` 且属性 `key` = 1 的节点(<NNN>)"

跳过克隆节点上的属性

克隆节点时可以排除属性。这可以通过在参数中指定 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. 结果
属性

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