本文へスキップ
BecomeCoder

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

数える・集める ― count() / collect()

ブラウザで完結

導入

「この人物は何本の映画に出演しているか」「この監督が撮った映画の一覧は」といった集計は、Cypherの集約関数で行います。

説明

もっとも基本的な集約関数が count() です。

MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie)
RETURN count(m) AS movieCount

このクエリは、Keanu Reeves が出演した Movie の件数を数えます。

count() のような集約関数を使うと、Cypherは暗黙のグルーピングを行います。「集約関数に渡していない列」を基準にグループ分けし、グループごとに集約関数を計算する、という考え方です。

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

このクエリでは、count(m) に渡していない列は a.name だけなので、俳優ごとにグループ分けされ、それぞれの出演本数が集計されます。これはSQLGROUP BY に相当する動きですが、Cypherでは GROUP BY を明示的に書く必要がなく、「集約関数を使っていない列がそのままグループの基準になる」という点が特徴です。

もう一つよく使う集約関数が collect() です。個々の値を1つのリストにまとめます。

MATCH (a:Person)-[:ACTED_IN]->(m:Movie)
RETURN a.name AS actor, collect(m.title) AS movies

このクエリは、俳優ごとに出演した映画のタイトルを1つのリストにまとめて返します。「1行1件」だった結果を「1行に複数件をまとめる」ときに collect() はとても便利です。

実際に動かしてみよう

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

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

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