# Neo4j Features and Practical Usage
🔒 Create one uniqueness constraint before importing—and you get duplicate-proof MERGE plus fast lookups at the same time. The official docs list it as a prerequisite step for imports.
🏷️ Title: Uniqueness / Property existence / Node key constraints
🔗 URL:
📘 Overview
Constraints enforce rules that nodes and relationships must satisfy, at the database layer. They guarantee key uniqueness and required properties, keeping entities consistent even when multiple pipelines write to the graph. Uniqueness constraints also create a backing range index, so lookups get faster too.
⚙️ How It Works
・Property uniqueness: guarantees a property value (or combination) is unique per label/type. Available in Community Edition, with a backing range index that optimizes MERGE and imports.
・Property existence: guarantees a given property is always present (Enterprise only).
・Property type: guarantees a property has the required type, preventing schema drift (Enterprise only).
・Key constraints (Node key / Relationship key): combine uniqueness and existence—equivalent to a composite primary key (Enterprise only).
🛠️ Practical Usage
The uniqueness constraint to always create before importing:
```cypher
CREATE CONSTRAINT person_id IF NOT EXISTS
FOR (p:Person) REQUIRE IS UNIQUE;
```
A node key (composite key) and an existence constraint:
```cypher
CREATE CONSTRAINT order_key IF NOT EXISTS
FOR (o:Order) REQUIRE (o.tenantId, o.orderId) IS NODE KEY;
CREATE CONSTRAINT user_email_exists IF NOT EXISTS
FOR (u:User) REQUIRE IS NOT NULL;
```
Inspect and drop them:
```cypher
SHOW CONSTRAINTS;
DROP CONSTRAINT person_id IF EXISTS;
```
💡 Use Cases
・Create a uniqueness constraint before a bulk import to get duplicate prevention and speedup in one move.
・Enforce key integrity for master-data nodes at the DB layer, preventing doubling even with multiple writing pipelines.
⚠️ Caveats
・Everything except uniqueness (existence, type, key) is Enterprise Edition only; Community supports uniqueness alone.
・Creating a constraint on data that already violates it fails. Clean the data first.
・Bulk imports are validated against active constraints and can fail on violations.
・For more sophisticated or centralized schema management, defining a schema via a graph type is recommended.
#
Neo4j# #
Cypher#