# Neo4jの機能と実践的な使い方
🕸️ 「上司の上司」も「友達の友達でまだ友達でない人」も、MATCHのパターン1つで言い表せます。
🏷️ タイトル: MATCH / OPTIONAL MATCH / WHERE
🔗 URL:
📘 概要
MATCHはCypherの中核で、グラフ内から特定のパターンを検索する句です。ノード・リレーションシップ・プロパティのパターンを宣言し、WHEREで絞り込み、OPTIONAL MATCHでLEFT JOIN相当の「あれば取得」を表現します。グラフ検索の大半はこの3つの組み合わせで成立します。
⚙️ 機能の説明
・ノードマッチ: `MATCH (m:Movie) RETURN m.title`。ラベルなし`(n)`は全ノード
・ラベル式: OR は `(n:Movie|Person)`、否定は `(n:!Movie)`
・リレーションシップ: 方向は`-->`/`<--`、無向は`--`で両方向にマッチ
・型式: `-[:ACTED_IN|DIRECTED]-` で複数型をOR(1本に複数型は付かないので`:A&B`は決して一致しない)
・可変長: `-[:REPORTS_TO*2]->` のように複数ホップをたどる
・WHERE: パターン後の絞り込み。`NOT EXISTS { ... }` でパターンの否定も可能
・OPTIONAL MATCH: 一致がなければ変数をnullにして続行(LEFT JOIN相当)
複数のMATCHは順次評価されます。変数で結合されないと意図しない直積(Cartesian product)になるため、`WITH`で変数の受け渡しを制御します。
🛠️ 実践的な使い方
組織図で「上司の上司」を可変長でたどります。
```cypher
MATCH (e:Employee {name: $n})-[:REPORTS_TO*2]->(boss)
RETURN
```
SNSで「友達の友達でまだ友達でない人」を否定パターンで表します。
```cypher
MATCH (me:Person {id: $id})-[:FRIEND]-(f)-[:FRIEND]-(fof)
WHERE me <> fof AND NOT (me)-[:FRIEND]-(fof)
RETURN DISTINCT
```
プロフィール画面で「注文があれば注文も返す」。
```cypher
MATCH (u:User {id: $id})
OPTIONAL MATCH (u)-[:ORDERED]->(o:Order)
RETURN collect( AS orders
```
💡 ユースケース
組織階層のたどり、SNSの友達推薦(FoF)、プロフィールAPIでの任意関連の同梱取得など、関係の有無や多段の到達可能性を問う画面・分析に直結します。
⚠️ 注意点
・変数で結ばれない複数MATCHは直積になり、件数が爆発します。`WITH`やWHEREで必ず結びます。
・可変長(`*`)は上限なしだと巨大グラフで重くなります。`*1..5`のように上限を付けます。
・パラメータ・ラベル動的指定(`$(labels)`)はバージョンによりインデックス活用が限定されます。性能要件があれば確認しましょう。
#
Neo4j# #
Cypher#