2

ユーザーが辞書を管理できるアプリケーションを構築しています。機能の 1 つは、ファイルをアップロードして、辞書のコンテンツを初期化または更新することです。

私が最初に注目している構造の部分はDictionary -[:CONTAINS]->Word. 空のデータベース (Neo4j 1.9.4、2.0.0M5 も試しました) から始めて、分散環境で Spring Data Neo4j 2.3.1 経由でアクセスします (したがって、SpringRestGraphDatabase を使用しますが、localhost でテストします)、7k ワードをロードしようとしています。 1 辞書に。ただし、コア i7、8Gb RAM、および SSD ドライブ (ulimit が 40000 に引き上げられた) を備えた Linux では、8/9 分未満では完了できません。

REST を使用したパフォーマンスのロード/挿入に関する多くの投稿を読み、見つけたアドバイスを適用しようとしましたが、うまくいきませんでした。アプリケーションの制約により、BatchInserter ツールは適切なオプションではないようです。

数分ではなく数秒で 1 万ノードをロードできますか?

すべての私の読書の後に、私が思いついたコードは次のとおりです。

Map<String, Object> dicProps = new HashMap<String, Object>();
dicProps.put("locale", locale);
dicProps.put("category", category);
Dictionary dictionary = template.createNodeAs(Dictionary.class, dicProps);
Map<String, Object> wordProps = new HashMap<String, Object>();
Set<Word> words = readFile(filename); 
for (Word gw : words) {
  wordProps.put("txt", gw.getTxt());
  Word w = template.createNodeAs(Word.class, wordProps);
  template.createRelationshipBetween(dictionary, w, Contains.class, "CONTAINS", true);
}
4

2 に答える 2

1

CSVファイルを作成してからNeo4jから読み取るだけで、このような問題を解決できます。次のような手順を実行する必要があります。

  1. 入力データを取得し、それに基づいて CSV ファイルを作成するクラスを作成します (ノードの種類ごとに 1 つのファイルにすることも、リレーションの構築に使用するファイルを作成することもできます)。

  2. 私の場合、Neo4j がそのファイルを HTTP で読み取れるようにするサーブレットも作成しました。

  3. その CSV ファイルの読み取りと解析を可能にする適切な Cypher ステートメントを作成します。私が使用するサンプルがいくつかあります (Spring Data を使用する場合は、ラベルについても覚えておいてください)。

    • 簡単なもの:

      load csv with headers from {fileUrl} as line 
         merge (:UserProfile:_UserProfile {email: line.email})
      
    • より複雑:

      load csv with headers from {fileUrl} as line 
           match (c:Calendar {calendarId: line.calendarId})
           merge (a:Activity:_Activity {eventId: line.eventId})
      on create set  a.eventSummary = line.eventSummary,
           a.eventDescription = line.eventDescription,
           a.eventStartDateTime = toInt(line.eventStartDateTime),
           a.eventEndDateTime = toInt(line.eventEndDateTime),
           a.eventCreated = toInt(line.eventCreated), 
           a.recurringId = line.recurringId
      merge (a)-[r:EXPORTED_FROM]->c
      return count(r)
      
于 2015-07-22T16:28:41.790 に答える