Neo4jを初めて使用しました。基本についてわからないことがあります。Neo4j、Cypherコマンドで一括読み込み
私はJavaで多くのオブジェクトを持っており、それらを使ってJavaドライバとCypherを使ってNeo4jグラフを生成したいと考えています。私のコードは次のように機能します。
// nodes
for (Person person: persons)
session.run (String.format (
"CREATE (:Person { id: '%s', name: \"%s\", surname: \"%s\" })",
person.getId(), person.getName(), person.getSurname()
));
// relations
session.run ("CREATE INDEX ON :Person(id)");
for (Friendship friendship: friendships)
session.run (String.format (
"MATCH (from:Person { id: '%s' }), (to:Person { id: '%s' })\n" +
"CREATE (from)-:KNOWS->(to)\n",
friendship.getFrom().getId(),
friendship.getTo().getId()
));
(私はダースのノードの種類を持っており、関係型の同じ数のおよそ原因確かに、それは、少し複雑です)。
これは非常に遅く、300kノードと1Mリレーションをロードするのに1時間以上かかるようです(かなり高速のMacBookProではNeo4jで12/16GBのRAMを使う)。
私は間違ったやり方をしていますか?代わりにbatch inserterを使用する必要がありますか? (私はネットワーク経由でgraphDBにアクセスできる方が好きです)。 1つのトランザクションに複数の挿入をグループ化することで何かを得ることはできますか? (ドキュメントからは、トランザクションはロールバックと分離の必要性にのみ役立つと思われます)。
ありがとうございますが、私のケースではうまくいかないと思います。私のアプリケーションが内部グラフ(ハッシュマップを使用して)を3分未満で埋めることを考えれば、24〜15msは大きく異なりますが、Neo4jは同じように年月を要します。それは正しいことはできません、それは多かれ少なかれ同じようにする必要があります。 WINDについては、リストをパラメータとして送信すると、最終的には非常に多くのノードとエッジがあることを考慮すると、大きすぎるクエリに変わると思います。 – zakmck
私のベンチマークはオフかもしれませんが、少なくともUNWINDを試してみることを強くお勧めします。あなたのペイロードリストはあなたのデータのすべてである必要はありません。あなたはそれをチャンクすることができます(私は実際にはそうですが、上記のコードではありません)。ペイロードのサイズが〜100kで、N個のトランザクションでエッジを埋めることができれば、N * 100k個の個別トランザクションに比べて時間が節約できます。 – sjc
感謝@sjc、私はUNWINDのポイントを参照してください、私はそれを試してみましょう。 – zakmck