本文へスキップ
BecomeCoder

Neo4jコース · 第6章 集計と高度なクエリ · レッスン33

サブクエリ ― CALL { ... }

ブラウザで完結

導入

クエリの一部を独立した小さな処理として切り出したいときに使うのが、CALL { ... } によるサブクエリです。

説明

MATCH (a:Person)
CALL {
  WITH a
  MATCH (a)-[:ACTED_IN]->(m:Movie)
  RETURN count(m) AS movieCount
}
RETURN a.name AS actor, movieCount

CALL { ... } の波括弧の中は、独立したスコープ変数の見える範囲)を持つ小さなクエリです。外側の変数を中で使いたい場合は、WITH a のように明示的に持ち込む必要があります。

サブクエリの特徴は、外側の行ごとに1回ずつ評価されることです。上の例では、MATCH (a:Person) で見つかった人物1人1人について、サブクエリ内の MATCH (a)-[:ACTED_IN]->(m:Movie)count(m) が個別に実行されます。

flowchart TD
    O["外側: MATCH (a:Person)<br/>Alice, Bob, Carol..."] --> C1["CALL { ... }<br/>Aliceについて集計"]
    O --> C2["CALL { ... }<br/>Bobについて集計"]
    O --> C3["CALL { ... }<br/>Carolについて集計"]

これは、複雑な集計を複数まとめて1つのクエリで行いたいときや、他の集約結果に影響を与えずに「行ごとに独立した」計算をしたいときに役立ちます。WITH が「前段の結果全体を次段に流す」のに対し、CALL { ... } は「行ごとに閉じた小さな処理を差し込む」もの、とイメージしておくと使い分けがしやすくなります。

実際に動かしてみよう

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

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

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