Examples
Examples of how to manage constraints used for ensuring data integrity.
Node property uniqueness constraints
A node property uniqueness constraint ensures that all nodes with a particular label have a set of defined properties whose combined value is unique when existing.
Create a node property uniqueness constraint
When creating a property uniqueness constraint, a name can be provided.
CREATE CONSTRAINT constraint_name
FOR (book:Book) REQUIRE book.isbn IS UNIQUE
+-------------------+ | No data returned. | +-------------------+ Unique constraints added: 1
Handling existing constraints when creating a constraint
Creating an already existing constraint will fail. To avoid such an error, IF NOT EXISTS
can be added to the CREATE
command.
This will ensure that no error is thrown and no constraint is created if any other constraint with the given name or another node property uniqueness constraint on the same schema already exists.
CREATE CONSTRAINT constraint_name IF NOT EXISTS
FOR (book:Book) REQUIRE book.isbn IS UNIQUE
Assuming no constraint with the given name or other node property uniqueness constraint on the same schema exists:
+-------------------+ | No data returned. | +-------------------+ Unique constraints added: 1
Specifying an index provider when creating a constraint
To create a property uniqueness constraint with a specific index provider for the backing index, the OPTIONS
clause is used.
The index type of the backing index is set with the indexProvider
option.
The only valid value for the index provider is:
-
range-1.0
Default
CREATE CONSTRAINT constraint_with_options
FOR (n:Label) REQUIRE (n.prop1, n.prop2) IS UNIQUE
OPTIONS {
indexProvider: 'range-1.0',
}
+-------------------+ | No data returned. | +-------------------+ Unique constraints added: 1
There is no valid index configuration values for the constraint-backing range indexes.
Creating an already existing constraint will fail
Create a property uniqueness constraint on the property title
on nodes with the Book
label, when that constraint already exists.
CREATE CONSTRAINT FOR (book:Book) REQUIRE book.title IS UNIQUE
In this case the constraint can not be created because it already exists.
Creating a constraint on the same schema as an existing index will fail
Create a property uniqueness constraint on the property wordCount
on nodes with the Book
label, when an index already exists on that label and property combination.
CREATE CONSTRAINT FOR (book:Book) REQUIRE book.wordCount IS UNIQUE
In this case the constraint can not be created because there already exists an index covering that schema.
Creating a node that complies with an existing constraint
Create a Book
node with an isbn
that is not already in the database.
CREATE (book:Book {isbn: '1449356265', title: 'Graph Databases'})
+-------------------+ | No data returned. | +-------------------+ Nodes created: 1 Properties set: 2 Labels added: 1
Creating a node that violates an existing constraint will fail
Create a Book
node with an isbn
that is already used in the database.
CREATE (book:Book {isbn: '1449356265', title: 'Graph Databases'})
In this case the node is not created in the graph.
Creating a constraint when there exist conflicting nodes will fail
Create a property uniqueness constraint on the property isbn
on nodes with the Book
label when there are two nodes with the same isbn
.
CREATE CONSTRAINT FOR (book:Book) REQUIRE book.isbn IS UNIQUE
In this case the constraint can not be created because it is violated by existing data. Either use Indexes for search performance instead, or remove the offending nodes and then re-apply the constraint.
Node property existence constraints
A node property existence constraint ensures that all nodes with a certain label have a certain property.
Create a node property existence constraint
When creating a node property existence constraint, a name can be provided.
CREATE CONSTRAINT constraint_name
FOR (book:Book) REQUIRE book.isbn IS NOT NULL
+-------------------+ | No data returned. | +-------------------+ Property existence constraints added: 1
Handling existing constraints when creating a constraint
Creating an already existing constraint will fail.
To avoid such an error, IF NOT EXISTS
can be added to the CREATE
command.
This will ensure that no error is thrown and no constraint is created if any other constraint with the given name or another node property existence constraint on the same schema already existed.
CREATE CONSTRAINT constraint_name IF NOT EXISTS
FOR (book:Book) REQUIRE book.isbn IS NOT NULL
Assuming a constraint with the name constraint_name
already existed:
+--------------------------------------------+ | No data returned, and nothing was changed. | +--------------------------------------------+
Creating an already existing constraint will fail
Create a node property existence constraint on the property title
on nodes with the Book
label, when that constraint already exists.
CREATE CONSTRAINT booksShouldHaveTitles
FOR (book:Book) REQUIRE book.title IS NOT NULL
In this case the constraint can not be created because it already exists.
Creating a node that complies with an existing constraint
Create a Book
node with an isbn
property.
CREATE (book:Book {isbn: '1449356265', title: 'Graph Databases'})
+-------------------+ | No data returned. | +-------------------+ Nodes created: 1 Properties set: 2 Labels added: 1
Creating a node that violates an existing constraint will fail
Trying to create a Book
node without an isbn
property, given a property existence constraint on :Book(isbn)
.
CREATE (book:Book {title: 'Graph Databases'})
In this case the node is not created in the graph.
Removing an existence constrained node property will fail
Trying to remove the isbn
property from an existing node book
, given a property existence constraint on :Book(isbn)
.
MATCH (book:Book {title: 'Graph Databases'})
REMOVE book.isbn
In this case the property is not removed.
Creating a constraint when there exist conflicting nodes will fail
Create a constraint on the property isbn
on nodes with the Book
label when there already exists a node without an isbn
.
CREATE CONSTRAINT FOR (book:Book) REQUIRE book.isbn IS NOT NULL
In this case the constraint can’t be created because it is violated by existing data. Remove the offending nodes and then re-apply the constraint.
Relationship property existence constraints
A relationship property existence constraint ensures that all relationships with a certain type have a certain property.
Create a relationship property existence constraint
When creating a relationship property existence constraint, a name can be provided.
CREATE CONSTRAINT constraint_name
FOR ()-[like:LIKED]-() REQUIRE like.day IS NOT NULL
+-------------------+ | No data returned. | +-------------------+ Property existence constraints added: 1
Handling existing constraints when creating a constraint
Creating an already existing constraint will fail.
To avoid such an error, IF NOT EXISTS
can be added to the CREATE
command.
This will ensure that no error is thrown and no constraint is created if any other constraint with the given name or another relationship property existence constraint on the same schema already existed.
CREATE CONSTRAINT constraint_name
IF NOT EXISTS FOR ()-[like:LIKED]-() REQUIRE like.day IS NOT NULL
Assuming a constraint with the name constraint_name
already existed:
+--------------------------------------------+ | No data returned, and nothing was changed. | +--------------------------------------------+
Creating an already existing constraint will fail
Create a named relationship property existence constraint on the property week
on relationships with the LIKED
type, when a constraint with the given name already exists.
CREATE CONSTRAINT relPropExist
FOR ()-[like:LIKED]-() REQUIRE like.week IS NOT NULL
In this case the constraint can not be created because there already exists a constraint with the given name.
Creating a relationship that complies with an existing constraint
Create a LIKED
relationship with a day
property.
CREATE (user:User)-[like:LIKED {day: 'yesterday'}]->(book:Book)
+-------------------+ | No data returned. | +-------------------+ Nodes created: 2 Relationships created: 1 Properties set: 1 Labels added: 2
Creating a relationship that violates an existing constraint will fail
Trying to create a LIKED
relationship without a day
property, given a property existence constraint :LIKED(day)
.
CREATE (user:User)-[like:LIKED]->(book:Book)
In this case the relationship is not created in the graph.
Removing an existence constrained relationship property will fail
Trying to remove the day
property from an existing relationship like
of type LIKED
, given a property existence constraint :LIKED(day)
.
MATCH (user:User)-[like:LIKED]->(book:Book) REMOVE like.day
In this case the property is not removed.
Creating a constraint when there exist conflicting relationships will fail
Create a constraint on the property day
on relationships with the LIKED
type when there already exists a relationship without a property named day
.
CREATE CONSTRAINT FOR ()-[like:LIKED]-() REQUIRE like.day IS NOT NULL
In this case the constraint can not be created because it is violated by existing data. Remove the offending relationships and then re-apply the constraint.
Node key constraints
A node key constraint ensures that all nodes with a particular label have a set of defined properties whose combined value is unique and all properties in the set are present.
Create a node key constraint
When creating a node key constraint, a name can be provided.
CREATE CONSTRAINT constraint_name
FOR (n:Person) REQUIRE (n.firstname, n.surname) IS NODE KEY
+-------------------+ | No data returned. | +-------------------+ Node key constraints added: 1
Handling existing constraints when creating a constraint
Creating an already existing constraint will fail.
To avoid such an error, IF NOT EXISTS
can be added to the CREATE
command.
This will ensure that no error is thrown and no constraint is created if any other constraint with the given name or another node key constraint on the same schema already exists.
CREATE CONSTRAINT constraint_name IF NOT EXISTS
FOR (n:Person) REQUIRE (n.firstname, n.surname) IS NODE KEY
Assuming a node key constraint on (:Person {firstname, surname})
already existed:
+--------------------------------------------+ | No data returned, and nothing was changed. | +--------------------------------------------+
Specifying an index provider when creating a constraint
To create a node key constraint with a specific index provider for the backing index, the OPTIONS
clause is used.
The index type of the backing index is set with the indexProvider
option.
The only valid value for the index provider is:
-
range-1.0
Default
CREATE CONSTRAINT constraint_with_provider
FOR (n:Label) REQUIRE (n.prop1) IS NODE KEY
OPTIONS {
indexProvider: 'range-1.0'
}
+-------------------+ | No data returned. | +-------------------+ Node key constraints added: 1
There is no valid index configuration values for the constraint-backing range indexes.
Node key and property uniqueness constraints are not allowed on the same schema
Create a node key constraint on the properties firstname
and age
on nodes with the Person
label, when a property uniqueness constraint already exists on the same label and property combination.
CREATE CONSTRAINT FOR (p:Person) REQUIRE (p.firstname, p.age) IS NODE KEY
In this case the constraint can not be created because there already exist a conflicting constraint on that label and property combination.
Creating a constraint on same name as an existing index will fail
Create a named node key constraint on the property title
on nodes with the Book
label, when an index already exists with the given name.
CREATE CONSTRAINT bookTitle
FOR (book:Book) REQUIRE book.title IS NODE KEY
In this case the constraint can’t be created because there already exists an index with the given name.
Creating a node that complies with an existing constraint
Create a Person
node with both a firstname
and surname
property.
CREATE (p:Person {firstname: 'John', surname: 'Wood', age: 55})
+-------------------+ | No data returned. | +-------------------+ Nodes created: 1 Properties set: 3 Labels added: 1
Creating a node that violates an existing constraint will fail
Trying to create a Person
node without a surname
property, given a node key constraint on :Person(firstname, surname)
, will fail.
CREATE (p:Person {firstname: 'Jane', age: 34})
In this case the node is not created in the graph.
Removing a NODE KEY-constrained property will fail
Trying to remove the surname
property from an existing node Person
, given a NODE KEY
constraint on :Person(firstname, surname)
.
MATCH (p:Person {firstname: 'John', surname: 'Wood'}) REMOVE p.surname
In this case the property is not removed.
Creating a constraint when there exist conflicting node will fail
Trying to create a node key constraint on the property surname
on nodes with the Person
label will fail when a node without a surname
already exists in the database.
CREATE CONSTRAINT FOR (n:Person) REQUIRE (n.firstname, n.surname) IS NODE KEY
In this case the node key constraint can not be created because it is violated by existing data. Either use Indexes for search performance instead, or remove the offending nodes and then re-apply the constraint.
Drop a constraint by name
Drop a constraint
A constraint can be dropped using the name with the DROP CONSTRAINT constraint_name
command.
It is the same command for uniqueness, property existence, and node key constraints.
The name of the constraint can be found using the SHOW CONSTRAINTS
command, given in the output column name
.
DROP CONSTRAINT constraint_name
+-------------------+ | No data returned. | +-------------------+ Named constraints removed: 1
Drop a non-existing constraint
If it is uncertain if any constraint with a given name exists and you want to drop it if it does but not get an error should it not, use IF EXISTS
.
It is the same command for uniqueness, property existence, and node constraints.
DROP CONSTRAINT missing_constraint_name IF EXISTS
+--------------------------------------------+ | No data returned, and nothing was changed. | +--------------------------------------------+
Listing constraints
Listing all constraints
To list all constraints with the default output columns, the SHOW CONSTRAINTS
command can be used.
If all columns are required, use SHOW CONSTRAINTS YIELD *
.
One of the output columns from |
SHOW CONSTRAINTS
+---------------------------------------------------------------------------------------------------+ | id | name | type | entityType | labelsOrTypes | properties | ownedIndex | +---------------------------------------------------------------------------------------------------+ | 4 | "isbnConstraint" | "UNIQUENESS" | "NODE" | ["Book"] | ["isbn"] | "isbnConstraint" | +---------------------------------------------------------------------------------------------------+ 2 rows
Listing constraints with filtering
One way of filtering the output from SHOW CONSTRAINTS
by constraint type is the use of type keywords,
listed in the syntax for listing constraints type filter table.
For example, to show only property uniqueness constraints, use SHOW UNIQUENESS CONSTRAINTS
.
Another more flexible way of filtering the output is to use the WHERE
clause.
An example is to only show constraints on relationships.
SHOW EXISTENCE CONSTRAINTS
WHERE entityType = 'RELATIONSHIP'
This will only return the default output columns.
To get all columns, use SHOW INDEXES YIELD * WHERE ...
.
+---------------------------------------------------------------------------------------------------------------------------+ | id | name | type | entityType | labelsOrTypes | properties | ownedIndex | +---------------------------------------------------------------------------------------------------------------------------+ | 7 | "constraint_f076a74d" | "RELATIONSHIP_PROPERTY_EXISTENCE" | "RELATIONSHIP" | ["KNOWS"] | ["since"] | <null> | +---------------------------------------------------------------------------------------------------------------------------+ 1 row
Was this page helpful?