本文へスキップ
BecomeCoder

Neo4jコース · 第7章 グラフのデータモデリング · レッスン37

インデックスと制約 ― 速さと一意性

ローカル実施

導入

データが増えてくると、「特定のプロパティで検索するたびに全ノードを見て回る」のでは遅くなります。RDBと同様に、Neo4jにも検索を高速化する仕組みと、重複を防ぐ仕組みがあります。

説明

インデックス(index) は、特定のラベル・プロパティの組み合わせに対して検索を高速化する仕組みです。

CREATE INDEX person_name_index FOR (p:Person) ON (p.name)

このインデックスを作成しておくと、MATCH (p:Person {name: 'Alice'}) のような検索が高速に行えるようになります。検索の頻度が高いプロパティには、インデックスを作っておくのが定石です。

制約(constraint) は、データの整合性を保証する仕組みです。特によく使うのが、値の重複を許さない 一意性制約(uniqueness constraint) です。

CREATE CONSTRAINT person_name_unique FOR (p:Person) REQUIRE p.name IS UNIQUE

この制約を設定すると、同じ name を持つ Person ノードを2つ作ろうとした場合にエラーになり、データベース自身が重複を防いでくれます。また、一意性制約はインデックスの機能も兼ねているため、検索が速くなるという副次的な効果もあります。

flowchart TD
    C["CREATE CONSTRAINT<br/>... REQUIRE p.name IS UNIQUE"] --> B["データベースが<br/>name の重複を自動チェック"]
    B --> M["MERGE (p:Person {name: ...})<br/>の検索も高速になる"]

第5章で「MERGE繰り返し実行しても安全」と学びましたが、MERGE は内部的に「一致するものがあるか」を毎回検索しています。一意性制約(=インデックス)を先に作っておくことで、この検索が高速になり、MERGE を安心して多用できるようになります。実務では、「重複させたくないプロパティには一意性制約を先に作る」 のが基本パターンです。