首页 > 解决方案 > 为什么我的 apoc.refactor.cloneNodes 调用迭代并为图中的每个节点创建克隆?

问题描述

我打算克隆一个节点及其 3 个连接,但最终得到了多个克隆。

通过首先 MATCHing 主节点和相关节点的整个图,当我调用 apoc.refactor.cloneNodes 时,它似乎迭代了每个相关节点,而不仅仅是我想要克隆的主节点。结果是原始主节点和连接到预期相关节点的 3 个克隆(而不是预期的 1 个克隆)。

. . .

我创建了这个玩具图:

create (a:Node {description:"Spider Man Series"})
create (b:Node {description:"Spidey"})
create (c:Node {description:"Doc Oc"})
create (d:Node {description:"Venom"})
create (a)-[:BELONGS]->(b)
create (a)-[:BELONGS]->(c)
create (a)-[:BELONGS]->(d)
return a,b,c,d

我想克隆“蜘蛛侠系列”(及其关系):

match (a)-[c]-(b)
where a.description="Spider Man Series"
call apoc.refactor.cloneNodes([a],true) yield output
return a,b,c, output

但这会创建 3 个克隆(每个相关角色节点一个)。我猜它必须与 MATCH 有关系。

因为如果我只是限制我的 MATCH 没有关系,我会得到正确的克隆行为(原始的“蜘蛛侠系列”和克隆的“蜘蛛侠系列”具有克隆关系)。我很困惑,因为只有 1 个节点来自存储在 (a) 中的 WHERE 子句。

match (a)
where a.description="Spider Man Series"
call apoc.refactor.cloneNodes([a],true) yield output
return a,output

. . .

我尝试将相关节点限制为 2,而不是“蜘蛛侠系列”连接到的所有节点,但这也给了我每个相关节点的克隆:

match (a)-[c]-(b)
where a.description="Spider Man Series" and b.description in ['Spidey','Venom']
call apoc.refactor.cloneNodes([a],true) yield output
return a,b,c, output

标签: neo4jneo4j-apoc

解决方案


apoc.refactor.cloneNodestrue将获取您提供的节点并创建它们的副本,如果您将其作为第二个参数提供,则将关系从旧节点复制到新节点。

您会看到重复,因为正如您所说,从第一个查询返回多行 - 一种方法是在执行克隆之前访问节点DISTINCTa

match (a)-[c]-(b)
where a.description="Spider Man Series"
WITH distinct a as da
call apoc.refactor.cloneNodes([da],true) yield output
return output

在此处输入图像描述

但是,如果您想创建子图的完整副本,即有两个“蜘蛛侠系列”节点,每个节点都有三个字符节点,但是这两个子图没有相互连接,那么类似的东西apoc.refactor.cloneSubgraphFromPaths会更好:

match path=(a)-[c]-(b)
where a.description="Spider Man Series"
with collect(path) as paths
call apoc.refactor.cloneSubgraphFromPaths(paths) YIELD output
return output

在此处输入图像描述


推荐阅读