cypher語法基礎——最全參考
Neo4j系列導航:
neo4j及簡單實踐
cypher語法基礎
cypher插入語法
cypher插入語法
cypher查詢語法
cypher通用語法
cypher函數語法
neo4j索引及調優
1.簡介
neo4j官方文檔。Cypher是一種聲明式圖數據庫查詢語言,它具有豐富的表現力,能高效地查詢和更新圖數據。具有以下特點:
- 是一種聲明性模式匹配語言
- 遵循SQL語法
- 的語法是非常簡單且人性化、可讀的格式
2.模式
使用模式可以描述你期望看到的數據的形狀,當用模式描述一個形狀的時候,Cypher將按照模式來獲取相應的數據。
| 模式類型 | 語法 | 含義 |
|---|---|---|
| 節點(點) | (n) |
節點使用一對圓括號表示,然后中間含一個名字 |
| 關系(邊) | (a)->(b),(a)<-(b),(a)-(b) |
使用箭頭來表達兩個節點之間的關系,不關心關系的方向,則箭頭的頭部可以省略 |
| 標簽 | (a:User) |
|
| 屬性 | (a {name:'v1',sport:'s1'}) |
使用鍵值對的映射結構來表達,然后用大括號包起來 |
變長模式匹配:
描述指定長度的關系,描述了三個節點兩個關系:
(a)-[*2]->(b)# 等價于(a)-->()-->(b)長度范圍也可以指定,如最短為3,最長為5:
(a)-[*3..5]->(b)至少三個關系:
(a)-[*3..]->(b)最多5個關系:
(a)-[*..5]->(b)任意長度的關系:
(a)-[*]->(b)
圖數據庫與關系型數據庫的類比:
| 圖數據 | 關系型數據庫 |
|---|---|
| 點 | 表 |
| 點標簽 | 表名 |
| 點屬性 | 表字段 |
| 點數據(標簽+屬性鍵值對) | 表的一行數據 |
| 相同標簽的點數據 | 表的所有數據 |
| 關系 | 常用一列專門來描述(如樹結構) |
3.變量
當需要引用模式(pattern)或者查詢的某一部分的時候,可以對其進行命名。針對不同部分的這些命名被稱為變量。
match (n)-[r]->(b) return b # 這里的n和b和r就是變量
4.關鍵字
關鍵字大小寫不敏感,變量名大小寫敏感,語法關鍵字主要分為三類:
4.1.插入關鍵字:(詳細講解)
| 關鍵字 | 含義 |
|---|---|
| create | 創建節點或關系 |
| merge | 匹配不到則創建 |
| set | 更新節點的標簽以及節點和關系的屬性 |
| delete | 刪除土元素(節點、關系、路徑) |
| remove | 刪除圖元素的屬性和標簽 |
| foreach | cypher提供的一種列表遍歷工具,主要用來做增刪改 |
| create unique | 相當于match和create的混合體 (盡可能地匹配,然后創建未匹配到的創建) |
| load csv(import) | 用于導入csv文件 |
4.2.查詢關鍵字:(詳細講解)
| 關鍵字 | 含義 |
|---|---|
| match | 匹配(查詢)已有數據 |
| optional match | 與match類似,只是如果沒有匹配上,則將使用null作為沒有匹配上的模式。類似于SQL中的外連接。 |
| where | 類似SQL中的添加查詢條件 |
| start | START語句僅用于訪問neo4j遺留的索引(節點或者關系的索引) |
| aggregation(count、sum、avg…) | 聚合函數 |
4.3.通用關鍵字:(詳細講解)
| 關鍵字 | 含義 |
|---|---|
| return | 返回結果 |
| order by | 排序,緊跟RETURN或者WITH |
| limit | 限制輸出的行數 |
| skip | 從哪行開始返回結果 |
| with | 向后面的語句傳遞指定結果 |
| unwind | cypher提供的一種列表遍歷工具,結合case等語法可以寫出許多復雜的查詢,尤其是對于路徑查詢的處理 |
| union/union all | 并集(去重/不去重) |
| call | 執行子查詢并返回結果,版本4.x后支持 |
| case | 根據條件對查詢的結果進行處理 |
5.數據類型
Cypher支持的類型系統分為三類:屬性類型,結構類型和復合類型。
5.1.屬性類型
| 名稱 | 類型 |
|---|---|
| 數值 | int,float… |
| 字符 | string |
| 布爾 | Boolean |
| 空間 | Point |
| 時間 | Date,Time,LocalTime,DateTime,LocalDateTime和Duration |
5.2.結構類型
| 名稱 | 類型 |
|---|---|
| 節點(點) | Node,包含Id**, Labels, Map類型 |
| 關系(邊) | Relationship,包含Type, Map, Id類型 |
| 路徑 | Path,節點和關系的序列 |
5.3.復合類型
| 名稱 | 類型 |
|---|---|
| 列表 | List |
| 字典 | Map,組成為(key, value)對,key是字符類型,value可以是屬性類型, 結構類型和符合類型 |
6.運算符
neo4j中運算符與關系型數據庫差不多,不過也有不同和需要注意的點
6.1.比較運算
=, <>, <, >, <=, >=, is null, is not null
- 不同類型不能比較,例如點和邊和路徑不能互相比較
- List比較時,只有所有對應元素都相等列表才相等
- Map比較時,只有Map的鍵相等且其指向的值也相等時才相等
- 路徑比較時,只有路徑上所有的點和邊都相等時才相等
- 和null比較的結果還是null
6.2.字符串比較運算
- start with: 匹配前綴
- ends with: 匹配后綴
- constant: 字符串包含
6.3.字符串運算
- 字符串連接: “+”
- 正則匹配: “=~”
6.4.時間運算
- +, -: Duration與時間實例/Duration
- *, /:Duration與一個數字
6.5.List運算
- List鏈接: +
return [1,2,3,4,5]+[6,7] as myList - List判斷e是否在List中: e in List
with [2, 3, 4, 5] as numberList unwind numberList AS number with number where number in [2, 3, 8] return number - 動態獲取其中元素: []
with ['Anne', 'John', 'Bill', 'Diane', 'Eve'] as names return names[1..3] as result - 列表推導:
|看起來和linux管道符號一樣,作用也類似,前面的輸出作為后面的輸入列表推導是Cypher基于已有列表創建新的列表,可以和where等語句一起使用
return [x in [1,2,3] | x^2]//輸出[1.0, 4.0, 9.0]
return [x in [1,2,3,4,5] where x%2=0 | x^2]//返回[4.0, 16.0]
6.6.Map運算
- 靜態獲取Map的value: 使用點運算符
with {name: 'Anne', age: 25 } as n return n.name - 動態獲取Map的value: 使用[]
with {name: 'Anne', age: 25 } as n return n[$myKey] as result

浙公網安備 33010602011771號