Neo4j 向现有节点添加大量关系
Neo4j add huge number of relationships to already existing nodes
我的标签 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 等...)?
使用临时标签将事情标记为已完成,并在创建关系之前添加限制步骤。全部完成后,将每个人的标签移除即可。
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
这将 return 已处理的行数(通常为 50000);当它 return 小于 50000(或任何你设置的限制)时,你就完成了。 运行 这家伙然后:
MATCH (n:Processed)
WITH n LIMIT 50000
REMOVE n:Processed
RETURN COUNT(*) AS processed
直到你得到小于 50000 的结果。你可以将所有这些数字调到 100000 或更多,这取决于你的数据库设置。
我的标签 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 等...)?
使用临时标签将事情标记为已完成,并在创建关系之前添加限制步骤。全部完成后,将每个人的标签移除即可。
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
这将 return 已处理的行数(通常为 50000);当它 return 小于 50000(或任何你设置的限制)时,你就完成了。 运行 这家伙然后:
MATCH (n:Processed)
WITH n LIMIT 50000
REMOVE n:Processed
RETURN COUNT(*) AS processed
直到你得到小于 50000 的结果。你可以将所有这些数字调到 100000 或更多,这取决于你的数据库设置。