官术网_书友最值得收藏!

  • 精通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參數,需要顯式地使用希望用到的屬性。如下例所示。

參數:

查詢:

結果:

主站蜘蛛池模板: 宜春市| 新泰市| 安徽省| 夏邑县| 平遥县| 图木舒克市| 泾川县| 菏泽市| 合山市| 邮箱| 建宁县| 临桂县| 荣昌县| 莫力| 芜湖市| 响水县| 永嘉县| 遂昌县| 西青区| 榆林市| 永仁县| 渭南市| 自治县| 乐昌市| 铅山县| 敖汉旗| 天全县| 含山县| 杂多县| 固始县| 临沧市| 光泽县| 册亨县| 大庆市| 舞钢市| 石柱| 阳新县| 西贡区| 赞皇县| 崇仁县| 琼海市|