- 精通Neo4j
- 龐國明等
- 1967字
- 2023-07-17 19:01:11
3.3.8 MERGE語句
MERGE語句可以確保圖數據庫中存在某個特定的模式。如果該模式不存在,則創建它。
3.3.8.1 簡介
MERGE或者匹配已存在的節點并綁定到它,或者創建新的節點然后綁定到它。它有點像MATCH和CREATE的組合。通過這種方式可以確保你指定的某個數據存在數據庫中。例如,可以指定圖中必須包含一個特定name的user節點。如果不存在特定name的user節點,那么就會創建一個。
當在整個模式上使用MERGE時,要么是整個模式匹配到,要么是整個模式被創建。MERGE不能部分地應用于模式,如果希望部分匹配,可以將模式拆分為多個MERGE語句。
MERGE圖例如圖3-11所示。

圖3-11 MERGE圖例
3.3.8.2 MERGE節點
1.合并帶標簽的節點
下面的例子合并給定標簽的節點。
查詢:

因為沒有包含Critic標簽的節點,所以在數據庫創建了新節點。
結果:

2.合并帶多個屬性的單個節點
合并有多個屬性但并不是所有屬性都匹配到已存在節點的單個節點。
查詢:

在數據庫創建了名為Charlie Sheen的新節點,因為沒有匹配到所有屬性都吻合的節點。
結果:

3.合并同時指定標簽和屬性的節點
合并單個節點,要求它的標簽和屬性都能匹配到已存在的節點。
查詢:

匹配到Michael Douglas節點,同時返回它的name和bornIn屬性。
結果:

4.合并屬性來自已存在節點的單個節點
當每個綁定節點的屬性p來自一個節點集時,如果p存在重復,創建的時候只會創建一次。
查詢:

本例中創建了三個City節點,它們的name屬性分別為New York、Ohio和New Jersey。
注意:盡管MATCH匹配的結果總有三個節點的bornIn屬性值都為New York,但只創建了一個New York節點。因為第一次匹配的時候,New York未匹配到,因此創建了一個。然后,新創建的New York被第二個和第三個匹配到了。
結果:

3.3.8.3 MERGE在CREATE和MATCH中的使用
1.MERGE與CREATE搭配
檢查節點是否存在,如果不存在,則創建它并設置屬性。
查詢:

本查詢創建了keanu節點,并將created屬性設置為創建時的時間戳。
結果:

2.MERGE與MATCH搭配
匹配節點,并在找到的節點上設置屬性。
查詢:

本查詢找到所有的Person節點,并設置found屬性為true,然后返回它們。
結果:

3.MERGE與CREATE和MATCH同時使用
檢查節點是否存在,如果不存在,則創建它并設置屬性。
查詢:

本查詢創建keanu節點并設置created屬性值為創建時的時間戳。如果keanu已經存在,將為它設置一個新屬性lastSeen。也就是說,當keanu不存在時,創建后的keanu節點將沒有lastSeen屬性。
結果:

4.利用MERGE和MATCH設置多屬性
如果需要設置多個屬性,將它們簡單地以逗號分開即可。
查詢:

結果:

3.3.8.4 MERGE關系
MERGE可用于匹配或者創建關系。
查詢:

因為Charlie Sheen參演了Wall Street,所以找到已存的關系并返回。
注意:使用MERGE去匹配或者創建關系時,必須至少指定一個綁定的節點。
結果:

1.合并多個關系
當MERGE應用于整個模式時,要么全部匹配上,要么全部新創建。
查詢:

在本例中,Oliver Stone和Rob Reiner未一起工作過。當試圖在其之間合并一個電影連接時,Neo4j不會使用任何已存在的電影,而是創建一個新的movie節點。
結果:

2.合并無方向關系
MERGE也可以用于合并無方向的關系。當創建關系時,它將選擇一個任意的方向。
查詢:

因為Charlie Sheen和Oliver Stone相互不認識,所以MERGE查詢將在他們之間創建一個KNOWS關系。創建的關系的方向是任意的。
結果:

3.合并已存在兩節點之間的關系
MERGE可用于連接前面的MATCH和MERGE語句,在兩個綁定的節點m和n上創建一個關系。m節點是MATCH語句返回的,而n節點是前面的MERGE語句創建或者匹配到的。
查詢:

這個例子來自3.3.8節。第二個MERGE在每個人和他的bornIn屬性對應的城市之間創建了一個BORN_IN關系。Charlie Sheen、Rob Reiner和Oliver Stone與同一個城市節點(New York)都有一個BORIN_IN關系。
結果:

4.合并一個已存在節點和一個合并的節點之間的關系
MERGE能夠同時創建一個新節點n和一個已存在節點m與n之間的關系。
查詢:

在本例中,MERGE未匹配到,這里沒有標簽為Chauffeur的節點和HAS_CHAUFFUR關系。MERGE創建了5個帶有Chauffeur標簽的節點,每個節點的包含一個name屬性,屬性的值來自每個匹配到的Person節點的chauffeurName屬性的值。MERGE同時還在每個Person節點與新創建的Chauffeur節點之間創建了一個HAS_CHAUFFEUR關系。
結果:

3.3.8.5 用MERGE的唯一性約束
當使用的模式涉及唯一性約束時,Cypher可以通過MERGE來防止獲取相沖突的結果。在這種情況下,至多有一個節點匹配該模式。例如,給定兩個唯一性約束:Person(id)和:Person(ssn),如果存在兩個不同的節點分別是id為12和ssn為437或者只有一個節點有其中一個屬性,那么MERGE (n:Person {id: 12, ssn: 437})這樣的查詢將失敗。
下面的例子分別在Person的name和role屬性上創建一個唯一性約束。

如果節點未找到,則使用唯一性約束創建該節點。
查詢:

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

使用唯一性約束匹配已存在的節點。
查詢:

oliver節點已經存在了,因此MERGE只是匹配它而不創建。
結果:

1.唯一性約束與部分匹配
當只有部分匹配時,使用唯一性約束合并將失敗。
查詢:

這里有一個唯一匹配到的name為Michael Douglas的節點,但沒有具有唯一的role屬性為Gordon Gekko的節點,因此MERGE匹配失敗。
錯誤消息:

2.唯一性約束與匹配沖突
當有匹配的沖突結果時,使用MERGE唯一性約束將失敗。
查詢:

錯誤消息:

3.3.8.6 使用map參數
MERGE不支持像CREATE節點時那樣使用map參數。要在MERGE中使用map參數,需要顯式地使用希望用到的屬性。如下例所示。
參數:

查詢:

結果:

- GitHub Essentials
- ETL數據整合與處理(Kettle)
- Java Data Science Cookbook
- 云計算與大數據應用
- 文本挖掘:基于R語言的整潔工具
- 數據化網站運營深度剖析
- Remote Usability Testing
- Microsoft Power BI數據可視化與數據分析
- Starling Game Development Essentials
- 深入淺出 Hyperscan:高性能正則表達式算法原理與設計
- Unreal Engine Virtual Reality Quick Start Guide
- Visual FoxPro數據庫技術基礎
- Spring Boot 2.0 Cookbook(Second Edition)
- Hands-On Deep Learning for Games
- Artificial Intelligence for Big Data