導入
「何ホップ先まで」があらかじめ決まっていない場合、リレーションシップを何個も書き並べるのは大変です。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 のような)を指定する習慣をつけましょう。