1

私は60,000以上のノードを持つ非常に大きなNeo4Jセットアップで作業しています。各ノードには、約4〜5個のプロパティと、単純な親子関係があります。これらの60,000ノードを操作する場合、特に高価で反復的なクエリでは、Neo4JのRESTインターフェイスを介してさまざまな500のHTTPエラーが発生します。

ログを調べたところ、Javaヒープスペースが問題であることがわかりました。512MBの制限を2048MBに上げましたが、それでも500になります。ヒープを3GBや4GBのように設定すると、neo4jが起動しません。私はこれを非常に優れたラップトップ(i5、4GB RAM)でテストしていますが、これが構成の問題なのか、それともアプリケーションがサーバー(Amazon Extra-Large High-CPUインスタンス)で正常に動作するのかを知りたいのです。私が物事をより速くするのを助けることができるある種のキャッシングはありますか?基本的に、私はノードのネットワーク全体を複数回繰り返しています。

2つのクエリを実行しています。1つ目は次のとおりです。

start referrer=node(3) match path=referrer-[*1..1]->referral return referral

これは、リファラー#3のTier1であるノードを検出するために行われます。次に、彼のすべての層からすべてのノードを検出し、ノード、最初の層からのノード、次に層番号を返す必要があります。

start referrer=node(3) match path=referrer-[*1..1]->firsttier-[*0..]->referral return referral, firsttier, length(path)

それは完璧に動作し、非常に高速です。ただし、ネットワーク内のすべてのノードに対してこれを実行しています。forループ内で両方のクエリを実行しています(そしてそれらを使用してビジネスロジックを適用しています)。ループは60,000回実行されます。

現在、ラップトップでこれをテストしていますが、ZeroMQですべてを作成したため、この「タスク」は分散処理用に準備されています。forループはワーカーにメッセージを送信し、ワーカーはクエリを実行します。

4

1 に答える 1

2

Neo4jの場合、60,000ノードは小さいです(最大320億以上になる可能性があります)が、構成でヒープサイズを増やす必要があります。

http://blog.neo4j.org/2011/03/neo4j-13-abisko-lampa-m04-size-really.htmlを参照してください

ただし、RESTを介して返されるノードの数を制限し、それらをページングすることをお勧めします。

または、すべてのIDを返し、それらをアプリまたはRedisのようなものにキャッシュしてから、IDでCypherを使用してマルチゲットを実行することを検討することもできます。このようにして、毎回クエリを実行する必要はありません。

于 2012-05-27T00:35:47.333 に答える