# Neo4jの機能と実践的な使い方
⚡ 「グラフDBでもインデックス設計が性能の8割」。MATCHの起点となるプロパティに正しい索引を張るだけで、検索が O(n) から O(log n) に変わります。
🏷️ タイトル: Range / Text / Point / Composite index
🔗 URL:
📘 概要
インデックスはノード・リレーションシップ・プロパティの複製で、主データへの高速なアクセス経路を提供します。作成後はDBMSが自動でメンテナンスします。MATCHのアンカー(起点)探索を高速化し、クエリプランナが述語に応じて自動選択します。
⚙️ 機能の説明
・Range(既定): 等価・範囲比較・`IN`・`STARTS WITH` など最も多くの述語を解決します。まず張るべき索引です。
・Text: `STRING` 専用で、`CONTAINS` と `ENDS WITH` を最適化します。部分一致の画面検索向きです。
・Point: 空間 `POINT` 値専用で、距離検索やバウンディングボックス内検索を最適化します。
・Composite: 複数プロパティをまとめて索引化し、複数条件の絞り込みを一度に解決します。
・Token lookup: ラベル/リレーションシップ型の探索を高速化する基盤索引です。
・このほか全文検索インデックスとベクトルインデックス(類似検索/GenAI向け)があります。
🛠️ 実践的な使い方
起点プロパティへの range / composite / text / point インデックスの作成例です。
```cypher
CREATE INDEX user_email IF NOT EXISTS
FOR (u:User) ON (
CREATE INDEX order_composite IF NOT EXISTS
FOR (o:Order) ON (o.customerId, o.status);
CREATE TEXT INDEX product_name_text IF NOT EXISTS
FOR (p:Product) ON (
CREATE POINT INDEX store_loc IF NOT EXISTS
FOR (s:Store) ON (s.location);
```
確認・削除は次の通りです。
```cypher
SHOW INDEXES;
DROP INDEX user_email IF EXISTS;
```
💡 ユースケース
・` を MATCH の起点にするアプリで、ルックアップを O(log n) 化。
・`STARTS WITH` は range、`CONTAINS`/`ENDS WITH` は text、地理検索は point を選ぶ画面検索。
⚠️ 注意点
・どの索引が効くかは述語次第です。`CONTAINS` は range では効かず text が必要、という対応関係を意識します。
・索引は書き込みコストとストレージを増やします。実際に使われるか `PROFILE` で確認してから運用に乗せます。
・複合インデックスは先頭プロパティから順に効くため、列の順序が性能を左右します。
#
Neo4j# #
Cypher#