私はNeo4jを初めて使用するので、基本について理解していないことがあります。
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()
));
(確かに、少し複雑です。ノードタイプが12個あり、リレーションタイプの数はほぼ同じです)。
現在、これは非常に遅く、300kのノードと1Mの関係をロードするのに1時間以上かかる(Neo4jが12 / 16GBのRAMを使用するかなり高速のMacBookProで)。
私はそれを間違った方法でやっていますか?代わりにバッチインサーターを使用する必要がありますか?(ネットワーク経由でgraphDBにアクセスできるようにしたいと思います)。より多くの挿入を1つのトランザクションにグループ化することで何かを得られますか?(ドキュメントから、トランザクションはロールバックと分離のニーズにのみ役立つようです)。
私はPythonでNeo4jから来ていますが、ここでの問題はCypherコマンドにあると思います。2つの提案があります。
エッジを個別に一致させる方が高速な場合があります。私のプリミティブベンチマークでは、24ミリ秒と15ミリ秒の違いがこれでわかります(編集:このベンチマークは疑わしいです)。
MATCH ( from:Person { id: '%s' } )
MATCH ( to:Person { id: '%s' } )
CREATE (from)-:KNOWS->(to)
別のオプションは、巻き戻しを使用することです。これをBOLTインターフェースと一緒に使用して、より少ないトランザクションを送信しますが、Batch Inserterを使用しません。私がここにコピーしているPythonの実装は許してください。うまくいけば、これをJavascript Neo4j Driverのドキュメントと一緒に見て変換できます。
payload = {"list":[{"a":"Name1","b":"Name2"},{"a":"Name3","b":"Name4"}]}
statement = "UNWIND {list} AS d "
statement += "MATCH (A:Person {name: d.a}) "
statement += "MATCH (B:Person {name: d.b}) "
statement += "MERGE (A)-[:KNOWS]-(B) "
tx = session.begin_transaction()
tx.run(statement,payload)
tx.commit()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加