長いが(ほぼ)一意のパスのNeo4JCypherクエリを探しています

ニック・マクフィー

約100Kのノードと200Kのリレーションを持つ進化プロセスを表すNeo4Jデータベースがあります。ノードは世代の個人であり、エッジは親子関係を表します。主な目標は、最終世代で関心のある1つまたは複数のノードを取得し、それらの進化の歴史を調査できるようにすることです(大まかに言うと、「どうやってここにたどり着いたのですか?」)。

すべての祖先を見つけるための「明白な」最初のクエリは、そのスペースを通る可能な祖先とパスが多すぎるため、機能しません。

match (a)-[:PARENT_OF*]->(c {is_interesting: true}) 
return distinct a;

そのため、データを前処理して、一部のエッジが「特別」としてマークされ、ほとんどすべてのノードが最大で1つの「特別」親エッジを持つようにしましたが、両方の親エッジが「特別」としてマークされることもあります。したがって、私の希望は、このクエリが「特別な」エッジに沿って(ほぼ)一意のパスを(効率的に)生成することでした。

match (a)-[r:PARENT_OF* {special: true}]->(c {is_interesting: true}) 
return distinct a;

ただし、これはまだ実行不可能なほど遅いです。

「人間として」のロジックは単純であるため、これは苛立たしいことです。少数の「興味深い」ノード(多くの場合、1、数十を超えない)から開始し、ほとんど常に固有の「特別な」エッジに沿って追跡します。2つの「特別な」親を持つノードの数が非常に少ないと仮定すると、これはO(N)のようになります。ここで、Nは過去の世代数です。

ただし、Neo4Jでは、すべてのステップが一意である一意の「興味深い」ノードから25ステップ戻るには、30秒かかります。また、分岐1つになると(両方の親が「特別」である場合)、ステップの機能。28ステップ(最初の分岐点に到達)は2分、30ステップ(まだ1つの分岐点しかない)は6分かかり、シミュレーションの開始まで100ステップすべてを試すことすら考えていません。

昨年の同様の作業のいくつかはパフォーマンスが向上したように見えましたが、エッジにデータフィールドを使用する代わりに、さまざまなエッジラベル((a)-[:SPECIAL_PARENT_OF*]->(c)およびなど(a)-[:PARENT_OF*]->(c))を使用しました。関係フィールドの値を照会するのは良い考えではありませんか?このモデルの関係にはかなりの数の異なる値(ブール値、数値)が関連付けられており、それらを使用して検索を効率的に制限できることを期待/想定していましたが、実際にはそうではなかった可能性があります。

モデルやクエリを調整する方法についての提案をいただければ幸いです。

私が言及すべきアップデート、これはすべてNeo4J2.1.7で行われます。Brian Underwoodの提案に従って、2.2を試してみて、報告します。

ニック・マクフィー

Neo4J 2.2のプロファイリングツールで物事を調査した後(ヒントについてはBrian Underwoodに感謝します)、Neo4Jがエッジプロパティで事前フィルタリングを行わないことはかなり明らかです。これにより、長いパスで厄介な組み合わせ爆発が発生します。 。

たとえば、元のクエリ:

match (a)-[r:PARENT_OF* {special: true}]->(c {is_interesting: true}) 
return distinct a;

見つかったすべてのパスをaするc、その後でないエッジを持っているものを排除specialからaのパスは数百万あるためc、これは完全に実行不可能です。

私が代わりに追加する場合IS_SPECIALがあった場所にエッジをPARENT_OF持っていたエッジ{special: true}、その後、クエリは、私が第二の下で約100世代をプッシュバックすることができ、本当に速いなります。

このクエリは、すべての新しいエッジを作成します。

match (a)-[r:PARENT_OF {special: true}]->(b) 
create (a)-[:IS_SPECIAL]->(b);

グラフに91Kの関係を追加するのに1秒もかかりません。

次に

match (c {is_interesting: true}) 
with c 
match (a)-[:IS_SPECIAL*]->(c) 
return distinct a;

一意のターゲットノードから戻る「特別な」パスに沿って112ノードを見つけるのに1秒もかかりませんcNeo4Jはノードのプロパティを事前にフィルタリングしていないようであり、複数の「興味深い」ターゲットノードがある場合は処理が非常に遅くなるため、c最初に一致させ、使用with cするノードのセットを制限することも重要です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#:Where句にパスを含むneo4jCypherクエリを実行しています

分類Dev

C#:Where句にパスを含むneo4jCypherクエリを実行しています

分類Dev

開始-終了条件に基づいて単一の関係を持つノードのパスを一覧表示するNeo4jCypherクエリ

分類Dev

Neo4jCypherクエリが際限なく実行されています

分類Dev

そして、neo4jcypherクエリの条件が機能しません

分類Dev

このNeo4JCypherクエリを最適化する

分類Dev

このNeo4JCypher 2クエリを表現するためのより良い方法は何ですか?

分類Dev

特性デルタに基づいてノードを見つけるためのNeo4jCypherクエリ

分類Dev

Neo4jCypherクエリでFOREACHの後にノードを返すことができません

分類Dev

neo4jcypherクエリにパラメータを渡す

分類Dev

Neo4jCypherパフォーマンスクエリの最適化

分類Dev

複雑なneo4jcypherクエリを使用して、グラフをトラバースし、特定のラベルのノードを抽出して、オプションの一致で使用します

分類Dev

nullまたはnull以外の値を持つNeo4jCypherクエリ

分類Dev

Neo4jCypherの代替パス

分類Dev

長時間の一致でNeo4jCypherのパフォーマンスを向上させる

分類Dev

Neo4jCypherスクリプトをGremlinに変換するのに助けが必要

分類Dev

Neo4jCypherクエリ言語のさまざまなデータ型

分類Dev

C#でNeo4JCypherクエリを作成する

分類Dev

多対多の関係に対するNeo4jCypherクエリ

分類Dev

neo4jcypherは配列/リストを文字列に変換します

分類Dev

可変長パスを使用する場合のNeo4JCypherグラブタイプのリレーション

分類Dev

メソッドコードをNeo4jCypherクエリに移動します

分類Dev

ノードとそれに関連付けられた一意の制約の両方を削除するNeo4jCypherコマンド?

分類Dev

Python-長さが等しくないリストのリストから置換してすべての一意の組み合わせを取得します

分類Dev

Neo4jCypherクエリエラー

分類Dev

csvをロードするためのneo4jcypherインポートスクリプトのIF条件

分類Dev

GraphRepositoryパターンを使用してneo4jcypherクエリを動的に構築することは可能ですか?

分類Dev

Neo4jCypher再帰クエリ

分類Dev

Neo4JCypherクエリ-Null関係

Related 関連記事

  1. 1

    C#:Where句にパスを含むneo4jCypherクエリを実行しています

  2. 2

    C#:Where句にパスを含むneo4jCypherクエリを実行しています

  3. 3

    開始-終了条件に基づいて単一の関係を持つノードのパスを一覧表示するNeo4jCypherクエリ

  4. 4

    Neo4jCypherクエリが際限なく実行されています

  5. 5

    そして、neo4jcypherクエリの条件が機能しません

  6. 6

    このNeo4JCypherクエリを最適化する

  7. 7

    このNeo4JCypher 2クエリを表現するためのより良い方法は何ですか?

  8. 8

    特性デルタに基づいてノードを見つけるためのNeo4jCypherクエリ

  9. 9

    Neo4jCypherクエリでFOREACHの後にノードを返すことができません

  10. 10

    neo4jcypherクエリにパラメータを渡す

  11. 11

    Neo4jCypherパフォーマンスクエリの最適化

  12. 12

    複雑なneo4jcypherクエリを使用して、グラフをトラバースし、特定のラベルのノードを抽出して、オプションの一致で使用します

  13. 13

    nullまたはnull以外の値を持つNeo4jCypherクエリ

  14. 14

    Neo4jCypherの代替パス

  15. 15

    長時間の一致でNeo4jCypherのパフォーマンスを向上させる

  16. 16

    Neo4jCypherスクリプトをGremlinに変換するのに助けが必要

  17. 17

    Neo4jCypherクエリ言語のさまざまなデータ型

  18. 18

    C#でNeo4JCypherクエリを作成する

  19. 19

    多対多の関係に対するNeo4jCypherクエリ

  20. 20

    neo4jcypherは配列/リストを文字列に変換します

  21. 21

    可変長パスを使用する場合のNeo4JCypherグラブタイプのリレーション

  22. 22

    メソッドコードをNeo4jCypherクエリに移動します

  23. 23

    ノードとそれに関連付けられた一意の制約の両方を削除するNeo4jCypherコマンド?

  24. 24

    Python-長さが等しくないリストのリストから置換してすべての一意の組み合わせを取得します

  25. 25

    Neo4jCypherクエリエラー

  26. 26

    csvをロードするためのneo4jcypherインポートスクリプトのIF条件

  27. 27

    GraphRepositoryパターンを使用してneo4jcypherクエリを動的に構築することは可能ですか?

  28. 28

    Neo4jCypher再帰クエリ

  29. 29

    Neo4JCypherクエリ-Null関係

ホットタグ

アーカイブ