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