neo4j学习总结--第七课 Cypher 索引与约束

本文介绍了Neo4j CQL中如何创建、使用和删除索引,以及如何添加和删除UNIQUE约束。通过索引和约束,可以提升查询性能并保证数据完整性。详细讲解了节点和关系属性的唯一性约束及存在性约束的创建与删除,包括创建索引的语法和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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`

 

学习文档出自:庞国明 老师教学视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值