本文へスキップ
BecomeCoder

Neo4jコース · 第4章 データを検索する · レッスン20

可変長パス ― [:KNOWS*1..3]

ブラウザで完結

導入

「何ホップ先まで」があらかじめ決まっていない場合、リレーションシップを何個も書き並べるのは大変です。Cypherには、その手間を1つの記法にまとめる 可変長パス があります。

説明

MATCH (a:Person {name: 'Alice'})-[:KNOWS*1..3]->(other:Person)
RETURN DISTINCT other.name

[:KNOWS*1..3] は「KNOWS というリレーションシップを、1回以上3回以下繰り返してたどる」という意味です。つまりこのクエリは、「Aliceの友達」「友達の友達」「友達の友達の友達」をすべてまとめて探します。

graph LR
    a["Alice"] -->|1ホップ| b["友達"]
    b -->|2ホップ| c["友達の友達"]
    c -->|3ホップ| d["友達の友達の友達"]

範囲の書き方にはいくつかのパターンがあります。

記法意味
[:KNOWS*2]ちょうど2ホップ
[:KNOWS*1..3]1ホップ以上3ホップ以下
[:KNOWS*..3]3ホップ以下(下限は1扱い)
[:KNOWS*]1ホップ以上、上限なし

上限を指定しない [:KNOWS*] の使用には注意が必要です。 グラフが大きい・つながりが密である場合、たどるべき経路の組み合わせが爆発的に増え、クエリが非常に遅くなったり応答が返らなくなったりすることがあります。実務では、よほど明確な理由がない限り上限(..3 のような)を指定する習慣をつけましょう。

実際に動かしてみよう

下のエディタに Cypher を書いて「実行」を押すと、ブラウザ内の学習用グラフDBで結果が表示されます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです)。最初から「映画と俳優+小さなソーシャルグラフ」が入っているので、MATCH 系の例はそのまま結果が返ります。CREATE / MERGE / SET などで書き換えた状態は積み重なり、「グラフを初期状態に戻す」でいつでもサンプルに戻せます。

Cypher — ブラウザ内で実行(学習用グラフDB)

Cypherクエリを書いて実行できる学習用グラフDBを読み込みます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです。映画と俳優の小さなサンプルグラフが最初から入っています)。
スクロールして表示された時点でも自動で読み込まれます。