本文へスキップ
BecomeCoder

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

あるかもしれない関係 ― OPTIONAL MATCH

ブラウザで完結

導入

MATCH は、パターンに一致するものが1つもなければ、その行自体が結果から消えてしまいます。「関係があってもなくても、ノード自体は結果に残したい」というときに使うのが OPTIONAL MATCH です。

説明

たとえば、すべての Person ノードについて、監督した映画があれば一緒に表示し、なければ「監督作品なし」として表示したいとします。

MATCH (p:Person)
OPTIONAL MATCH (p)-[:DIRECTED]->(m:Movie)
RETURN p.name AS name, m.title AS directedMovie
  • MATCH (p:Person) で、すべての人物をまず取得する。
  • OPTIONAL MATCH (p)-[:DIRECTED]->(m:Movie) で、その人物が監督した映画があれば m に入れる。もし監督作品が1本もなければ、mnull(値がないことを表す特別な値)になる。

これは、RDB(リレーショナルデータベース)における LEFT JOIN に相当する動きです。通常の MATCHINNER JOIN 相当)では、一致するものがないノードはまるごと結果から消えてしまいますが、OPTIONAL MATCHLEFT JOIN 相当)を使うと、一致するものがなくても元のノード(p)は結果に残り、一致しなかった側(m)だけが null になります。

graph TB
    subgraph normal["MATCH のみ(一致しないと消える)"]
        n1["監督作品がない人物は<br/>結果から消える"]
    end
    subgraph opt["OPTIONAL MATCH(一致しなくても残る)"]
        o1["監督作品がない人物も残り<br/>m は null になる"]
    end

「関係が存在するかどうか自体を知りたい」ときにも便利です。次のように書けば、directedMovienull かどうかで、その人物が監督作品を持つかを判定できます。

MATCH (p:Person)
OPTIONAL MATCH (p)-[:DIRECTED]->(m:Movie)
RETURN p.name AS name, m IS NOT NULL AS hasDirected

この章では、WHERE による絞り込み、向きやホップ数の指定、並び替えとページング、そして「あるかもしれない関係」を扱う OPTIONAL MATCH を学びました。次章では、いよいよデータを更新する方法(MERGESETDELETE)に進みます。

実際に動かしてみよう

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

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

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