2016-08-28 40 views
0

我正在嘗試將大數據集加載到neo4j-3中並查找選項。我發現了一個neo4j-import,但問題在於它僅用於初始加載。我必須每週加載2M記錄。 我嘗試通過shell加載,但有一些性能問題,我試着跟着。 1)預先創建約束。 2)在單獨的查詢中創建節點和關係。 3)堆空間8G 4)dbms.memory.pagecache 4GNeo4j大數據集的性能

很多次導入只是掛起,幾個小時內什麼都不做。

編輯 - CSV負載執行:

USING PERIODIC COMMIT 5000 
LOAD CSV WITH HEADERS 
FROM "file:///my_sds_39_joe.csv" 
AS row 
OPTIONAL MATCH (per:Person {UID : "Person."+row.player_cardnum}) 
WHERE per IS NULL 
MERGE (p:Person {CardNumber : row.player_cardnum}) 
ON CREATE SET p.Creation Date = timestamp(), p.Modification Date = timestamp() ; 
+1

你如何加載數據? –

+0

我正在使用來自neo4j-shell的Load CSV命令。 – user2813165

+0

@ user2813165請務必通過*編輯您的問題*來添加詳細信息,而不是通過在評論中嵌入(特別是代碼/查詢,這些評論相當難以理解)。我編輯了你的問題以包含評論中的csv-load,所以你應該現在刪除評論。 –

回答

0

編輯

在第二次看,好像你想實現某種條件邏輯到您的插入。

它看起來像你想要做的是弄清楚,如果一個人存在與一個UID(從row.player_cardnum一些串聯派生),並在這種情況下:人不存在和匹配失敗,MERGE a:具有由row.player_cardnum給出的CardNumber的人員。

如果這是您的目標,那麼您幾乎與您的查詢在那裏。問題在於你的WHERE條款。

瞭解WHERE子句與前面的MATCH,OPTIONAL MATCHWITH相鏈接,並且僅影響鏈接的子句。

對於那個OPTIONAL MATCH上的那個WHERE,每個將始終爲空,但更重要的是,您的行仍然存在,並且以下MERGE將始終發生在CSV中的所有行。這可能是您放緩的原因,因爲它正在爲所有行創建新的:Person節點。

如果你想完全空出一行時,在現有的OPTIONAL MATCH點擊:人(所以MERGE不會在這種情況下發生),你需要添加一個WITH條款,並確保您的WHERE子句適用於它而不是OPTIONAL MATCH

此外,請確保您對Person.UID和Person.CardNumber具有唯一約束或索引。至於UID匹配,我聽說索引不是在你匹配的東西的某種字符串連接時使用的,所以你可能需要先將它組合起來,然後用WITH傳遞它。

你最終的查詢應該是這樣的:

USING PERIODIC COMMIT 5000 
LOAD CSV WITH HEADERS 
FROM "file:///my_sds_39_joe.csv" 
AS row 
// first build the UID so we can take advantage of the index 
WITH row, "Person." + row.player_cardnum AS UID 
OPTIONAL MATCH (per:Person {UID : UID}) 
// the WHERE now applies to the WITH, which will filter out and null out the row when an OPTIONAL MATCH is found 
WITH row, per 
WHERE per IS NULL 
MERGE (p:Person {CardNumber : row.player_cardnum}) 
ON CREATE SET p.Creation Date = timestamp(), p.Modification Date = timestamp() ; 
+0

謝謝,我會嘗試這一個.. – user2813165

+0

首先用一些測試數據而不是LOAD CSV來測試它,以確保它符合你的期望,同時還有一個player_cardnum匹配一個:人,一個沒有。 – InverseFalcon