導入
「この人物は何本の映画に出演しているか」「この監督が撮った映画の一覧は」といった集計は、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 だけなので、俳優ごとにグループ分けされ、それぞれの出演本数が集計されます。これはSQLの GROUP 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() はとても便利です。