2013-06-06 5 views
5

py2neo pythonを使用してcypherコマンドを実行することで、(埋め込まれていない)neo4jデータベースに多数のノード(〜500,000)モジュール(py2neo.cypher.execute)。最終的に私はpy2neoへの依存を取り除く必要がありますが、私はcypherとneo4jについてもっと学ぶまでそれを使っています。cypherを使用してneo4jデータベースにノードを挿入する最も効率的な方法

私は2つのノードタイプAとBを持ち、大半のノードはタイプAです。A- [r1] -AとA- [r2] -Bという2つの可能な関係r1とr2があります。タイプAの各ノードは0〜100のr1関係を持ち、タイプBの各ノードは1〜5000のr2関係を持ちます。

現時点では、大きなCREATE文を作成してノードを挿入しています。たとえば、私は...グラフの線形鎖を形成する別の5000かそこらのノードとの関係であるかもしれない声明

CREATE (:A {uid:1, attr:5})-[:r1]-(:A {uid:2, attr:5})-[:r1]-... 

を持っているかもしれません。これは問題なく動作しますが、かなり遅いです。私も、私は、すべてのタイプAのノードを追加した後

CREATE INDEX ON :A(uid) 

を使用して、これらのノードのインデックスを作成しています、私は再びCREATE文使ってタイプBのノードを追加します。最後に、

MATCH c:B, m:A where c.uid=1 AND (m.uid=2 OR m.uid=5 OR ...) 
CREATE (m)-[:r2]->(c) 

などのステートメントを使用してr2リレーションシップを追加しようとしています。ここで...数千のORステートメントを表すことができます。これは実際には毎秒わずか数の関係を追加するのが遅いようです。

だから、もっと良い方法がありますか?私は完全にオフトラックですか?私はthis questionを見ましたが、効率的にノードをロードするためにcypherの使い方を説明していません。私が見ているものは、javaを使用しているようですが、実際の暗号化クエリを使用することはできません。

答えて

6

最後までインデックスを作成しないでください(2.0以降)。ノードの作成が遅くなります。

Cypherでパラメータを使用していますか?

私はあなたのサイファーがパラメーターを使って毎回正確に同じでない限り、多くのサイパー解析時間を失うと思っています。そのようにモデル化することができれば、パフォーマンスが大幅に向上します。

サイファーのリクエストでかなりのチャンクを既に送信していますが、バッチリクエストAPIを使用すると、1回のRESTリクエストで複数のリクエストを送信できます(試してみてください)。

最後に、1回のインポートであれば、バッチインポートツールの使用を検討することもできます。ハードウェアが不良であっても数分で500Kノードを焼き切ることができます。私はそれがまだ2.0のファイルを作成することはできないと思うが、もしそうでなければまもなく来るかもしれない)、Cypher経由でラベル/インデックスを作成する。

更新:最後にあなたのMATCHステートメントに気付きました。このようにしてはいけません.IIDにORを使用する代わりに、一度に1つの関係を実行してください。これはおそらく大いに役立ちます - そしてあなたがuidのためのパラメータを使うことを確認してください。 Cypher 2.0では、インデックスヒントを使用している場合でも、ORでインデックスルックアップを実行できないようです。多分、これは後で来るでしょう。

更新日2012年12月:2.0にはCypherトランザクションエンドポイントがあります。私は100〜200文の "exec"サイズと1000〜10000文の合計トランザクションサイズを使って、1秒あたり20〜30,000のCypher文を送信することができました。 Cypherよりも読み込みを高速化するのに非常に効果的です。

+1

私は2番目のWesコメント:パラメータ、より小さいステートメント、2.0を使用している場合は、cypherのトランザクションHTTPエンドポイントを使用することを検討してください。http://neo4j.org/develop/labels for cypher& //www.neo4j.org/develop/import and http://jexp.de/blog/2013/05/on-importing-data-in-neo4j-blog-series/ –

+0

アドバイスをいただきありがとうございます。 PythonのCypher CREATE文でパラメータを使う方法を知っていますか?私がパラメータに関して見つけたことは、Javaのハッシュマップについて話すことです。 – savagent

+0

py2neoでは、paramsという辞書パラメータです。 http://book.py2neo.org/en/latest/cypher.html HTTP経由で未処理のJSONを実行している場合は、クエリとともにJSONリクエストにparams:{uid:...}を追加できます。 –

関連する問題