Cypher索引约束
Posted xuweiweiwoaini
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cypher索引约束相关的知识,希望对你有一定的参考价值。
索引
创建索引
-
使用
CREATE INDEX ON
可以在拥有某个标签的所有节点的某个属性上创建索引。 -
需要注意的是,索引是在后台创建的,并不能立刻就生效。
-
示例:为含有":Person"标签和name属性的所有节点创建了索引
CREATE INDEX ON :Person(name)
删除索引
-
使用
DROP INDEX ON
可以删除拥有某个标签的所有节点的某个属性上的索引。 -
示例:删除有":Person"标签和name属性的所有节点上的索引
DROP INDEX ON :Person(name)
使用索引
-
通常不需要在查询中指定使用哪个索引,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 = ‘Andres‘
RETURN person
在IN中使用索引
-
在WHERE语句中对索引的属性使用IN进行范围查询,索引将被自动使用。
-
示例:
MATCH (person:Person)
WHERE person.name IN [‘Andres‘, ‘Mark‘]
RETURN person
在STARTS WITH中使用索引
-
在WHERE语句中对索引的属性使用IN进行
STARTS WITH
判断,索引将被自动使用。 -
示例:
MATCH (person:Person)
WHERE person.name STARTS WITH ‘And‘
RETURN person
在exists中使用索引
-
在WHERE语句中对索引的属性使用
exists
判断,索引将被自动使用。 -
示例:
MATCH (person:Person)
WHERE exists(person.name)
RETURN person
约束
概述
- Neo4j通过使用约束来保证数据的完整性。约束可以应用于节点或关系。可以创建节点属性的唯一性约束,也可以创建节点和关系的属性存在性约束。
- 可以使用属性的存在性约束来确保拥有特定标签的所有节点或者拥有特定类型的所有关系的属性是存在的。注意:只有Neo4j的企业版才具有属性存在性约束这个高级功能。
- 可以对某个给定的标签添加多个约束,也可以将唯一性约束和存在性约束同时添加到同一个属性上。
- 在属性上添加唯一性约束的同时也会自动为该属性添加一个索引。
节点属性唯一性约束
创建节点属性唯一性约束
-
使用
IS UNIQUE
语法创建约束,它能确保数据库中拥有特定标签和属性值的节点是唯一的。 -
示例:
CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE
删除节点属性唯一性约束
-
使用
DROP CONSTRAINT
可以删除数据库中的一个约束。 -
示例:
DROP CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQU
应用示例
- 示例:创建一个数据库中还不存在的isbn的Book节点
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
- 示例:创建一个数据库中已经存在的isbn的Book节点
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
- 示例:当数据库中已经有两个Book节点拥有相同的isbn属性的时候,在Book节点上创建isbn属性创建属性唯一性约束。
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE
- 解决方案:上述情况下约束创建失败,因为它和已有的数据冲突。可以移除冲突的节点再重新创建约束。
节点属性存在性约束
创建节点属性存在性约束
-
使用
ASSERT exists(variable.propertyName)
创建约束,可确保有指定标签的所有节点都有一个特定的属性。 -
示例:
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn)
删除节点属性存在性节点
-
使用
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‘ })
- 示例:在:Book(isbn)有存在性约束的情况下,试图从一个已存在的Book节点移除isbn属性
MATCH (book:Book { title: ‘Graph Databases‘ })
REMOVE book.isbn
- 示例:当数据库中存在Book节点没有isbn属性时,试图在Book标签节点的isbn属性上创建属性存在性约束
DROP CONSTRAINT ON (book:Book) ASSERT exists(book.isbn)
CREATE (book:Book { title: ‘Graph Databases‘ })
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn)
关系属性存在性约束
创建关系属性存在性约束
-
使用
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
- 示例:有:LIKED(day)存在性约束的情况下,试图从一个已有LIKED关系中移除day属性
MATCH (TomH :Person {name:‘Tom Hanks‘})-[like:LIKED]-> (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
REMOVE like.day
- 示例:当数据库中存在LIKED关系没有day属性时,试图在LIKED关系的day属性上创建属性存在性约束
DROP CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)
MATCH (TomH:Person {name:‘Tom Hanks‘, born:1956}), (book:Book { isbn: ‘1449356265‘, title: ‘Graph Databases‘ })
CREATE (TomH)-[like:LIKED]->(book)
RETURN TomH,book
CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)
以上是关于Cypher索引约束的主要内容,如果未能解决你的问题,请参考以下文章
从只有 MATCH 和 CREATE 关系的 Cypher LOAD CSV 中删除 EAGER