neo4j學習總結--第四課 Cypher(CQL)命令二

繼續neo4j的命令課程學習:

一、MERGE命令

Neo4j使用CQL MERGE命令 -

  • 創建節點,關係和屬性
  • 爲從數據庫檢索數據

MERGE命令是CREATE命令和MATCH命令的組合。

MERGE = CREATE + MATCH

Neo4j CQL MERGE命令在圖中搜索給定模式,如果存在,則返回結果

如果它不存在於圖中,則它創建新的節點/關係並返回結果

1.1、MERGE帶標籤的節點

下面的例子合併給定標籤的節點。

MERGE (robert:Critic)

RETURN robert, labels(robert)

因爲沒有包含Ctritic標籤的節點,一個新節點在數據庫中創建了

1.2、MERGE屬性來自已存在節點的單個節點

當每個綁定節點的屬性’p’來自一個節點集時,如果’p’存在重複,創建的時候只會創建一次。

.//先創建一個節點

MERGE (riky:Person { name: 'riky', bornIn:'newyork'})

RETURN riky.name, riky.bornIn

//先查詢出來節點,根據節點的屬性MERGE 另外一個節點數據

MATCH (person:Person{ bornIn:'newyork'})

MERGE (city:City { name: person.bornIn })

RETURN person.name, person.bornIn, city

1.3、MERGE在CREATE和MATCH中的使用

MERGECREATE搭配

檢查節點是否存在,如果不存在則創建它並設置屬性。

MERGE (keanu:Person { name: 'Keanu Reeves' })

ON CREATE SET keanu.created = timestamp()

RETURN keanu.name, keanu.created

本查詢創建了keanu節點,並設置created屬性爲創建的時間戳。

MERGEMATCH搭配

匹配節點,並在找到的節點上設置屬性。

MERGE (person:Person { name: 'Keanu Reeves2' })

ON MATCH SET person.found = TRUE

RETURN person.name, person.found

本查詢找到所有的Person節點,並設置found屬性爲true,然後返回它們。

MERGECREATEMATCH同時使用

檢查節點是否存在,如果不存在則創建它並設置屬性。

MERGE (keanu:Person { name: 'Keanu Reeves' })

ON CREATE SET keanu.created = timestamp()

ON MATCH SET keanu.lastSeen = timestamp()

RETURN keanu.name, keanu.created, keanu.lastSeen

利用MergeMATCH設置多屬性

如果需要設置多個屬性,將它們簡單地以逗號分開即可。

MERGE (person:Person)

ON MATCH SET person.found = TRUE , person.lastAccessed = timestamp()

RETURN person.name, person.found, person.lastAccessed

MERGE關係

MERGE可用於匹配或者創建關係。

MATCH (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'The Matrix' })

MERGE (charlie)-[r:ACTED_IN]->(wallStreet)

RETURN charlie.name, type(r), wallStreet.title

因爲"Charlie Sheen"已經在"The Matrix"參演了,所以找到已存的關係並返回。注意:使用MERGE去匹配或者創建關係時,必須至少指定一個綁定的節點。

合併多個關係

當MERGE應用於整個模式時,要麼全部匹配上,要麼全部新創建。

MATCH (oliver:Person { name: 'Lilly Wachowski' }),(reiner:Person { name: 'Rob Reiner' })

MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)

RETURN movie

合併無方向關係

MERGE也可以用於合併無方向的關係。當需要創建一個關係的時候,它將選擇一個任意的方向。

查詢

MATCH (charlie:Person { name: 'Charlie Sheen' }),(oliver:Person { name: 'Lilly Wachowski' })

MERGE (charlie)-[r:KNOWS]-(oliver)

RETURN r

注意此處可以沒有關係方向

合併已存在兩節點之間的關係

MERGE可用於連接前面的MATCH和MERGE語句。

查詢

MATCH (person:Person { name: 'riky' })

MERGE (city:City { name: person.bornIn })

MERGE (person)-[r:BORN_IN]->(city)

RETURN person.name, person.bornIn, city

同時合併\創建一個新節點和關係

MERGE能夠同時創建一個新節點和關係。

MATCH (person:Person{name: 'Demi Moore'})

MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.name })

RETURN person.name, person.chauffeurName, chauffeur

用MERGE的唯一性約束

當使用的模式涉及唯一性約束時,Cypher可以通過MERGE來防止獲取相沖突的結果。

下面的例子分別在Person的name和role屬性上創建一個唯一性約束。

CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE;

如果節點未找到,使用唯一性約束創建該節點

MERGE (laurence:Person { name: 'Laurence Fishburne' })

RETURN laurence.name

本查詢創建了'laurence'節點。如果'laurence'已經存在,MERGE 僅僅匹配已經存在的節點。

唯一性約束與部分匹配

當只有部分匹配時,使用唯一性約束合併將失敗。

CREATE CONSTRAINT ON (n:Person) ASSERT n.role IS UNIQUE;

CREATE (alisanda:Person { name: 'alisanda', role: 'Gordon Gekko' })

 

MERGE (michael:Person { name: 'Michael Douglas', role: 'Gordon Gekko' })

RETURN michael

錯誤消息

Node(1578733) already exists with label `Person` and property `role` = 'Gordon Gekko'

二、CREATE UNIQUE

注意:這裏並不是創建唯一性約束,而是創建唯一的一個節點或者屬性關係。如果存在不創建,不存在才創建

CREATE UNIQUE語句相當於MATCH和CREATE的混合體—儘可能地匹配,然後創建未匹配到的。

可能會想到用MERGE來代替CREATE UNIQUE,然而MERGE並不能很強地保證關係的唯一性。

 

CREATE (root { name: 'root' }),(A { name: 'A' }),(B { name: 'B' }),(C{ name: 'C' })

CREATE (root)-[:X]->(A),(root)-[:X]->(B),(root)-[:X]->(C),(A)-[:KNOWS]->(C)

return root,A,B,C

創建唯一節點

創建未匹配到的節點

MATCH (root { name: 'root' })

CREATE UNIQUE (root)-[:LOVES]-(someone)

RETURN someone

root節點沒有任何LOVES關係。因此,創建了一個節點及其與root節點的LOVES關係。注意這裏可以不指定關係方向

用含值的模式創建節點

MATCH (root { name: 'A' })

CREATE UNIQUE (root)-[:X]-(leaf { name: 'D' })

RETURN leaf

沒有與root節點相連的name爲D的節點,所以創建一個新的節點來匹配該模式。

創建未匹配到帶標籤的節點

如果描述的模式需要一個帶標籤的節點,而數據庫中沒有帶有給定標籤的節點,Cypher將創建一個新的。

MATCH (a { name: 'Node A' })

CREATE UNIQUE (a)-[:KNOWS]-(c:blue)

RETURN c

與'A'節點相連的KNOWS關係有一個'C'節點,但'C'節點沒有blue標籤。所以創建了一個帶有blue標籤的節點和從'A'到到它的KNOWS關係。

 

創建唯一關係

創建未匹配到的關係

CREATE UNIQUE用於描述應該被找到的或需要創建的模式。

MATCH (lft { name: 'A' }),(rgt)

WHERE rgt.name IN ['B', 'C']

CREATE UNIQUE (lft)-[r:KNOWS]->(rgt)

RETURN lft, rgt

匹配一個左節點和兩個右節點之間的關係。其中一個關係已存在,因此能匹配到。然後創建了不存在的關係。

用含值的模式創建關係

MATCH (root { name: 'root' })

CREATE UNIQUE (root)-[r:X { since: 'forever' }]-()

RETURN r

描述複雜模式

就像MATCH和CREATE語句一樣,CREATE UNIQUE描述的模式也可以用逗號分隔。

MATCH (root { name: 'root' })

CREATE UNIQUE (root)-[:FOO]->(x),(root)-[:BAR]->(x)

RETURN x

三、SET命令(主要添加屬性或者標籤)

有時,根據我們的客戶端要求,我們需要向現有節點或關係添加新屬性。

要做到這一點,Neo4j CQL提供了一個SET子句。

Neo4j CQL已提供SET子句來執行以下操作。

  • 向現有節點或關係添加新屬性
  • 添加或更新屬性值
  • 添加標籤

SET子句語法

SET  <node-label-name>.<property1-name>,...<node-laben-name>.<propertyn-name>

語法說明:

S.No.

語法元素

描述

1

<節點標籤名稱>

這是一個節點的標籤名稱。

2

<屬性名稱>

它是一個節點的屬性名。

3.1、設置屬性

可以使用SET設置節點或者關係的屬性。

MATCH (n { name: ' Taylor Hackford' })

SET n.surname = 'Taylor'

RETURN n

返回最新修改過的節點。

3.2、刪除屬性

通常使用REMOVE來刪除一個屬性,但有時候也可以隨手用SET。將屬性設置爲null將刪除該屬性。如下:

MATCH (n { name: 'Taylor Hackford' })

SET n. surname = NULL

RETURN n

3.3、從map中添加屬性

當用map來設置屬性時,可以使用+=形式的SET來只添加屬性,而不刪除圖元素中已存在的屬性。

merge (peter:Person { name: 'Peter' }) return peter

MATCH (peter { name: 'Peter' })

SET peter += { hungry: TRUE , position: 'Entrepreneur' }

3.4、置節點的標籤

用SET可給節點設置標籤。

MATCH (n { name: 'Stefan' })

SET n :German

RETURN n

給一個節點設置多個標籤

使用SET給一個節點設置多個標籤時,不同的標籤之間用冒號分隔。

MATCH (n { name: 'Emil' })

SET n :Swedish:Bossman

RETURN n

四、DELETE刪除節點和關係

Neo4j使用CQL DELETE子句 必須和match結合使用

  • 刪除節點。
  • 刪除節點及相關節點和關係。

4.1、刪除單個節點

MATCH (n:Useless)

DELETE n

4.2、刪除關係

match (root { name: 'root' })-[r]-(A { name: 'A' })

DELETE r

4.3、刪除路徑

刪除一個節點及其所有的關係

當需要刪除一個節點及與該節點的所有關係時,可用DETACH DELETE。

MATCH (n { name: 'root' })

DETACH DELETE n

4.4、刪除所有節點和關係

這個查詢對於少量數據可以,不適用於刪除巨量數據。

MATCH (n)

DETACH DELETE n

五、REMOVE刪除節點或關係的現有屬性

我們使用Neo4j CQL REMOVE子句來刪除節點或關係的現有屬性。

Neo4j CQL REMOVE命令用於

  • 刪除節點或關係的標籤
  • 刪除節點或關係的屬性

Neo4j CQL DELETE和REMOVE命令之間的主要區別 -

  • DELETE操作用於刪除節點和關聯關係。
  • REMOVE操作用於刪除標籤和屬性。

Neo4j CQL DELETE和REMOVE命令之間的相似性 -

  • 這兩個命令不應單獨使用。
  • 兩個命令都應該與MATCH命令一起使用。

刪除一個屬性

Neo4j不允許屬性存儲空值null。如果屬性的值不存在,那麼節點或者關係中的屬性將被刪除。這也可以通過REMOVE來刪除

MATCH (p { name: 'Michael Douglas' })

REMOVE p. bornIn

RETURN p

刪除節點的一個標籤

可用REMOVE刪除一個標籤。

MATCH (n { name: 'Peter' })

REMOVE n:German

RETURN n

刪除節點的多個標籤

MATCH (n { name: 'Peter' })

REMOVE n:German:Swedish

RETURN n

六 、ORDER BY排序

Neo4j CQL ORDER BY子句

Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,對MATCH查詢返回的結果進行排序。

我們可以按升序或降序對行進行排序。

默認情況下,它按升序對行進行排序。 如果我們要按降序對它們進行排序,我們需要使用DESC子句。

根據屬性對節點進行排序

ORDER BY用於對輸出進行排序。

 

MATCH (n)

RETURN n.name

ORDER BY n.name

返回了根據節點name屬性進行排序的節點序列。

根據多個屬性對節點進行排序

ORDER BY語句中支持根據多個屬性對節點進行排序。Cypher將先根據第一個變量進行排序,對於相等的值,然後再檢查 ORDER BY中的下一個屬性值,依次類推。

MATCH (n)

RETURN n.born, n.name

ORDER BY n.born, n.name

節點降序排列

在排序的變量後面添加DESC[ENDING],Cypher將以逆序(即降序)對輸出進行排序。

MATCH (n)

RETURN n

ORDER BY n.name DESC

空值的排序

當結果集中包含null值時,對於升序排列,null總是在結果集的末尾。而對於降序排序,null值總是排在最前面

MATCH (n)

RETURN n.title

ORDER BY n.title

七、LIMIT限制輸出的行數

LIMIT限制輸出的行數。和mysql的一樣

返回從開始的地點輸出行數

從最開始返回結果的一個子集,語法如下:

MATCH (n)

RETURN n

ORDER BY n.name

LIMIT 3

八、SKIP (相當於mysql偏移量

SKIP定義了從哪行開始返回結果。

跳過前三

從第四個開始返回結果的一個子集。如下:

MATCH (n)

RETURN n

ORDER BY n.name

SKIP 3

8.1 分頁實現 使用skip 和limit

返回中間兩個

從中間某個位置開始返回結果的字節。可以實現分頁

下面表示從第11行開始返回5行

MATCH (n)

RETURN n

ORDER BY n.name

SKIP 10

LIMIT 5

 

跳過表達式的值加1

Skip接受任意結果爲正整數的值,只要它不引用其他外部變量。

MATCH (n)

RETURN n

ORDER BY n.name

SKIP toInt(3*rand())+ 1

今天學習總結完成。。

 

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

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