2016-12-12 17 views
1

Neo4jに約1百万のノードを挿入する必要があります。私は各ノードがユニークであることを指定する必要があるので、ノードを挿入するたびに同じノードがまだないことを確認する必要があります。また、関係はユニークでなければなりません。私はPythonとサイファーを使用していNeo4Jに多数のノードを挿入する方法

uq = 'CREATE CONSTRAINT ON (a:ipNode8) ASSERT a.ip IS UNIQUE' 
... 
queryProbe = 'MERGE (a:ipNode8 {ip:"' + prev + '"})' 
... 
queryUpdateRelationship= 'MATCH (a:ipNode8 {ip:"' + prev + '"}),(b:ipNode8 {ip:"' + next + '"}) MERGE (a)-[:precede]->(b)' 

問題はのNeo4jに40-50Kのノードを入れた後、挿入速度が速く遅くなり、私は何か他のものを置くことができないということです。

答えて

0

このような大量の挿入の場合は、定期コミットの場合はLOAD CSV、またはimport toolを使用することをお勧めします。

文字列に値を追加する代わりに、パラメータ化されたクエリを使用することもベストプラクティスと考えています。

また、ipNode8では一意のプロパティー制約を作成しましたが、最初のものはipNodeではありません。あなたにも一意の制約が必要なようです。

+0

私は常にipNode8を使用します。コピーするとエラーになりました – RamsesXVII

1

あなたの質問は完全に終了しました。 @ InverseFalconの推奨に加えて、物事をスピードアップするために調査できる他のものもここにあります。

  1. パフォーマンスチューニングのドキュメントを読んで、推奨事項に従ってください。特に、メモリ関連の問題に遭遇している可能性がありますので、Memory Tuningセクションは非常に役に立ちます。

  2. あなたのCypherクエリはおそらく高速化できます。例えば、それが理にかなっているなら、あなたは次のようなものを試すことができます。 dataparameterは、形式が{a: 123, b: 234}のオブジェクトのリストであると予想されます。 1つのトランザクション内でリストを処理している間にサーバ上のメモリ不足を避けるために、リストを適切な長さ(たとえば、20K)にすることができます。 (このクエリは、あなたにもそれが存在しない場合bを作成することを前提としています。)

    UNWIND {data} AS d 
    MERGE (a:ipNode8 {ip: d.a}) 
    MERGE (b:ipNode8 {ip: d.b}) 
    MERGE (a)-[:precede]->(b) 
    

    あなたが使用することができるかもしれないperiodic execution APOC手順もあります。

関連する問題