【问题标题】:NullPointerException while load csv using neo4j's apoc.periodic.iterate procedure使用 neo4j 的 apoc.periodic.iterate 过程加载 csv 时出现 NullPointerException
【发布时间】:2018-11-06 13:07:42
【问题描述】:

我正在使用 apoc.periodic.iterate 和 apoc.load.csv 加载 csv 文件,但我总是失败并说有 NullPointerException :

neo4j> CALL apoc.periodic.iterate('
       CALL apoc.load.csv("http://128.194.9.150:9999/On_Time_On_Time_Performance_2018_1.csv", {}) yield map as row return row
       ','
       MATCH (sc:City {name: row.OriginCityName}), (tc:City {name: row.DestCityName})
       MERGE (sc)-[f:Flight {flightDate: row.FlightDate, flightNum: toInt(row.FlightNum)}]->(tc)
       ', {batchSize:200, iterateList:true, parallel:true});
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| batches | total  | timeTaken | committedOperations | failedOperations | failedBatches | retries | errorMessages | batch                                                                                          | operations                                                   | wasTerminated |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2851    | 570131 | 888       | 313800              | 256400           | 1282          | 0       |               | {total: 2851, committed: 1569, failed: 1282, errors: {`java.lang.NullPointerException`: 1282}} | {total: 570131, committed: 313800, failed: 256400, errors: } | FALSE         |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

但是,当我使用 neo4j 的 load csv 命令加载此文件时,它们是正确的:

neo4j> LOAD CSV WITH HEADERS FROM "http://128.194.9.150:9999/On_Time_On_Time_Performance_2018_1.csv" as row
       MATCH (sc:City {name: row.OriginCityName}), (tc:City {name: row.DestCityName}) 
       MERGE (sc)-[f:Flight {flightDate: row.FlightDate, flightNum: toInt(row.FlightNum)}]->(tc)
       ;
0 rows available after 3395077 ms, consumed after another 0 ms
Created 255988 relationships, Set 511976 properties

csv 文件来自网站:https://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&DB_Short_Name=On-Time

我应该如何加载 csv 文件以避免 NullPointerException ?

【问题讨论】:

    标签: csv neo4j


    【解决方案1】:

    好吧,您显然更改了 transtat-data 的默认标头,但我假设您已经验证了这些标头。我立即看到的唯一问题是您的 apoc.periodic.iterate 中有 parallel:true。鉴于数据(与许多相同的起点/终点高度相关),这必然会导致问题。

    你可以试试 parallel:false 吗?这应该会给您与常规 LOAD CSV 完全相同的结果。

    希望对您有所帮助。

    问候, 汤姆

    更新

    CREATE CONSTRAINT ON (c:City) ASSERT c.name IS UNIQUE;
    
    LOAD CSV WITH HEADERS FROM "file:///488042997_T_ONTIME.csv" AS row
    WITH [row.ORIGIN_CITY_NAME, row.DEST_CITY_NAME] as names
    UNWIND names as cityName
    WITH DISTINCT cityName as theName
    CREATE (c:City {name: theName});
    
    # Added 328 labels, created 328 nodes, set 328 properties, completed after 3308 ms.
    
    USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM "file:///488042997_T_ONTIME.csv" AS row
    WITH DISTINCT row.ORIGIN_CITY_NAME as ocn, row.DEST_CITY_NAME as dcn, row.FL_DATE as fdate, toInteger(row.FL_NUM) as fnum
    MATCH (sc:City {name: ocn}), (tc:City {name: dcn})
    CREATE (sc)-[f:FLIGHT {flightDate: fdate, flightNum: fnum}]->(tc);
    
    # Set 1139338 properties, created 569669 relationships, completed after 38773 ms.
    

    【讨论】:

    • 我检查了 csv 文件头并使用“LOAD CSV”命令加载数据,加载进度正常,需要 4 个小时,我认为这需要太多时间。所以,我使用parallel:true选项希望通过并行快速加载文件,所以,如果我想加载具有很多共同开始/结束节点的关系数据,有没有办法加快进度?
    • 255988 个关系需要四个小时?这听起来非常过分,使用常规的 LOAD CSV 应该只需要一分钟左右。您是否有关于城市名称的(最好是唯一的)索引?
    • 我在 City.name 上添加一个索引并重新运行 load ,这次需要 33 分钟,但这也比你说的“一分钟”多。不知道是不是我neo4j的配置不对?我用的是3.3.4企业版,配置dbms.memory.heap.initial_size=5g/max_size=10g。有什么办法可以优化负载?
    • 您在该文件中有多少行(或将您在 transtats 上选择的确切内容发送给我,以便我获得相同的文件)?对于这么多的关系来说,33 分钟仍然听起来太长了。您是否设置了 USING PERIODIC COMMIT
    • 该文件有 570132 行,我从 transtats.bts.gov/… 下载它,带有 2018 年 1 月的数据。我从文件中提取城市并先前创建 :City 节点。我曾经使用“USING PERIODIC COMMIT”,提交批次从 10000 到 1000,没有明显区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多