Neo4j为已有节点添加了大量关系

时间:2016-11-08 16:52:33

标签: database neo4j cypher relationships large-data

我有标签Person和Company有数百万个节点。 我正在努力建立一种关系:  (person)-[:WORKS_AT]->(company)基于两个标签中都存在的唯一公司编号属性。 我试图用以下查询来做到这一点: MATCH (company:Company), (person:Person) WHERE company.companyNumber=person.comp_number CREATE (person)-[:WORKS_AT]->(company)
但查询执行时间太长,最终会失败。 我在companyNumbercomp_number上有索引。 所以,我的问题是:有没有办法按段创建关系,例如(50000,然后另一个50000等......)?

1 个答案:

答案 0 :(得分:0)

使用临时标签将事物标记为已完成,并在创建关系之前添加限制步骤。完成所有操作后,只需删除所有人的标签即可。

MATCH (company:Company)
WITH company
MATCH (p:Person {comp_number: company.companyNumber} )
WHERE NOT p:Processed
WITH company, p
LIMIT 50000
MERGE (p) - [:WORKS_AT] -> (company)
SET p:Processed
RETURN COUNT(*) AS processed

这将返回已处理的行的数量(通常为50000);当它返回小于50000(或你设置限制的任何东西)时,你就完成了。然后运行这个人:

MATCH (n:Processed)
WITH n LIMIT 50000
REMOVE n:Processed
RETURN COUNT(*) AS processed

直到得到小于50000的结果。您可以将所有这些数字转换为100000或更多,具体取决于您的数据库设置。