本文へスキップ
BecomeCoder

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

クエリをつなぐ ― WITH

ブラウザで完結

導入

1つの MATCH ... RETURN では表現しきれない、段階を踏んだ処理をしたいことがあります。そこで使うのが、クエリを前後でつなぐ WITH 句です。

説明

WITH は「ここまでの結果を、次の処理に引き渡す」ためのキーワードです。RETURN によく似ていますが、RETURN がクエリの最後で結果を確定させるのに対し、WITH はクエリの途中で使い、その後にさらに MATCHWHERE を続けられます。

MATCH (a:Person)-[:ACTED_IN]->(m:Movie)
WITH a, count(m) AS movieCount
WHERE movieCount >= 2
RETURN a.name AS actor, movieCount
ORDER BY movieCount DESC
flowchart LR
    M["MATCH<br/>俳優と出演映画を探す"] --> W["WITH<br/>俳優ごとに件数を集計して<br/>次に引き渡す"]
    W --> WH["WHERE<br/>2本以上の俳優だけに絞る"]
    WH --> R["RETURN<br/>結果を返す"]

このクエリのポイントは、集計した後の値(movieCount)に対して WHERE で条件をかけていることです。実は、集計そのものに対する条件(SQLでいう HAVING に相当する処理)は、WITH で一度集計結果を確定させてからでないと WHERE で使えません。これが WITH の代表的な使いどころです。

WITH は「クエリのパイプライン」を作る道具だと考えると理解しやすくなります。前段の結果を次の段に渡し、その段でさらに絞り込みや加工を行い、また次の段へ……という形で、複雑な処理を小さな段階に分けて組み立てられます。

実際に動かしてみよう

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

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

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