2016-11-08 1762 views
0

我拥有数百万个节点的人员和公司标签。 我正尝试创建一个关系: (person)-[:WORKS_AT]->(company)根据两个标签中存在的唯一公司编号属性。 我试图用下面的查询来做到这一点: MATCH (company:Company), (person:Person) WHERE company.companyNumber=person.comp_number CREATE (person)-[:WORKS_AT]->(company)
但这个查询需要很长时间才能执行并最终失败。 我有索引companyNumbercomp_number。 所以,我的问题是:它有一种方法来创建段的关系,例如(50000,然后再50000等...)?Neo4j将大量关系添加到已有的节点

回答

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(或任何你设定的限制)时,你都完成了。直到你得到的结果小于50000你或许可以把所有这些数字可达10或者更多,这取决于你的数据库设置

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

:运行这个家伙呢。

+0

请注意,有一个APOC过程[apoc.periodic.iterate()](https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_apoc_periodic_iterate),可以帮助批量处理它,因此它不会不必手动完成。由于我在使用a:Tore解决方案中使用a:Processed标签时自己尝试时遇到的一些潜在错误,因此我现在不会将其作为实际答案提交。如果他们修复它,我会提交它作为一个可行的解决方案。 – InverseFalcon