【问题标题】:Neo4j Bulk Data - Create Relationship [OutOfMemory Exception]Neo4j 批量数据 - 创建关系 [OutOfMemory 异常]
【发布时间】:2017-01-28 05:49:39
【问题描述】:

我正在使用 Neo4j 程序在批量数据上创建关系。

最初使用加载 csv 插入所有数据。

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///XXXX.csv" AS row 
....

数据量太大[10M]但执行成功

我的问题是我想在所有节点之间创建多对多关系

但我在执行查询时遇到异常 [OutMemoryException]

MATCH(n1:x{REMARKS :"LATEST"}) MATCH(n2:x{REMARKS :"LATEST"}) WHERE n1.DIST_ID=n2.ENROLLER_ID CREATE (n1)-[:ENROLLER]->(n2) ;

我也已经创建了索引和约束

有什么想法可以帮帮我吗?

【问题讨论】:

    标签: java neo4j


    【解决方案1】:

    问题是您的查询是在一个事务中执行的,这会导致异常[OutMemoryException]。这是一个问题,因为此时定期交易的可能性只需要加载 CSV。因此,例如,您可以在首次加载后重新读取 CSV:

    USING PERIODIC COMMIT 500
    LOAD CSV WITH HEADERS FROM "file:///XXXX.csv" AS row 
    MATCH (n1:x{REMARKS :"LATEST", DIST_ID: row.DIST_ID})
    WITH n1
    MATCH(n2:x{REMARKS :"LATEST"}) WHERE n1.DIST_ID=n2.ENROLLER_ID 
    CREATE (n1)-[:ENROLLER]->(n2) ;
    

    或者用APOC library中的periodic committing试试这个技巧:

    call apoc.periodic.commit("
        MATCH (n2:x {REMARKS:'Latest'}) WHERE exists(n2.ENROLLER_ID)
        WITH n2 LIMIT {perCommit}
        OPTIONAL MATCH (n1:x {REMARKS:'Latest'}) WHERE n1.DIST_ID = n2.ENROLLER_ID
        WITH n2, collect(n1) as n1s
        FOREACH(n1 in n1s|
           CREATE (n1)-[:ENROLLER]->(n2)
        )
        REMOVE n2.ENROLLER_ID
        RETURN count(n2)", 
        {perCommit: 1000}
    )
    

    附: ENROLLER_ID 属性用作选择要处理的节点的标志。当然,你也可以使用另外一个标志,在处理过程中设置。

    或者更准确的apoc.periodic.iterate

    CALL apoc.periodic.iterate("
        MATCH (n1:x {REMARKS:'Latest'})
        MATCH (n2:x {REMARKS:'Latest'}) WHERE n1.DIST_ID = n2.ENROLLER_ID
        RETURN n1,n2
      ","
        WITH {n1} as n1, {n2} as n2 
        MERGE (n1)-[:ENROLLER]->(n2)
      ", {batchSize:10000, parallel:true}
    )
    

    【讨论】:

    • 感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多