neo4j學習總結--第七課 Cypher 索引與約束

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

 

學習文檔出自:龐國明 老師教學視頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章