質問「 Neo4j Cypher パスの検索が無向グラフで遅い」からのフォローアップとして。Michael Hunger と Wes Freeman は親切に助けてくれましたが、パスを返す必要があるクエリをパス検索するために学んだテクニックを適応させることができませんでした。
問題:
以下のクエリは約 3 秒かかり、データベースから 13 行 (見つかったパス) を返します。速度が遅いので、より高速に実行したいのですが、最適化する方法がわかりません。(これはもちろん一例ですが、同様の他のクエリも遅いことがわかりました。)
START n=node:NodeIds('id:4000'), t=node:NodeIds('id:10778')
MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t)
RETURN nodes(path) AS Nodes
プロファイル データについても同様です。
neo4j-sh (0)$ profile START n=node:NodeIds('id:4000'), t=node:NodeIds('id:10778') MATCH path = (n)-[:ASSOCIATIVY_CONNECTION*1..3]-(t) RETURN nodes(path) AS Nodes;
==> +-------------------------------------------------------------------------------------------+
==> | Nodes |
==> +-------------------------------------------------------------------------------------------+
==> | [Node[3984]{Id:4000},Node[986]{Id:1001},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[1085]{Id:1100},Node[9955]{Id:9970},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[133348]{Id:133364},Node[9955]{Id:9970},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[111409]{Id:111425},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[9955]{Id:9970},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[64464]{Id:64480},Node[64455]{Id:64471},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[79152]{Id:79168},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[69190]{Id:69206},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[25893]{Id:25909},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[31683]{Id:31699},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> | [Node[3984]{Id:4000},Node[6965]{Id:6980},Node[18536]{Id:18552},Node[10763]{Id:10778}] |
==> +-------------------------------------------------------------------------------------------+
==> 13 rows
==> 2824 ms
==>
==> ColumnFilter(symKeys=["path", "n", "t", " UNNAMED3", "Nodes"], returnItemNames=["Nodes"], _rows=13, _db_hits=0)
==> Extract(symKeys=["n", "t", " UNNAMED3", "path"], exprKeys=["Nodes"], _rows=13, _db_hits=0)
==> ExtractPath(name="path", patterns=[" UNNAMED3=n-[:ASSOCIATIVY_CONNECTION*1..3]-t"], _rows=13, _db_hits=0)
==> PatternMatch(g="(n)-[' UNNAMED3']-(t)", _rows=13, _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)
セットアップ:
Neo4j グラフ データベースには、165,000 のノードと 266,000 の関係があり、すべての関係は無向 (双方向) で、「ASSOCIATIVY_CONNECTION」というラベルが付いています。どのノードもルート ノードに接続されていません。ノードと関係とは別に、各ノードには 1 つの整数値のみが格納されます (グラフ データベースは実際のデータの格納には使用されず、構造のためだけに使用されます)。
このデータベースのメモリ構成は次のとおりです。
wrapper.java.initmemory=1024
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.bat から開始して、Windows 8 マシンで Neo4j 1.9.M05 コミュニティを実行します。クエリは 10% の短い CPU スパイクを引き起こすだけなので、ハードウェアが問題になることはないと思います。GB の空き RAM が利用可能です。
このクエリをより高速に実行する方法についての指針に非常に感謝しています。
編集: 283kのノードと538kの関係を持つ同じグラフのわずかに拡張されたバージョンで同じクエリを試しました. 20秒かかります!
編集 2、メモリ制限の増加: Michael のアドバイスに従って、wrapper.java.initmemory と wrapper.java.maxmemory の設定を 8192 (8GB) に上げました。実際、Neo4j を実行する Java プロセスのメモリ フットプリントが 2.25GB に増加し、クエリのパフォーマンスも向上しました。現在は、ウォームアップされたクエリで約 1 秒です (3 回目の実行後)。また、neo4j.properties 構成ファイルのメモリ設定をそれぞれ 2GB に増やしましたが、目立った効果はありません。これらすべてが機能するためには、64b Java ランタイムが必要だったので (ブラウザー用に簡単にダウンロードできるデフォルトのバージョンは 32b バージョンです)、そのための手動インストーラーをダウンロードしました。インストール後、Neo4j は 32b バージョンの代わりに自動的に起動します。