【发布时间】:2016-06-02 20:53:05
【问题描述】:
这是我在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;
【问题讨论】:
-
你看过什么?如果您看过这些,请将它们添加到您的问题中?也许有趣? jexp.de/blog/2013/05/on-importing-data-in-neo4j-blog-series 还有:stackoverflow.com/questions/34487313/…。另外: - 猜测:google.co.uk/…
-
每秒大约 23 条记录?有趣(令人失望)吗?我希望有人可以帮助改进它?我希望速度提高 1 到 2 个数量级?
-
嗨瑞恩,感谢您的建议。对于第二个链接中的视频。我已经学会了在唯一的 LinkRef 上创建约束。现在速度快多了。 CREATE CONSTRAINT ON (segment:SEGMENT) ASSERT segment.LinkRef 是唯一的