2

典型的なMySQLデータベースに格納されたテーブルがあり、neo4jデータベースを解析して構築するために、Javaを使用して小さなパーサーツールを構築しました。このデータベースには最大 4,000 万のノードがあり、それぞれに 1 つ以上のエッジがあります (最大 10 個のエッジが可能)。問題は、特定のノードを作成する方法に起因します。ユーザー ノード、コメント ノード、ハッシュタグ ノードがあります。ユーザー ノードとハッシュタグ ノードはそれぞれ一意である必要があります。一意性を確保するために、次の例のコードを使用しています。

public Node getOrCreateUserWithUniqueFactory( String username, GraphDatabaseService graphDb )
{
    UniqueFactory<Node> factory = new UniqueFactory.UniqueNodeFactory( graphDb, "users" )
    {
    @Override
    protected void initialize( Node created, Map<String, Object> properties )
    {
        created.setProperty( "name", properties.get( "name" ) );
    }
};

return factory.getOrCreate( "name", username );

}

バッチ挿入機能を使用することを考えましたが、バッチ挿入の実行中にノードが一意かどうかを確認する方法がありませんでした。したがって、私の質問は、これらすべてのノードを挿入しながら、それらの一意性を維持するための最速の方法は何かということです。いつものように、どんな助けでも大歓迎です。

4

3 に答える 3

3

ここで他の誰かがこの問題に遭遇した場合に備えて、私と同僚が速度を上げるために何を理解できたかを文書化したい. 最初に、データに関するメモを 1 つか 2 つ:

  • ノードの約 30% を占める多数のユーザーがいた
  • 人々は何でもハッシュする傾向があるため、多数のハッシュタグもありました
  • これらは両方とも一意であることを保証する必要がありました

これで、最適化の話は終わりです。何よりもまず、ノードが挿入されるたびに挿入ループが完了するようにする必要があります。私たちが見ることができる実際の例はなかったので、最初はコードは次のように見えました(疑似コード)

Transaction begin
While(record.next()){
   parse record
   create unique user
   create unique hashtag
   create comment
   insert into graph
}
Transaction success
Transaction finish

これは問題なく機能し、小規模なデータセットでは比較的迅速に終了しましたが、うまくスケーリングできませんでした。そのため、各関数の目的を確認し、コードを次のようにリファクタリングしました。

While(record.next()){
   Transaction begin

   parse record
   create unique user
   create unique hashtag
   create comment
   insert into graph

   Transaction success
   Transaction finish
}

これにより作業が大幅にスピードアップしましたが、同僚にとっては十分ではありませんでした。そこで彼は、Lucene インデックスをノード属性で作成できること、および Unique Node ファクトリでそれらを参照できることを発見しました。これにより、さらに大幅な速度向上が実現しました。バッチローダーを使用しなくても、10 秒以内に 1,000,000 ノードを挿入できたほどです。みんなの助けに感謝します。

于 2013-03-01T15:35:58.537 に答える
0

バッチ挿入中にローカル キャッシュを作成しないのはなぜですか? Mapキーnameと値でJavaを使用できますNodeId(バッチインサーターから)。

于 2013-02-20T04:25:07.173 に答える
0

通常は、HashMap. 結局、それほど多くのユーザーとタグはありません

LuceneBatchInserterIndexと を使用することもできますsetCapacity

参照: http://docs.neo4j.org/chunked/milestone/batchinsert.html#indexing-batchinsert

于 2013-02-20T07:00:15.237 に答える