将一个大的(700万行)csv文件更快地导入Neo4j

时间:2016-06-02 20:53:06

标签: csv neo4j

这是我在stackoverflow中的第一个问题。

我想在Neo4j数据库中导入一个700万行的文件。

每行包含节点信息,时间值(已在数据库中)。 对于每一行,我需要找到一个现有节点和数据库中的现有时间值,然后在它们之间创建一个关系,并相应地在其中添加值。

我想要一些提高进口速度的建议。架构是:

ON :Day(value)        ONLINE  
ON :Month(value)      ONLINE  
ON :SEGMENT(LinkName) ONLINE  
ON :Timeperiod(value) ONLINE  
ON :Year(value)       ONLINE  

导入约200万行需要24小时。 (1/3)我希望导入50个类似的文件因此我认为我需要更好的代码来提高速度。 分配的内存为1GB(默认设置),硬盘为SSD。

非常感谢!

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///../../Python/MAR15.csv" AS row WITH row
WHERE row.LinkRef IS NOT NULL
WITH row, toInt(SUBSTRING(row.Date, 0, 4)) AS y
MATCH (year:Year {value: y})
WITH row, year, toInt(SUBSTRING(row.Date, 5, 2)) AS m
MATCH (year)-[:CONTAINS]->(month:Month {value: m})
WITH row, month, toInt(SUBSTRING(row.Date, 8, 2)) AS d
MATCH (month)-[:CONTAINS]->(day:Day {value: d})
WITH row, day, toInt(row.TimePeriod) AS t
MATCH (day)-[:CONTAINS]->(timeperiod:Timeperiod {value: t}) 
##96 period per day, each period is 15 minutes
WITH row, timeperiod
MATCH(segment:SEGMENT {LinkRef: row.LinkRef})


CREATE (segment)-[trafficdata:TrafficData {
    AverageJT: row.AverageJT,
    AverageSpeed: row.AverageSpeed,
    Flow: row.Flow,
    DataQuality: row.DataQuality
    }]->(timeperiod)
SET segment.LinkLength = row.LinkLength;

1 个答案:

答案 0 :(得分:2)

正如Ryan所说,我通过以下代码提高了查询速度:

NameExist > 0

由于每个SEGMENT都有一个唯一标识符(LinkRef),因此系统能够更快地执行MATCH检查。 添加此约束后,系统每分钟可处理10,000多个输入。