[英]Import a large (7 million rows) csv file into Neo4j faster
這是我在stackoverflow中的第一個問題。
我想在Neo4j數據庫中導入700萬行文件。
每行都有一個節點的信息,一個時間值(已經在數據庫中)。 對於每一行,我需要在數據庫中找到一個現有節點和一個現有時間值,然后在它們之間創建一個關系,並在其中添加值。
我想要一些建議以提高導入速度。 該架構為:
ON :Day(value) ONLINE
ON :Month(value) ONLINE
ON :SEGMENT(LinkName) ONLINE
ON :Timeperiod(value) ONLINE
ON :Year(value) ONLINE
我大約需要24小時才能導入大約200萬行。 (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;
正如Ryan所建議的那樣,我通過以下代碼提高了查詢速度:
CREATE CONSTRAINT ON (segment:SEGMENT) ASSERT segment.LinkRef IS UNIQUE
由於每個SEGMENT都有一個唯一的標識符(LinkRef),因此系統能夠更快地執行MATCH檢查。 添加此約束后,系統每分鍾可以處理10,000多個輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.