2

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:

パスを返すクエリ専用の別の質問を開きました。

4

2 に答える 2

1

私はウェスに同意します、これはすぐに戻るはずです.

構成のアップは理にかなっています。これは2つの異なる構成ファイルにありますよね?

Windows で実行しているため、MMIO は Java ヒープ内にあるため、次のようにします。

wrapper.java.initmemory=4096 wrapper.java.maxmemory=4096

復路はどのくらい?あなたのドメインで方向を指定することは理にかなっていますか?

以下を実行していただけますか (返されたパスの長さに合わせてください)

START n=node:NodeIds('id:4000'), 
      t=node:NodeIds('id:64599') 
MATCH path = (n)-[:ASSOCIATIVY_CONNECTION]-(a)
             (a)-[:ASSOCIATIVY_CONNECTION]-(b)-[:ASSOCIATIVY_CONNECTION]-(t) 
RETURN count(*), count(distinct a), count(a), count(distinct b), count(b);
于 2013-03-18T23:36:32.073 に答える
0

1.9 マイルストーン リリースを実行していますか? 1.9 の双方向マッチャーは、おそらく 1.8.x よりもはるかに優れています。

于 2013-03-17T01:45:25.583 に答える