【问题标题】:Neo4j add huge number of relationships to already existing nodesNeo4j 向现有节点添加大量关系
【发布时间】:2017-03-22 09:35:27
【问题描述】:
我有具有数百万个节点的标签 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 等等...)?
【问题讨论】:
标签:
database
neo4j
cypher
relationships
large-data
【解决方案1】:
使用临时标签将事情标记为已完成,并在创建关系之前添加限制步骤。完成后,只需将标签从所有人身上移除即可。
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 或更多,具体取决于您的数据库设置。
【讨论】:
-
请注意,有一个 APOC 程序 apoc.periodic.iterate() 可以帮助批量处理,因此不必手动完成。我现在没有将其作为实际答案提交,因为我在使用 Tore 解决方案中的 :Processed 标签时自己尝试时遇到了一些潜在的错误。如果他们修复它,我会将其作为可行的解决方案提交。