3

他のノードとの特定の関係タイプを持たないデータベース内のすべてのノードを選択したいと考えています。

これが私のデータベース構造です: イベントノードを発行するユーザーノードがあります。パブリッシュ関係はより具体的で、さまざまなタイプの関係があります。たとえばtype1、 とtype2です。

type1イベントとの関係はあるが、イベントとの関係がないすべてのユーザー ノードをすばやく選択するにはどうすればよいですかtype2

私が今使っているクエリは次のとおりです。

START u = node:users("*:*") 
MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2) 
WHERE r2 IS NULL
RETURN u

問題は、r2 がオプションの関係であることです。これにより、上記のクエリが非常に遅くなり、neo4j ドキュメントの内容が確認されます。

このクエリの速度を改善するにはどうすればよいですか? データをより適切にモデル化してパフォーマンスを向上させることはできますか?

ありがとうございました!アレックス

4

1 に答える 1

4

私が見つけた解決策は、ユースケースに応じて 2 つあります。私は2つ持っていました:

  1. type1type の関係を持ち、 type の関係を持たないすべてのユーザー ノードを検索しますtype2

2 つのクエリでこれを解決できます。そのうちの 1 つは、optional relationshipsneo4j のマニュアルで次の使用に対して警告されています。

START u = node:users("some query")
MATCH (ev1)<-[r1:TYPE1]-(u)-[r2?:TYPE2]->(ev2)
WHERE r2 IS NULL
RETURN u

または、パターンのフィルタリングを使用するより高速なバリアントを使用します。ドキュメント

START u = node:users("some query")
MATCH (ev1)<-[r1:TYPE1]-(u)
WHERE NOT (u)-[:TYPE2]->()
RETURN u
  1. タイプの関係を持ち、特定のプロパティを持つノードとtype1のタイプの関係を持たないすべてのユーザー ノードを検索します。type2

    START u = node:users("some query") MATCH (ev1)<-[r1:TYPE1]-(u)-[r2:TYPE2]->(ev2) WHERE ev2.property = 値 AND r2.property = 値戻る

私の質問にはパフォーマンスに関する注意事項があったため、上記のクエリを高速化するための 2 つのアドバイスを追加します。

  • Lucene で可能な限り賢くインデックスを作成し、できるだけ多くのクエリ条件をWHEREインデックス クエリに移動します。すべては、開始ノードの数を減らすための努力です! ノート!重いインデックス作成は、書き込みパフォーマンスを低下させます。利用可能なクエリ構文については、 lucene のドキュメントを参照してください。
  • パラメトリック クエリを使用して、neo4j がクエリの実行戦略をキャッシュできるようにします。ドキュメント
于 2013-10-30T09:51:50.270 に答える