为什么我的 apoc.refactor.cloneNodes 调用会迭代并为图中的每个节点创建克隆?

Why does my apoc.refactor.cloneNodes call iterate and create clones for every node in graph?

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

通过首先匹配主节点和相关节点的整个图,当我调用 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

我想克隆 "Spider Man Series"(及其关系):

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 没有关系,我会得到正确的克隆行为(原始 "Spider Man Series" 和具有克隆关系的克隆 "Spider Man Series")。 我很困惑,因为只有 1 个节点是由存储在 (a) 中的 WHERE 子句产生的。

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

。 . .

我尝试将相关节点限制为 2 个,而不是 "Spider Man Series" 连接的所有节点,但这也为每个相关节点提供了一个克隆:

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

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

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

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

但是,如果您想创建子图的完整副本,即有两个 'Spider Man Series' 节点,并且每个节点都有三个字符节点,但是这两个子图没有相互连接,那么像 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