165k ノードと 266k リレーションシップを持つグラフで、次の Cypher クエリを実行したいと思います。
START n=node:NodeIds('id:firstId'), t=node:NodeIds('id:secondId')
MATCH (n)-[:RELATIONSHIP_TYPE*1..3]-(t)
RETURN count(*)
ここでfirstId
、 とsecondId
は NodeIds Lucene インデックスの有効なエントリです。
Neo4j コンソールからのクエリの実行には約 4 秒かかります。なぜそんなに遅いのか、どうすれば高速化できるのかを理解したいと思います。
これからのインデックス ルックアップには約 40 ミリ秒かかります (つまり、2 つのノードを返すだけのクエリにはそれだけの時間がかかります) ため、問題になることはありません。
Neo4j.bat から開始して、デフォルト設定で Windows 8 マシンで Neo4j を実行します。ハードウェアが問題になることはないと思います。クエリによって CPU 使用率がわずか 10% 上昇し、ディスク使用量がほとんど目に見えない程度に上昇するだけだからです。
ところで、最初のノードの次数は 40、2 番目のノードの次数は 2 で、結果は 1 です。
どんな助けでも大歓迎です。
編集 1、メモリ構成:
メモリに関する次のデフォルトでNeo4j.batから開始することにより、OOTB構成でNeo4jを実行していました(私が間違っていない場合、それらが唯一のメモリ関連の構成です):
wrapper.java.initmemory=16
wrapper.java.maxmemory=64
neostore.nodestore.db.mapped_memory=25M
neostore.relationshipstore.db.mapped_memory=50M
neostore.propertystore.db.mapped_memory=90M
neostore.propertystore.db.strings.mapped_memory=130M
neostore.propertystore.db.arrays.mapped_memory=130M
暗闇の中で撮影して、これらの値を次のように上げました。
wrapper.java.initmemory=128
wrapper.java.maxmemory=1024
neostore.nodestore.db.mapped_memory=225M
neostore.relationshipstore.db.mapped_memory=250M
neostore.propertystore.db.mapped_memory=290M
neostore.propertystore.db.strings.mapped_memory=330M
neostore.propertystore.db.arrays.mapped_memory=330M
これにより、Neo4j のメモリ使用量 (Neo4j を実行している java.exe インスタンスのメモリ使用量) が実際に増加しましたが、パフォーマンスは向上しませんでした (クエリにはほぼ同じ時間がかかり、おそらく 2 ~ 300 ミリ秒の増加が時々あります)。数 GB の RAM が空いているため、ハードウェアの制約はありません。
編集 2、プロファイラー データ: 問題のクエリに対してプロファイラーを実行すると、次の結果が得られます。
neo4j-sh (0)$ profile START n=node:NodeIds('id:4000'), t=node:NodeIds('id:64599') MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t) RETURN count(*);
==> +----------+
==> | count(*) |
==> +----------+
==> | 1 |
==> +----------+
==> 1 row
==> 0 ms
==>
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE-939275295"], returnItemNames=["count(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE-939275295,CountStar)"], _rows=1, _db_hits=0)
==> ExtractPath(name="path", patterns=[" UNNAMED3=n-[:ASSOCIATIVY_CONNECTION*1..3]-t"], _rows=1, _db_hits=0)
==> PatternMatch(g="(n)-[' UNNAMED3']-(t)", _rows=1, _db_hits=0)
==> Nodes(name="t", _rows=1, _db_hits=1)
==> Nodes(name="n", _rows=1, _db_hits=1)
==> ParameterPipe(_rows=1, _db_hits=0)
0ミリ秒と表示されていますが、それが何を意味するのかわかりません。結果は数秒後に返され、データブラウザのコンソールで実行された同じクエリには約3.5秒かかり(これが表示されます)、ほぼ同じ量ですRESTful エンドポイントを介してフェッチされた時間。
編集 3、実際のデータ セット: 理論で十分です :-)、これは私が実際に話しているデータ セットです: http://associativy.com/Media/Default/Associativy/Wiki.zip生成されたグラフですウィキペディアのダンプ ファイルから作成された、ウィキペディアの記事間の相互リンクを使用します。それはほんの始まりです。
私が実行しようとしている実際のクエリは、実際には次のクエリであり、2 つのノード間のパスを構築するノードを返します。
START n=node:NodeIds('id:4000'), t=node:NodeIds('id:64599') MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t) RETURN nodes(path) AS Nodes
症状を示す最も単純なクエリが必要だったので、count クエリを示しました。
編集4:
パスを返すクエリ専用の別の質問を開きました。