在Neo4j中合并两个无休止运行的节点

46qrfjad  于 2022-10-01  发布在  其他
关注(0)|答案(2)|浏览(189)

我是新手,我正在尝试合并两个节点,如下所述:
在CREATE SET上匹配(n:node2)合并(p:node1{p.id:n.id})在匹配集p.Column1=n.Column1,p.Column2=n.Column2,p.Column3=n.Column3,p.Column4=n.Column4,p.Column5=n.Column5,p.Column6=n.Column6,p.Column7=n.Column7上,p.Column1=n.Column1,p.Column2=n.Column2,p.Column3=n.Column3,p.Column5=n.Column5,p.Column6=n.Column6,p.Column7=n.Column7;

节点1包含具有8个属性的200万个节点,节点2包含具有8个属性的184000个节点。

我尝试将node2记录与node1合并,但此合并无休止地运行。有没有办法在更短的时间内运行这个合并命令?

ars1skjm

ars1skjm1#

当node1中不存在node2.id时,您正在将node2复制到node1中,并在node2中找到node1时更新node1中的列值(属性)。简而言之,您需要找到node1中没有找到的node2,然后执行合并。

MATCH (n:node2) 
WHERE NOT EXISTS( (:node1 {id: n.id})--() ) 
WITH n
MERGE (p:node1 {id:n.id})    //I fix a typo error. It should be id and not p.id
SET p += properties(n)

如果执行时间仍然很长,则安装APOC功能并在下面运行。它将以10K为单位进行批量合并。

call apoc.periodic.iterate(
    "
    MATCH (n:node2) WHERE NOT EXISTS( (:node1 {id: n.id})--() ) 
    RETURN n
    ",
    "
    WITH n
    MERGE (p:node1 {id:n.id})
    SET p += properties(n)
    ",
    {batchSize:10000}
)​
sqyvllje

sqyvllje2#

为了加快MERGE的速度,您应该在node1标签节点上为键id创建一个索引。就像这样:

CREATE INDEX id_index IF NOT EXISTS FOR (n:node1) ON (n.id)

其次,您的查询可以简化一点,而不是像这样手动设置ON CREATEON MERGE中的每个属性:

MATCH (n:node2) 
MERGE (p:node1 {id:n.id}) 
ON CREATE SET p.column1=n.column1,p.column2=n.column2, p.column3=n.column3,
p.column4=n.column4,p.column5=n.column5,p.column6=n.column6, p.column7=n.column7 
ON MATCH SET p.column1=n.column1,p.column2=n.column2, 
p.column3=n.column3,p.column4=n.column4,
p.column5=n.column5,p.column6=n.column6, p.column7=n.column7;

您可以简单地执行以下操作:

MATCH (n:node2) 
MERGE (p:node1 {id:n.id}) 
SET p += properties(n)

相关问题