Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 为什么我的apoc.refactor.cloneNodes调用迭代并为图中的每个节点创建克隆?_Neo4j_Neo4j Apoc - Fatal编程技术网

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

Neo4j 为什么我的apoc.refactor.cloneNodes调用迭代并为图中的每个节点创建克隆?,neo4j,neo4j-apoc,Neo4j,Neo4j Apoc,我本打算克隆一个节点及其3个连接,但最终克隆了多个节点 通过首先匹配主节点和相关节点的整个图,当我调用apoc.refactor.cloneNodes时,它似乎迭代每个相关节点,而不仅仅是我要克隆的主节点。结果是原始主节点和连接到预期相关节点的3个克隆(而不是预期的1个克隆) 我创建了这个玩具图: create (a:Node {description:"Spider Man Series"}) create (b:Node {description:"Spidey"}) create (c:

我本打算克隆一个节点及其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
我想克隆“蜘蛛侠系列”(及其关系):

但这会创建3个克隆(每个相关角色节点一个)。我猜这一定是因为这场比赛有关系

因为如果我只是限制我的匹配而没有关系,我会得到正确的克隆行为(原始的“蜘蛛侠系列”和克隆的“蜘蛛侠系列”有克隆的关系)我很困惑,因为只有一个节点来自存储在(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

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

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

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

我认为在克隆之前查看您正在处理的结果会有所帮助。尝试该查询,但不使用cloneNodes()调用,只返回匹配的内容,并查看Neo4j浏览器中的Table results视图。现在请记住,每行执行密码操作。:thumbs up:Very help@InverseFalcon。谢谢
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