【问题标题】: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)
但查询执行时间过长并最终失败。 我在companyNumbercomp_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 标签时自己尝试时遇到了一些潜在的错误。如果他们修复它,我会将其作为可行的解决方案提交。
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多