目錄
一、介紹
二、語法
1、節點
2、關系
3、屬性
4、模式
一、介紹
????????Cypher 是 Neo4j 的聲明式查詢語言,兼容 GQL 標準。通過 openCypher 項目,Cypher 以開源方式提供。它類似于 SQL,但專為圖數據優化。
????????Cypher 直觀且接近自然語言,它采用類似 ASCII 藝術風格的語法,以可視化的方式來匹配模式和關系:
(:nodes)-[:ARE_CONNECTED_TO]->(:otherNodes)
圓括號用于表示 (:Nodes),而 -[:ARROWS]→ 用于表示 (:Nodes) 之間的關系。通過這種查詢語法,你可以對圖進行創建、讀取、更新或刪除(CRUD)操作。
二、語法
上圖表示:“Sally喜歡圖表。薩莉和約翰是朋友。薩莉為Neo4j工作。”
用Cypher寫同樣的信息:
(:Sally)-[:LIKES]->(:Graphs)
(:Sally)-[:IS_FRIENDS_WITH]->(:John)
(:Sally)-[:WORKS_FOR]->(:Neo4j)
1、節點
????????在屬性圖模型中,主要的組成部分是節點和關系。節點通常用來表示數據模型中的名詞或對象。在前面的例子中,Sally、John、Graphs 和 Neo4j 都是節點。在 Cypher 中,你可以用括號將節點括起來來表示它,例如 (node)。這些括號對應于可視化中構成節點的圓圈。
1)節點標簽
????????節點可以通過標簽進行分組,用戶能夠指定要查找或創建的特定類型的實體。標簽還幫助 Cypher 區分不同的實體,并優化查詢的執行效率。在這個例子中,Sally 和 John 都可以歸為 Person標簽,Graphs 可以加上 Technology標簽,Neo4j 則可以標記為 Company標簽。
????????在關系數據庫上下文中,這相當于告訴SQL在哪個表中查找特定的行。就像讓SQL從person表中查詢一個人的信息一樣,用戶也可以讓Cypher只檢查該信息的person標簽。(如果沒有為Cypher指定一個標簽來過濾不匹配的節點類別,查詢將檢查數據庫中的所有節點。在非常大的圖數據中,這可能會影響性能。)
2)節點變量
????????這里有必要將匹配到的數據實體綁定到變量,以便在后續的子句中引用它們。變量可以是單個字母或單詞,并且應當用小寫字母書寫。例如,如果你想把所有帶有 Person 標簽的節點綁定到變量 p,可以寫作 (p:Person)。
MATCH (p:Person)
RETURN p
2、關系
????????圖數據庫的一個優點是,你可以以關系的形式存儲元素(節點)之間是如何關聯的信息。在 Cypher 中,關系用方括號和一個箭頭來表示,連接兩個節點(例如 (Node1)-[]→(Node2))。在例子中,包含 :LIKES、:IS_FRIENDS_WITH 和 :WORKS_FOR 的線條,表示節點之間的關系。
????????關系類型前面一定要加上冒號。如果忘記加冒號,寫成 (:Person)-[LIKES]->(:Technology),那么 [LIKES] 就表示一個關系變量,而不是關系類型。
舉例:
-
(:Person)-[:LIKES]->(:Technology)
這里?:LIKES
?表示一種關系類型,查詢的是“喜歡”這種關系。 -
(:Person)-[LIKES]->(:Technology)
這里?LIKES
?沒有冒號,Cypher 會把它當作一個關系變量(可以起任意名字,不一定叫 LIKES),而不是“喜歡”這種類型的關系。因此,這種寫法只能匹配任何類型的關系,然后把這條關系賦值給變量 LIKES。
1)關系方向
????????關系總是具有方向性的,這通過箭頭來表示。
(1)從左到右:
(p:Person)-[:LIKES]->(t:Technology)
(2)從右到左:
(p:Person)<-[:LIKES]-(t:Technology)
(3)無方向的:
MATCH (p:Person)-[:LIKES]-(t:Technology)
2)無方向關系
????????無方向的關系并不意味著關系本身沒有方向,而是指在查詢時可以從任意方向遍歷。用戶不能創建沒有方向的關系,但在查詢時可以以無方向的方式進行。
????????在查詢中使用無方向關系特別適用于不知道關系方向的情況,因為如果用錯方向寫查詢,Cypher 是不會返回任何結果的。因此,Cypher 會檢索所有通過指定關系類型連接的節點,無論其方向如何。
注:因為查詢中的無向關系被遍歷兩次(每個方向一次),相同的模式將返回兩次。這可能會影響查詢的性能。
3)關系類型
????????關系類型對關系進行分類并賦予其含義,類似于標簽對節點的分組。按最佳實踐,關系類型通常使用動詞或其變體。關系類型描述了節點之間是如何關聯的。這樣,Cypher 查詢語言幾乎就像自然語言一樣,節點是主語和賓語(名詞),而關系(動詞)則是連接它們的動作詞。
在前面的例子中,關系類型有:
[:LIKES] —— 表示 Sally(一個節點)喜歡 graphs(另一個節點)。
[:IS_FRIENDS_WITH] —— 表示 Sally 和 John 是朋友。
[:WORKS_FOR] —— 表示 Sally 為 Neo4j 工作。
4)關系變量
????????變量在關系中可以像在節點中一樣使用。一旦你為關系指定了變量,就可以在后續的查詢中引用這個關系。
比如這個例子:MATCH (p:Person)-[r:LIKES]->(t:Technology) RETURN p, r, t
這個查詢為節點標簽(p 表示 Person,t 表示 Technology)以及關系類型(r 表示 :LIKES)都指定了變量。在 return 子句中,你就可以使用這些變量(即 p、r 和 t)來返回綁定的實體。
3、屬性
????????屬性值既可以添加到節點,也可以添加到關系上,并且可以是多種不同的數據類型。屬性用花括號{}括起來,鍵后面跟一個冒號,值用單引號或雙引號括起來:
CREATE (p:Person {name:'Sally'})-[r:IS_FRIENDS_WITH]->(p:Person {name:'John'})
RETURN p, r
4、模式
????????圖模式匹配是 Cypher 的核心。它是一種通過聲明式模式來在圖中導航、描述和提取數據的機制。(p:Person {name: "Sally"})-[r:LIKES]->(g:Technology {type: "Graphs"}) 這段 Cypher 代碼表示的是一個模式,但它并不是一個完整的查詢。它僅僅表達了這樣一個事實:有一個 name 屬性為 Sally 的 Person 節點,通過 LIKES 關系,連接到了一個 type 屬性為 Graphs 的 Technology 節點。要想基于這個模式執行實際操作,比如將它添加到圖中或從圖中查詢出來,你需要在數據庫中執行查詢。
可以用 CREATE 子句將這條信息寫入數據庫:
CREATE (p:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})
當數據已經寫入數據庫后,可以用如下模式將其查詢出來:
MATCH (p:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"}) RETURN p, r, t