# Neo4jの機能と実践的な使い方
🕸️ 「このサーバーが落ちたら、何が連鎖して止まるのか?」——その答えは、関係を何ホップでも辿れるCypherの可変長パターンが教えてくれます。
🏷️ タイトル: 可変長パターン(`*1..5`)/ SHORTEST / Quantified Path Patterns
🔗 URL:
📘 概要
可変長パターンは、ホップ数が固定でない経路をひとつのパターンで表現するCypherの機能です。「最大5段まで遡る」「最短経路を1本だけ取る」といった、グラフならではの問いをそのまま宣言的に書けます。最短経路探索やQuantified Path Patterns(QPP)もこの仲間です。
⚙️ 機能の説明
・量化リレーションシップ(従来構文): `[:REL*1..5]` は1〜5回の繰り返しを表します。`*2` はちょうど2回、`*3..` は3回以上、`*..10` は10回以下、`+` は1回以上、`*` は0回以上を意味します。
・Quantified Path Patterns(QPP): `((a)-[r:NEXT]->(b)){1,3}` のようにパターン全体を括弧で囲んで繰り返します。GQL準拠で、内部にWHEREのインライン述語を書けるのが強みです。
・グループ変数: QPP内で宣言した変数は、外側から参照するとマッチした要素のリストになります(例: `r` がリレーションシップの配列)。`reduce()` などと組み合わせて経路上の合計距離を計算できます。
・最短経路: `SHORTEST k` で最短をk本、`ALL SHORTEST` で同率最短をすべて、`ANY` で任意の1本を取得します。旧来の `shortestPath()` / `allShortestPaths()` 関数も使えますが、キーワード構文の方が高速です。
🛠️ 実践的な使い方
サプライチェーンで供給元を最大5段まで遡る例です。
```cypher
MATCH (p:Part {sku: $sku})-[:SUPPLIED_BY*1..5]->(supplier:Company)
RETURN DISTINCT
```
2人を最短で繋ぐ紹介経路(最短1本)です。
```cypher
MATCH path = SHORTEST 1 (a:Person {id:$a})-[:KNOWS]-+(b:Person {id:$b})
RETURN [n IN nodes(path) | AS intro_chain
```
💡 ユースケース
・障害影響分析:あるサーバー障害が何ホップ先まで波及するか。
・マネーロンダリング検知:口座間の資金移動経路の追跡。
・組織図・SNS:上司の上司、友達の友達の最短到達経路。
⚠️ 注意点
・上限のない `*` や `[:REL*]` はパス爆発を招き、数百万件のマッチで実行が止まりかねません。必ず上界(`*1..5` など)を付けます。
・ラベル・リレーションシップ型・インライン述語で探索範囲を早期に枝刈りすると劇的に速くなります。QPPはこの枝刈りに向いています。
・Cypherは既定で同一リレーションシップの再走査を許しません。必要に応じて挙動が変わる点に注意してください。
#
Neo4j# #
Cypher#