2016-03-31 10 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(); 

今、私の質問は、私は定期的にコミットしてトランザクションのロールバックを処理する方法ですか?私は、定期的なコミットステートメントはオープントランザクションでは実行できず、要求が送信された直後にコミットする必要があることを知っています。つまり、何か問題が生じた場合にロールバックする方法はありません。これはバッチ挿入の一般的な問題だと思います。どうすればそのようなロールバックを処理するのですか? neo4jにdbを落として、最初から全プロセスを開始すべきですか?何かご意見は?

+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はまだここでは働いていません。使用します:n個のLIMIT WITH MATCH nのオプションMATCH N- [R]を - () は、n、R もう一つ質問を削除します。 {WITH n LIMIT 10000} - >これはバッチとして機能しますか?私は1000000のノードを持っている場合、これは100回実行されますか? – Lina

関連する問題