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 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

Browser App

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

Merge

結果

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

Dhawan Player

示例 2

現在,嘗試合併一個名為“CT2013”且標籤名為 Tournament 的節點。由於沒有具有此標籤的節點,Neo4j 將建立一個具有給定名稱的節點並返回它。

MERGE (CT2013:Tournament{name: "ICC Champions Trophy 2013"}) 
RETURN CT2013, labels(CT2013)

要執行上述查詢,請執行以下步驟:

步驟 1 - 開啟 Neo4j 桌面應用程式並啟動 Neo4j 伺服器。使用 URL https://:7474/ 開啟 Neo4j 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

Browser App

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

Merging Node

結果

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

Tornament

合併具有屬性的節點

您還可以合併具有屬性集的節點。如果您這樣做,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 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

Browser App

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

Merging Properties

結果

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

Property Result

ONCREATE 和 ONMATCH

每當我們執行合併查詢時,節點要麼匹配要麼建立。使用 on create 和 on match,您可以設定屬性來指示節點是建立的還是匹配的。

語法

以下是ONCREATEONMATCH 子句的語法。

MERGE (node:label {properties . . . . . . . . . . .}) 
ON CREATE SET property.isCreated ="true" 
ON MATCH SET property.isFound ="true"

示例

以下是一個示例 Cypher 查詢,它演示了在 Neo4j 中使用ONCREATEONMATCH 子句。如果指定的節點已存在於資料庫中,則該節點將被匹配,並且將在該節點中建立一個鍵值對為 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 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

Browser App

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

Match Set

結果

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

Oncreate Result

合併關係

就像節點一樣,您也可以使用 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 的內建瀏覽器應用程式,如下面的螢幕截圖所示。

Browser App

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

Winners List

結果

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

Relationship Merge

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

廣告