
- Neo4j CQL
- Neo4j CQL - 簡介
- Neo4j CQL - 建立節點
- Neo4j CQL - 建立關係
- Neo4j CQL 寫入子句
- Neo4j - MERGE 命令
- Neo4j - SET 子句
- Neo4j - DELETE 子句
- Neo4j - REMOVE 子句
- Neo4j - FOREACH 子句
- Neo4j CQL 通用子句
- Neo4j - RETURN 子句
- Neo4j - ORDER BY 子句
- Neo4j - LIMIT 子句
- Neo4j - SKIP 子句
- Neo4j - WITH 子句
- Neo4j - UNWIND 子句
- Neo4j CQL 函式
- Neo4j - 字串函式
- Neo4j - 聚合函式
- Neo4j CQL 管理
- Neo4j - 備份與恢復
- Neo4j - 索引
- Neo4j - 建立唯一約束
- Neo4j - 刪除唯一約束
- Neo4j 有用資源
- Neo4j - 快速指南
- Neo4j - 有用資源
- Neo4j - 討論
Neo4j - MERGE 命令
MERGE 命令是 CREATE 命令和 MATCH 命令的組合。
Neo4j CQL MERGE 命令在圖中搜索給定的模式。如果存在,則返回結果。
如果圖中不存在,則建立一個新的節點/關係並返回結果。
在本節中,您將學習如何:
- 合併具有標籤的節點
- 合併具有屬性的節點
- ONCREATE 和 ONMATCH
- 合併關係
語法
以下是 MERGE 命令的語法。
MERGE (node: label {properties . . . . . . . })
在繼續本節中的示例之前,請在資料庫中建立兩個標籤分別為 Dhawan 和 Ind 的節點。建立一個從 Dhawan 到 Ind 的型別為“BATSMAN_OF”的關係,如下所示。
CREATE (Dhawan:player{name: "Shikar Dhawan", YOB: 1985, POB: "Delhi"}) CREATE (Ind:Country {name: "India"}) CREATE (Dhawan)-[r:BATSMAN_OF]->(Ind)
合併具有標籤的節點
您可以使用 MERGE 子句根據標籤合併資料庫中的節點。如果您嘗試根據標籤合併節點,則 Neo4j 會驗證是否存在任何具有給定標籤的節點。如果沒有,則會建立當前節點。
語法
以下是根據標籤合併節點的語法。
MERGE (node:label) RETURN node
示例 1
以下是一個示例 Cypher 查詢,它將節點合併到 Neo4j(基於標籤)。當您執行此查詢時,Neo4j 會驗證是否存在任何具有標籤player的節點。如果沒有,它將建立一個名為“Jadeja”的節點並返回它。
如果存在任何具有給定標籤的節點,Neo4j 將返回所有這些節點。
MERGE (Jadeja:player) RETURN Jadeja
要執行上述查詢,請執行以下步驟:
步驟 1 - 開啟 Neo4j 桌面應用程式並啟動 Neo4j 伺服器。使用 URL https://:7474/ 開啟 Neo4j 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

步驟 2 - 將所需的查詢複製並貼上到美元提示符中,然後按播放按鈕(執行查詢),如下面的螢幕截圖中突出顯示的那樣。

結果
執行後,您將獲得以下結果。由於您已經在資料庫中建立了一個名為“Dhawan”且標籤為“player”的節點,因此 Neo4j 會返回它,如下面的螢幕截圖所示。

示例 2
現在,嘗試合併一個名為“CT2013”且標籤名為 Tournament 的節點。由於沒有具有此標籤的節點,Neo4j 將建立一個具有給定名稱的節點並返回它。
MERGE (CT2013:Tournament{name: "ICC Champions Trophy 2013"}) RETURN CT2013, labels(CT2013)
要執行上述查詢,請執行以下步驟:
步驟 1 - 開啟 Neo4j 桌面應用程式並啟動 Neo4j 伺服器。使用 URL https://:7474/ 開啟 Neo4j 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

步驟 2 - 將所需的查詢複製並貼上到美元提示符中,然後按播放按鈕(執行查詢),如下面的螢幕截圖中突出顯示的那樣。

結果
執行後,您將獲得以下結果。如上所述,由於沒有具有給定標籤(Tournament)的節點。Neo4j 建立並返回指定的節點,如下面的螢幕截圖所示。

合併具有屬性的節點
您還可以合併具有屬性集的節點。如果您這樣做,Neo4j 將搜尋與指定節點(包括屬性)完全匹配的節點。如果找不到任何匹配的節點,它將建立一個新的節點。
語法
以下是使用屬性合併節點的語法。
MERGE (node:label {key1:value, key2:value, key3:value . . . . . . . . })
示例
以下是一個使用屬性合併節點的示例 Cypher 查詢。此查詢嘗試使用屬性和標籤合併名為“jadeja”的節點。由於沒有具有完全相同標籤和屬性的節點,因此 Neo4j 將建立一個新的節點。
MERGE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"}) RETURN Jadeja
要執行上述查詢,請執行以下步驟:
步驟 1 - 開啟 Neo4j 桌面應用程式並啟動 Neo4j 伺服器。使用 URL https://:7474/ 開啟 Neo4j 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

步驟 2 - 將所需的查詢複製並貼上到美元提示符中,然後按播放按鈕(執行查詢),如下面的螢幕截圖中突出顯示的那樣。

結果
執行後,您將獲得以下結果。如上所述,由於沒有具有指定標籤和屬性的節點,因此它會建立一個新的節點,如下面的螢幕截圖所示。

ONCREATE 和 ONMATCH
每當我們執行合併查詢時,節點要麼匹配要麼建立。使用 on create 和 on match,您可以設定屬性來指示節點是建立的還是匹配的。
語法
以下是ONCREATE 和ONMATCH 子句的語法。
MERGE (node:label {properties . . . . . . . . . . .}) ON CREATE SET property.isCreated ="true" ON MATCH SET property.isFound ="true"
示例
以下是一個示例 Cypher 查詢,它演示了在 Neo4j 中使用ONCREATE 和ONMATCH 子句。如果指定的節點已存在於資料庫中,則該節點將被匹配,並且將在該節點中建立一個鍵值對為 isFound = "true" 的屬性。
如果指定的節點不存在於資料庫中,則將建立該節點,並且在其中將建立一個鍵值對為 isCreated ="true" 的屬性。
MERGE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"}) ON CREATE SET Jadeja.isCreated = "true" ON MATCH SET Jadeja.isFound = "true" RETURN Jadeja
要執行上述查詢,請執行以下步驟:
步驟 1 - 開啟 Neo4j 桌面應用程式並啟動 Neo4j 伺服器。使用 URL https://:7474/ 開啟 Neo4j 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

步驟 2 - 將所需的查詢複製並貼上到美元提示符中,然後按播放按鈕(執行查詢),如下面的螢幕截圖中突出顯示的那樣。

結果
執行後,您將獲得以下結果。如上所述,由於沒有具有指定詳細資訊的節點,Neo4j 建立了該節點以及屬性isFound,如下面的螢幕截圖所示。

合併關係
就像節點一樣,您也可以使用 MERGE 子句合併關係。
示例
以下是一個示例 Cypher 查詢,它使用 Neo4j 中的 MATCH 子句合併關係。此查詢嘗試在節點“ind”(標籤:Country & name:India)和 ICC13(標籤:Tournament & name:ICC Champions Trophy 2013)之間合併一個名為WINNERS_OF的關係。
由於此關係不存在,Neo4j 將建立一個新的關係。
MATCH (a:Country), (b:Tournament) WHERE a.name = "India" AND b.name = "ICC Champions Trophy 2013" MERGE (a)-[r:WINNERS_OF]->(b) RETURN a, b
要執行上述查詢,請執行以下步驟:
步驟 1 - 開啟 Neo4j 桌面應用程式並啟動 Neo4j 伺服器。使用 URL https://:7474/ 開啟 Neo4j 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

步驟 2 - 將所需的查詢複製並貼上到美元提示符中,然後按播放按鈕(執行查詢),如下面的螢幕截圖中突出顯示的那樣。

結果
執行後,您將獲得以下結果。由於指定的關聯不存在於資料庫中,Neo4j 將建立一個新的關聯,如下面的螢幕截圖所示。

同樣,您也可以合併多個關係和無向關係。