繼續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中的使用
MERGE與CREATE搭配
檢查節點是否存在,如果不存在則創建它並設置屬性。
MERGE (keanu:Person { name: 'Keanu Reeves' }) ON CREATE SET keanu.created = timestamp() RETURN keanu.name, keanu.created |
本查詢創建了keanu節點,並設置created屬性爲創建的時間戳。
MERGE與MATCH搭配
匹配節點,並在找到的節點上設置屬性。
MERGE (person:Person { name: 'Keanu Reeves2' }) ON MATCH SET person.found = TRUE RETURN person.name, person.found |
本查詢找到所有的Person節點,並設置found屬性爲true,然後返回它們。
MERGE與CREATE和MATCH同時使用
檢查節點是否存在,如果不存在則創建它並設置屬性。
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 |
利用Merge和MATCH設置多屬性
如果需要設置多個屬性,將它們簡單地以逗號分開即可。
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 |
今天學習總結完成。。
學習文檔出自:龐國明 老師教學視頻