将一个标签的“属性密钥”合并到另一个标签中

时间:2019-05-02 13:58:01

标签: neo4j cypher

(:Label1 {emp_id: 1, name:"abc"})

(:Label1 {emp_id: 2, name:"xyz"})

(:Label1 {emp_id: 3, name:"pqr"})

INDEX ON :Label1(emp_id)

(:Label2 {emp_id: 1, car_name:"A"})

(:Label2 {emp_id: 1, car_name:"B"})

(:Label2 {emp_id: 1, car_name:"C"})

(:Label2 {emp_id: 2, car_name:"A"})

(:Label2 {emp_id: 2, car_name:"D"})

(:Label2 {emp_id: 3, car_name:"B"})

(:Label2 {emp_id: 3, car_name:"F"})

问题: 我只需要保留Label1,并且需要在Label1中合并键“ car_name”。怎么做?

注意: 两个标签中的节点数以百万计,Label2节点几乎是Label1的两倍

1 个答案:

答案 0 :(得分:2)

我要在您的位置执行的操作是创建一个新标签Car,其中将包含有关car_name的信息,并将其连接到标签为Label1的节点上。稍后,我将删除所有Label2节点,因为您不再需要它们。

由于您有数百万个节点,因此最好使用apoc.periodic.iterate进行批处理。

CALL apoc.periodic.iterate(
"MATCH (l:Label1), (l2:Label2)
 WHERE l.emp_id = l2.emp_id return l,l2",
"MERGE (c:Car{car_name: l2.car_name})
 MERGE (l)-[:HAS_CAR]->(c)",
 {batchSize:5000, iterateList:true})

现在删除所有带有标签2的节点

CALL apoc.periodic.iterate(
'MATCH (l:Label2) RETURN l',
'DETACH DELETE l',
{batchSize:1000,parallel:true})