デーヴの答えはかなりいいですが、部署の管理者が一番報告しているケースが恋しいです。もしネクタイがあなたにとって重要でないなら、デイブの答えに固執してください。
このクエリにはいくつかのステップがありますが、最も関連性の高いレポートを含む各部門のマネージャが返されます。
// first find managers with people reporting to them
MATCH (manager:Person)-[:WORKS_IN]->(d:Department)
WHERE EXISTS((:Person)-[:REPORTS_TO]->(manager))
// get the number of reporters for each manager, then find the max for all managers in each department per department
WITH d, manager, size((:Person)-[:REPORTS_TO]->(manager)) as reportSize
WITH d, max(reportSize) as maxReports
// find all managers in the department with the department's max report size
MATCH (manager:Person)-[:WORKS_IN]->(d)
WHERE size((:Person)-[:REPORTS_TO]->(manager)) = maxReports
RETURN d, COLLECT(manager) as topManager, maxReports
これは部署とマネージャーのノードを戻しますが、これを簡単に変更して、代わりにプロパティーからIDまたは名前を出力することができます。
Cypherの集約は、残りの非集約列によってグループ化されます。そのため、maxReports
を計算するとスコープからmanager
が削除されます。マネージャーごとと部門ごとではなく、部門ごとに集計が行われます(マネージャーごとのレポートと同じです)。
Neo4j 3.1の今後の変更(2016年9月上旬にはまだ開発中)を使用して最適化する方法があるかもしれませんが、非常に有用なサブクエリのように機能するパターン理解機能があります。
もう一度ありがとうございます。この答えは、私がシリアルWITHの力を理解するのを助け、サイズ(パターン)オプションに私をもたらしました。 – Daniel