2016-03-31 54 views
2

我想使用neo4j-rest java api將大量數據從csv導入到neo4j。爲了避免內存不足異常,我使用定期提交,所以一個示例Java代碼將是:如何在使用定期提交從csv加載大數據時處理Neo4j中的事務回滾

// just to let you know what classes I am using 
    import org.neo4j.rest.graphdb.query.CypherTransaction; 
    import org.neo4j.rest.graphdb.query.CypherTransaction.Statement; 
    import org.neo4j.rest.graphdb.query.CypherTransaction.Result; 
    import org.neo4j.rest.graphdb.query.CypherTransaction.ResultType; 

private static final String CREATE_USER = 
    " USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM " + 
       "\"URL\" AS line WITH line\n" + 
       " CREATE (u:USER{id:toInt(line.customer_key)})"; 

//create USER Node 
Statement userStatement = new Statement(CREATE_USER, null, ResultType.rest, false); 

CypherTransaction periodicCommitTransaction = new CypherTransaction(dbPath, CypherTransaction.ResultType.rest); 
      periodicCommitTransaction.addAll(userStatement); 
      periodicCommitTransaction.commit(); 

現在我的問題是我應該如何處理事務回滾在定期提交?我知道定期提交語句不能在打開的事務中運行,並且在發送請求後應該立即提交。這意味着如果出現問題,無法回滾。我猜這是批量插入的常見問題,所以我應該如何處理這種回滾?我應該把我的db放在neo4j中,並嘗試從頭開始整個過程​​?有什麼想法嗎?

+0

使用的URL –

+0

一個參數是我使用它在我真正的代碼:-)我只是改變它把它在這裏的代碼。謝謝邁克爾。 – Lina

回答

1

正確,PERIODIC COMMIT默認提交每個x行。

您唯一能做的就是用:Importing等特定標籤標記您的「飛行中」節點,並在導入成功時刪除該標籤,或在出現問題時刪除所有節點及其關係。 但你必須批處理。

MATCH (n:Importing) 
WITH n LIMIT 10000 
DETACH DELETE n 
RETURN count(*); 
+0

謝謝邁克爾,以及我需要放下一切!在那種情況下,我認爲,我並不需要用任何標籤來標記它們。我仍然使用neo 2.2.5,所以DETACH在這裏還沒有工作。將使用: MATCHÑ WITH n個極限10000 OPTIONAL MATCH N- [R] - (+) DELETE N,R 一個問題。 {WITH n LIMIT 10000} - >這會按批處理嗎?我的意思是如果我有1000000個節點,那麼這將執行100次? – Lina

相關問題