導入
クエリの一部を独立した小さな処理として切り出したいときに使うのが、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 { ... } は「行ごとに閉じた小さな処理を差し込む」もの、とイメージしておくと使い分けがしやすくなります。