一、Neo4j CQL - 索引
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。
我们可以为具有相同标签名称的所有节点的属性创建索引。
我们可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。
1.1、Neo4J索引操作
- Create Index 创建索引
- Drop Index 丢弃索引
1.2、创建索引语法:
Neo4j的CQL提供“CREATE INDEX”命令创建的节点或关系的属性索引。
1.3、创建索引的语法:
CREATE INDEX ON :<label_name> (<property_name>)
注意:
冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它在节点或关系的<label_name>的<property_name>上创建一个
1.4、创建索引
使用CREATE INDEX ON可以在拥有某个标签的所有节点的某个属性上创建索引。注意,索引是在后台创建,并不能立刻就生效。
CREATE INDEX ON :Person(name) |
本例在拥有Person标签的所有节点的name属性上创建了索引。
1.5、使用索引
通常不需要在查询中指出使用哪个索引,Cypher自己会决定。例
MATCH (person:Person { name: 'Andres' }) RETURN person |
在WHERE等式中使用索引
在WHERE语句中的对索引的属性进行相等比较时,索引将自动被使用。
MATCH (person:Person) WHERE person.name = 'Andres' RETURN person |
使用WHERE不等式中使用索引
在WHERE语句中的对索引的属性进行不等(范围)比较时,索引将自动被使用。
MATCH (person:Person) WHERE person.name > 'B' RETURN person |
在 IN中使用索引
下面查询中针对 person.name的IN断言将使用Person(name)索引。
MATCH (person:Person) WHERE person.name IN ['Andres', 'Mark'] RETURN person |
在STARTS WITH中使用索引
下面的查询语句在针对person.name的STARTS WITH断言将使用Person(name)索引。
查询
MATCH (person:Person) WHERE person.name STARTS WITH 'And' RETURN person |
在检查属性存在性时使用索引
下面查询中的has(p.name)断言将使用Person(name)索引。
MATCH (p:Person) WHERE exists(p.name) RETURN p |
1.6、删除索引
使用DROP INDEX可以删除拥有某个标签的所有节点的某个属性上的索引。
DROP INDEX ON :Person(name) |
1.7、查询已经创建的索引:
使用::schema 列出所有标签的所有记录
二、Neo4j CQL - UNIQUE约束
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
Neo4j通过使用约束来保证数据完整性。约束可应用于节点或者关系。可以创建节点属性的唯一性约束,也可以创建节点和关系的属性存在性约束。
可以使用属性的存在性约束确保拥有特定标签的所有节点或者拥有特定类型的所有关系的属性是存在的。所有的试图创建新的没有该属性的节点或关系,以及试图删除强制属性的查询都将失败。注意:只有Neo4j企业版才具有属性存在性约束这个高级功能。
可以对某个给定的标签添加多个约束,也可以将唯一性约束和存在性约束同时添加到同一个属性上。
在属性上添加唯一性约束的时候,同时也会自动为该属性添加一个索引。因此,不能单独地添加这样一个索引。
UNIQUE约束的优点
- 避免重复记录。
- 强制执行数据完整性规则。
Neo4j CQL UNIQUE约束操作
- 创建UNIQUE约束
- 丢弃UNIQUE约束。
创建UNIQUE约束
Neo4j CQL已提供“CREATE CONSTRAINT”命令,以在NODE或关系的属性上创建唯一约束。
创建唯一约束语法
CREATE CONSTRAINT ON (<label_name>) ASSERT <property_name> IS UNIQUE
语法说明:
S.No. | 语法元素 | 描述 |
---|---|---|
1。 | CREATE CONSTRAINT ON | 它是一个Neo4j CQL关键字。 |
2。 | <label_name> | 它是节点或关系的标签名称。 |
3。 | ASSERT | 它是一个Neo4j CQL关键字。 |
4。 | <property_name> | 它是节点或关系的属性名称。 |
5。 | IS UNIQUE | 它是一个Neo4j CQL关键字,通知Neo4j数据库服务器创建一个唯一约束。 |
注意:-
上述语法描述了它的<PROPERTY_NAME> <LABEL_NAME>节点或关系创造了一个独特的约束。
2.1、唯一性约束
2.1.1、节点属性的唯一性约束
使用IS UNIQUE语法创建约束,它能确保数据库中拥有特定标签和属性值的节点是唯一的。
CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE |
2.1.2、删除唯一性约束
使用DROP CONSTRAINT可以删除数据库中的一个约束。
DROP CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE |
创建遵从属性唯一性约束的节点
创建一个数据库中还不存在的isbn的Book节点。
CREATE (book:Book { isbn: '1449356265', title: 'Graph Databases' }) |
创建违背属性唯一性约束的节点
创建一个数据库中已经存在的isbn的节点。
CREATE (book:Book { isbn: '1449356265', title: 'Graph Databases' }) |
这种情况下,节点将创建失败。
错误消息
Node 0 already exists with label Book and property "isbn"=[1449356265]
因为冲突的节点而创建属性唯一性约束失败
当数据库中已经有两个Book节点拥有相同的isbn号时,在Book节点的isbn属性上创建属性唯一性约束。
CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE |
这种情况下约束将创建失败,因为它与已有的数据冲突。可以选择创建索引或者移除冲突的节点然后再重新创建约束。
错误消息
Unable to create CONSTRAINT ON ( book:Book ) ASSERT book.isbn IS UNIQUE:
Multiple nodes with label `Book` have property `isbn` = '1449356265':
node(0)
node(1)
2.2、节点属性存在性约束
2.2.1、创建节点属性存在性约束
使用ASSERT exists(variable.propertyName)创建约束,可确保有指定标签的所有节点都有一个特定的属性。
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn) |
2.2.2、删除节点属性存在性约束
使用DROP CONSTRAINT可以从数据库中移除一个约束。
DROP CONSTRAINT ON (book:Book) ASSERT exists(book.isbn) |
创建遵从属性存在性约束的节点
创建一个存在isbn属性的Book节点。
CREATE (book:Book { isbn: '1449356265', title: 'Graph Databases' }) |
创建违背属性存在性约束的节点
在:Book(isbn)有存在性约束的情况下,试图创建一个没有isbn属性的Book节点。
CREATE (book:Book { title: 'Graph Databases' }) |
错误消息
Node 1 with label "Book" must have the property "isbn" due to a constraint
删除有存在性约束的节点属性
在:Book(isbn)有存在性约束的情况下,试图从一个已存在的Book节点移除isbn属性。
MATCH (book:Book { title: 'Graph Databases' }) REMOVE book.isbn |
这种情况下,移除属性将失败。
错误消息
Node 0 with label "Book" must have the property "isbn" due to a constraint
因已存在的节点而创建节点属性存在性约束失败
当数据库中存在Book节点没有isbn属性时,试图在Book标签节点的isbn属性上创建属性存在性约束。
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn) |
这种情况因为与已存在的数据冲突,因此约束创建失败。可以选择移除冲突的节点,然后再重新创建约束。
错误消息
Unable to create CONSTRAINT ON ( book:Book ) ASSERT exists(book.isbn):
Node(0) with label `Book` has no value for property `isbn`
2.3、关系属性存在性约束
使用ASSERT exists(variable.propertyName)创建约束,可确保特定类型的所有关系都有一个特定的属性。
CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day) |
删除关系属性存在性约束
使用DROP CONSTRAINT从数据库中移除一个约束。
DROP CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day) |
创建遵从属性存在性约束的关系
创建一个存在day属性的LIKED关系。
MATCH (TomH:Person {name:'Tom Hanks', born:1956}), (book:Book { isbn: '1449356265', title: 'Graph Databases' }) CREATE (TomH)-[like:LIKED { day: 'yesterday' }]->(book) return TomH,book |
创建违背属性存在性约束的关系
在有:LIKED(day)存在性约束的情况下,试图创建一个没有day属性的LIKED关系。
MATCH (Nora :Person {name:'Nora Ephron'}), (book:Book { isbn: '1449356265', title: 'Graph Databases' }) CREATE (Nora)-[like:LIKED]->(book) return Nora,book
|
这种情况下,关系将创建是吧。
错误消息
Relationship 1 with type "LIKED" must have the property "day" due to a constraint
移除具有存在性约束的关系属性
有:LIKED(day)存在性约束的情况下,试图从一个已有LIKED关系中移除day属性。
MATCH (TomH :Person {name:'Tom Hanks'})-[like:LIKED]-> (book:Book { isbn: '1449356265', title: 'Graph Databases' }) REMOVE like.day |
错误消息
Relationship 0 with type "LIKED" must have the property "day" due to a constraint
因已存在的关系而创建关系属性存在性约束失败
当数据库中存在LIKED关系没有day属性时,试图在LIKED关系的day属性上创建属性存在性约束。
CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day) |
这种情况因为与已存在的数据冲突,因此约束创建失败。可以选择移除冲突的关系,然后再重新创建约束。
错误消息
Unable to create CONSTRAINT ON ()-[ liked:LIKED ]-() ASSERT exists(liked.day):
Relationship(0) with type `LIKED` has no value for property `day`
学习文档出自:庞国明 老师教学视频