2016-09-15 3 views
0

同様に、コードはインデックスを作成するためのもので、数百万のノードがそれぞれのメソッドです。これは、JSONファイルから新しいDBを作成するためのものです。単一のプロシージャ/プラグイン呼び出しで制約、インデックス、ノードを作成する方法は?

  1. 例外:

    私は次のようなエラーが発生したスキーマの更新を実行したトランザクションでデータの更新を実行できません。単純なトランザクションを開始し、それを閉じることはできません?

  2. しばらくすると、CreateNodes()メソッドでセッションがクラッシュしますか?
  3. スキーマの作成とデータの更新をどのように分離しますか?
  4. 同様の回答を得ようとする前に私が投稿した質問も参照してください。しかし成功はありません。 (私はGraphDatabaseServiceとBolt Driverの両方を注入しようとしましたが、結果は同じです)。 How to use neo4j bolt session/transaction in a procedure as plugin for neo4j server extension?
for (int command = 4; command < inputNeo4jCommands.size(); command++) { 

    log.info(inputNeo4jCommands.get(command)); 
    NEO4JCOMMANDS cmnd = NEO4JCOMMANDS.valueOf(inputNeo4jCommands.get(command).toUpperCase()); 
    log.info(NEO4JCOMMANDS.valueOf(inputNeo4jCommands.get(command).toUpperCase()).toString()); 

    if (NEO4JCOMMANDS.CONSTRAINT.equals(cmnd)) { 
     CreateConstraints1(); 
    } 

    if (NEO4JCOMMANDS.INDEX.equals(cmnd)) { 
     CreateIndexes(); 
    } 

    if (NEO4JCOMMANDS.MERGE.equals(cmnd)) { 
     log.info("started creating nodes........"); 

     CreateNodes(); 
    } 
} 
private void CreateIndexes1() { 

    log.info("Adding indexes....."); 
    log.info("into started adding index ......"); 
    try (Transaction tx = db.beginTx()) { 
     log.info("got a transaction .....hence started adding index ......"); 
     Iterator<Indx> itIndex = json2neo4j.getIndexes().iterator(); 

     while (itIndex.hasNext()) { 
      Indx indx = itIndex.next(); 
      Label lbl = Label.label(indx.getLabelname()); 

      Iterable<IndexDefinition> indexes = db.schema().getIndexes(lbl); 
      if (indexes.iterator().hasNext()) { 
       for (IndexDefinition index : indexes) { 
        for (String key : index.getPropertyKeys()) { 
         if (!key.equals(indx.getColName())) { 
          db.schema().indexFor(lbl).on(indx.getColName()); 
         } 
        } 
       } 
      } else { 
       db.schema().indexFor(lbl).on(indx.getColName()); 

      } 
      tx.success(); 
      tx.close(); 
     } 
     log.info("\nIndexes Created..................Retured the method call "); 
    } 

} 

答えて

0

コンテキストの多くは、あなたの質問およびコード例から欠落しているので、明確な答えを出すのは難しいです。コード例ではどこに例外がスローされますか? CreateNodes()メソッドはありません。そのため、失敗した理由(トランザクションが大きすぎるためOut of Memory Error?)を見つけることができません。

しかし、(ちなみに、Javaの命名規則に従わない)CreateIndexes1()方法であなたのトランザクション管理に問題があります:それはだとき

try (Transaction tx = db.beginTx()) { 
    // ... 
    while (/* ... */) { 
     // ... 
     tx.success(); 
     tx.close(); 
    } 
} 

あなたは、トランザクションを複数回閉じています実際には、すべてのでそれを自分で閉じる必要はありませんのtry-と、リソースブロックに:

try (Transaction tx = db.beginTx()) { 
    // ... 
    while (/* ... */) { 
     // ... 
    } 
    tx.success(); 
} 

私はを推測しますは、ラベルに作成するインデックスを記述するJSONの逆シリアル化です。ロジックには欠陥があります。現在のプロパティのインデックスが存在するかどうかを調べ、見つからない場合にのみインデックスを作成する必要があるときに、別のプロパティのインデックスを見つけるとすぐにプロパティのインデックスを作成しようとします。

for (Indx indx : json2neo4j.getIndexes()) { 
    Label lbl = Label.label(indx.getLabelname()); 

    boolean indexExists = false; 
    for (IndexDefinition index : db.schema().getIndexes(lbl)) { 
     for (String property : index.getPropertyKeys()) { 
      if (property.equals(indx.getColName())) { 
       indexExists = true; 
       break; 
      } 
     } 
     if (indexExists) { 
      break; 
     } 
    } 

    if (!indexExists) { 
     db.schema().indexFor(lbl).on(indx.getColName()); 
    } 
} 
+0

@Frank ........ JSONファイルには2つの制約と2つのインデックスしかありません。だから、今のところそれほど巨大ではない。以上、私は新鮮なデータベースでこれをやっていましたが、インデックスや制約はありません.........この質問に答える答えを教えてください... "例外:シンプルなトランザクションを開始して閉じても機能しないのですか? ......空のデータベースでもこのエラーが出る.........ありがとう。 – NeoMan

+0

トランザクション管理規約の返信について。私はtx.success()とtx.close()のすべての可能な組み合わせを試しました........私は一緒にそれを削除しようとしました。それで、私が要求したのは.........単一の手順で制約、インデックス、ノードを使用する方法.....このエラーが発生する "例外:スキーマ更新を実行したトランザクションでデータ更新を実行できません。シンプルなトランザクションを開始して閉じても機能しないのですか? ".......... 1つの手順で3つのコマンドをすべて実行する方法を説明するサンプルをアップロードできますか? – NeoMan

+0

例外のスタックトレースを使用すると、コード内でどこに発生しているのかを知ることができます。インデックスを読むことは "データ更新"とみなされ、2段階でコードを分割する必要があります。最初のトランザクションで作成する必要があるインデックスを見つけ、見つからないものを1秒間に作成します。 –

関連する問題