【问题标题】:Neo4J load CSV and create relationships doesn't import all dataNeo4J 加载 CSV 并创建关系不会导入所有数据
【发布时间】:2016-06-23 09:28:41
【问题描述】:

我正在使用以下 CSV 加载 Cypher 语句导入包含大约 3.5m 条记录的 csv 文件。但它只进口约3.2m。所以大约有 300000 条记录没有被导入。

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM ("file:///path/to/csvfile.csv") as line
CREATE (ticket:Ticket {id: line.transaction_hash, from_stop: toInt(line.from_stop), to_stop: toInt(line.to_stop), ride_id: toInt(line.ride_id), price: toFloat(line.price)})
MATCH (from_stop:Stop)-[r:RELATES]->(to_stop:Stop) WHERE toInt(line.route_id) in r.routes
CREATE (from_stop)-[:CONNECTS {ticket_id: ID(ticket)}]->(to_stop)

请注意,停止节点已经在单独的导入语句中创建。

当我只创建节点而不创建关系时,它能够导入所有数据。相同的导入语句适用于较小的相同格式 csv 数据集。

我尝试了两次,以确保它不会被意外终止。

Neo4J 中是否存在节点到关系限制?或者还有什么其他原因?

Neo4J version: 3.0.3 size of database directory is 5.31 GiB.

【问题讨论】:

    标签: csv neo4j cypher


    【解决方案1】:

    这可能是因为每当MATCH 对某行不成功时,对该行的整个查询(包括第一个CREATE)也会失败。

    另一方面,OPTIONAL MATCH 的失败不会中止对一行的整个查询。试试这个:

    USING PERIODIC COMMIT 1000
    LOAD CSV WITH HEADERS FROM ("file:///path/to/csvfile.csv") as line
    CREATE (ticket:Ticket {id: line.transaction_hash, from_stop: toInt(line.from_stop), to_stop: toInt(line.to_stop), ride_id: toInt(line.ride_id), price: toFloat(line.price)})
    OPTIONAL MATCH (from:Stop)-[r:RELATES]->(to:Stop)
    WHERE toInt(line.route_id) in r.routes
    FOREACH(x IN CASE WHEN from IS NULL THEN NULL ELSE [1] END |
      CREATE (from)-[:CONNECTS {ticket_id: ID(ticket)}]->(to)
    );
    

    FOREACH 子句使用了一种有点迂回的技术,如果OPTIONAL MATCH 成功了一行,则仅CREATE 关系。

    【讨论】:

    • 嗯,这很有趣。谢谢你的提示。但是,我不希望匹配失败(它不应该或存在数据完整性问题)。所以必须研究早期的导入。
    • 我用另一种方法更新了我的答案。您不想尝试其中之一,您至少应该测试您的假设,即MATCH/WHERE 子句总是成功的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多