py2neo python モジュール (py2neo.cypher.execute) を使用して cypher コマンドを実行することにより、多数のノード (~500,000) を (非埋め込み) neo4j データベースに挿入しようとしています。最終的にはpy2neoへの依存を取り除く必要がありますが、cypherとneo4jについてもっと学ぶまで、現時点ではそれを使用しています.
A と B の 2 つのノード タイプがあり、大多数のノードはタイプ A です。A-[r1]-A と A-[r2]-B のように、r1 と r2 の 2 つの関係が考えられます。タイプ A の各ノードには 0 ~ 100 の r1 関係があり、タイプ B の各ノードには 1 ~ 5000 の r2 関係があります。
現時点では、大きな CREATE ステートメントを作成してノードを挿入しています。たとえば、私は声明を持っているかもしれません
CREATE (:A {uid:1, attr:5})-[:r1]-(:A {uid:2, attr:5})-[:r1]-...
ここで ... は、別の 5000 ほどのノードと、グラフ内で線形チェーンを形成する関係である可能性があります。これは問題なく動作しますが、かなり遅いです。また、これらのノードを使用してインデックスを作成しています
CREATE INDEX ON :A(uid)
タイプ A のノードをすべて追加したら、再度 CREATE ステートメントを使用してタイプ B のノードを追加します。最後に、次のようなステートメントを使用して r2 関係を追加しようとしています
MATCH c:B, m:A where c.uid=1 AND (m.uid=2 OR m.uid=5 OR ...)
CREATE (m)-[:r2]->(c)
ここで ... は、数千の OR ステートメントを表すことができます。これは、1 秒あたり数個のリレーションシップのみを追加するのが非常に遅いようです。
それで、これを行うより良い方法はありますか?私はここで完全に軌道から外れていますか?この質問を見ましたが、サイファーを使用してノードを効率的にロードする方法が説明されていません。私が見ている他のすべてのものは、実際の暗号クエリを使用できることを示すことなく、Javaを使用しているようです。