導入
データが増えてくると、「特定のプロパティで検索するたびに全ノードを見て回る」のでは遅くなります。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 を安心して多用できるようになります。実務では、「重複させたくないプロパティには一意性制約を先に作る」 のが基本パターンです。