2017-08-03 1 views
0

のリストを作成するのNeo4j。 私は、このような流れからノードをアップサートするために、このクエリを使用:IDラベルにIは<strong>ID</strong>ノードのnumberic IDであり、<strong>IDS</strong>は、隣接ノードのIDのリストである<em>ペア</em><strong></strong>のストリームを有するエッジ

WITH ${ids.mkString("[", ",", "]")} as ids 
UNWIND ids as u2id 
MERGE (u1:User {Id:${id}}) 
MERGE (u2:User {Id:u2id}) 
CREATE UNIQUE p = (u1) - [:FRIEND] -> (u2) 

を、私はインデックスを持っている

CREATE INDEX ON :User(Id) 

のIDリストの長さは約100〜200の平均です。

現在、6000万のノードとミルがあります。データベース内のエッジの数。 upsertingの速度は約秒です。 Neo4jは、Core i5、28Gb RAM、2Tb WD Blackの専用マシンで動作します。

どのようにupsertingクエリを最適化することができますか、ハードウェアを改善するためのヒントがありますか。

+0

質問のカップル... 1)(それはあなたがCSVファイル内のすべての更新が言うとLOAD CSVを行うかもしれないということではありません)ストリーム一定のですか? 2)ユーザー(Id)は単なる索引か一意の制約ですか? 3)実際に新しいユーザーを作成していますか(MERGEはそれを意味します)? 4)そのような実行のPROFILEの展開イメージを追加できますか? –

+0

遅くて申し訳ありませんが、1)はいそれは真のストリームです2)インデックス3)はい、作成4)不幸にもデータベースにアクセスできない今すぐ –

答えて

1

これらの漸進的な変更により、クエリが高速化されるはずです。

  1. UNWINDu1MERGEを移動させることにより一度だけ

    MERGEu1のを行い、それのみ(代わりに一度u2id値あたり)を1回実行されます。 (あなたは、両方のエンドポイントが事前に存在していることを確認しているため)

    MERGE (u1:User {Id:${id}}) 
    WITH u1, ${ids.mkString("[", ",", "]")} as ids 
    UNWIND ids as u2id 
    MERGE (u2:User {Id:u2id}) 
    CREATE UNIQUE (u1)-[:FRIEND]->(u2) 
    
  2. また、MERGEなどCREATE UNIQUEによって満足できるべきである代わりにCREATE UNIQUE

    あなたの関係の作成ユースケースのMERGEを使用しています。私のプロファイリングでは、MERGEがDBヒット数を減らしていることがわかりました(DBの特性とneo4jのバージョンによって、あなたの走行距離が異なる場合があります)。

    MERGE (u1:User {Id:${id}}) 
    WITH u1, ${ids.mkString("[", ",", "]")} as ids 
    UNWIND ids as u2id 
    MERGE (u2:User {Id:u2id}) 
    MERGE (u1)-[:FRIEND]->(u2) 
    
+0

UNWIDの外にマージを移動してください。しかし、ノード数が〜100milになると、 Node4jプロセスがスワップを開始し、速度が大幅に低下したので、ファイルに書き込み、後で処理することにしました。 –

関連する問題

 関連する問題