Cypher入門:Neo4jで学ぶ構文・実例・性能最適化ガイド
Cypher とは — 概要
Cypher(サイファー)は、グラフデータベース向けの宣言型クエリ言語です。ノード(点)とリレーションシップ(辺)というグラフの構造を直感的に表現する構文を持ち、パターンマッチングを中心にデータの検索、挿入、更新、削除が行えます。主にNeo4jで利用されてきましたが、仕様の一部は公開され、他のグラフデータベースやツールでも採用・参照されています。
歴史と標準化の動向
CypherはNeo4j社によって設計・発展してきた言語で、2010年代に広く知られるようになりました。2015年には「openCypher」として仕様と実装が一部公開され、コミュニティが参照できる形になりました。その後、グラフ問い合わせの標準化に向けた動き(GQL:Graph Query Language)も進み、GQLはCypherや他の提案(PGQL、G-COREなど)の経験を取り込みながら標準化を目指しています。実装や標準の状況は継続的に更新されているため、最新の動向は公式ドキュメントや標準化団体の情報を確認してください。
基本概念と構文
- ノード(Node):丸括弧で表現。例:(n:Person {name: 'Alice'}) — ラベル(:Person)とプロパティを持てます。
- リレーションシップ(Relationship):矢印付きの角括弧で表現。例:-[:KNOWS]->
- パターンマッチング:MATCH句でグラフのパターンを指定してマッチングします。
- 宣言的スタイル:SQLのように「どう取得するか」を記述するスタイルで、アルゴリズム手順ではなく結果の形を記述します。
主要キーワード(抜粋)
- MATCH / OPTIONAL MATCH:パターン検索(存在しないパスを許容するのがOPTIONAL)
- WHERE:条件フィルタ
- RETURN:結果の返却
- CREATE / MERGE:ノードやリレーションシップの作成(MERGEは「存在しなければ作る」操作)
- SET / REMOVE:プロパティの更新や削除
- DELETE:ノード/リレーションの削除
- WITH:パイプライン処理、集計やスコープ切替に利用
- UNWIND:配列を行に展開
- CALL:ストアドプロシージャやカスタム機能の呼び出し(例:APOCなど)
簡単なクエリ例
以下は基本的な操作例です(Neo4j/openCypher準拠の構文)。
// ノードの作成
CREATE (a:Person {name: 'Alice', age: 30}), (b:Person {name: 'Bob', age: 35})
CREATE (a)-[:KNOWS {since: 2010}]->(b)
// パターン検索と返却
MATCH (p:Person)-[r:KNOWS]->(q:Person)
WHERE p.age > 25
RETURN p.name AS from, q.name AS to, r.since AS since
// MERGEで一意性を保って作成
MERGE (c:Company {name: 'Acme'})
MERGE (p:Person {email: 'alice@example.com'})
MERGE (p)-[:WORKS_AT]->(c)
応用構文と機能
- 長さや経路の検索:パス長を指定したパターン(e.g. (a)-[*1..3]->(b))や shortestPath() 関数で最短経路を取れます。
- 集計とグルーピング:COUNT, SUM, AVG, COLLECT などの集計関数が利用でき、WITHを使って中間集約結果を渡します。
- サブクエリ:CALL { ... } やサブクエリ構文で複雑な処理を分割可能です(Neo4jのバージョン依存の機能あり)。
- ストアドプロシージャとカスタム関数:CALLを使ってサーバー側のプロシージャや拡張機能(APOCなど)を実行できます。
モデリングとパフォーマンスの考慮点
グラフモデリングはRDBとは異なる設計判断が必要です。重要なポイント:
- ラベルとプロパティ設計:ラベルはノードのカテゴリ(複数可)。頻繁に検索する属性はインデックス化を検討。
- インデックスと制約:CREATE INDEX、CREATE CONSTRAINT で検索高速化とデータ整合性を確保。
- パターンマッチングのコスト:広い度数(high-degree)ノードや長大なパスは検索コストが高い。不要な全探索を避けるためにラベルやプロパティで絞り込む。
- クエリ計画の確認:EXPLAIN / PROFILE を使ってプランを確認し、インデックスが使用されているか、どのノードアクセスがボトルネックかを調べる。
- データ分割:巨大グラフではパーティショニングやシャーディング戦略、読み取り専用レプリカなどを検討。
拡張とエコシステム
Neo4jは標準的なCypherに加え、APOC(Awesome Procedures On Cypher)やNeo4j Graph Data Science(GDS)ライブラリなど豊富な拡張を提供します。APOCは便利なユーティリティ関数群、GDSはページランクやクラスタリングなどのグラフアルゴリズムをサポートします。openCypherとして仕様が公開されたことで、他ベンダーやツールが参照する機会も増えています。
セキュリティと運用面
- アクセス制御:ユーザーやロールによる権限制御、データベースごとのアクセス管理を用意(Neo4jのEnterprise機能等で強化)。
- 監査とログ:クエリログ、監査ログの活用で不正利用やパフォーマンス問題の追跡を行う。
- バックアップと一貫性:トランザクションログやスナップショットを用いた定期バックアップ。HA構成やレプリケーションで可用性を確保。
Cypher を選ぶ理由・ユースケース
Cypherはソーシャルネットワーク分析、詐欺検出、推薦エンジン、ナレッジグラフ、ネットワークインフラ管理など、関係性を重視するドメインで威力を発揮します。パターンベースに自然に表現できるため、複雑な結合(ジョイン)を多用するRDBベースの実装より直感的かつ効率的に記述できる場面が多いです。
互換性と今後の見通し
Cypherは長年の実運用で成熟してきましたが、グラフクエリ言語の標準化(GQL)や各ベンダーの実装差異により、完全な相互運用性には注意が必要です。openCypherの仕様や各製品のドキュメントを参照し、ターゲットプラットフォームでの動作確認を行ってください。今後はGQLを中心とした標準化の進展により、より広範な互換性・エコシステムの拡大が期待されています。
まとめ
Cypherはグラフの構造を直感的に扱える強力な宣言型言語で、Neo4jをはじめとしたグラフデータベースで広く使われています。パターンマッチングを中心とした表現力、豊富な拡張、実務での最適化手法が揃っており、関係性重視のデータ処理に適しています。一方でパフォーマンスや互換性の観点から設計・チューニング・運用の知見が重要になるため、導入時はモデリングとクエリプランの確認を怠らないことが成功の鍵です。
参考文献
- Neo4j — Cypher query language (公式ドキュメント)
- openCypher (GitHub)
- Neo4j Developer Guide — Cypher basics
- GQL (Graph Query Language) — 標準化プロジェクト公式サイト
- APOC (Awesome Procedures On Cypher) — Neo4j


