Neo4j 第六篇:Cypher語法

悅光陰發表於2019-05-23

Cypher是圖形資料庫查詢語言事實上的標準。

一,Cypher型別系統

Cypher支援的型別系統分為三類:屬性型別,複合型別和結構型別。

1,屬性型別

屬性型別:Integer、Float、String和Boolean

Boolean型別:truefalseTRUEFALSE

String型別:'Hello'"World"

2,複合型別

複合型別:List和Map,List是有序的值的集合,Map是無序的Key/Value對的集合,通常用於儲存節點和關係的屬性。

List型別:['a', 'b'][1, 2, 3]['a', 2, n.property, $param][ ]

Map型別:n是節點,prop是節點的屬性鍵,引用屬性的值的格式:n.prop,

3,結構型別

結構型別:Node型別、關係型別、Path型別:

  • 其中Node型別表示一個節點,由Id、Label和Map構成;
  • 關係型別表示一個關係,由Id、Type、Map和 關係兩端的兩個節點的Id構成;
  • Path型別表示路徑,是節點和關係的序列。Path模式:(a)-->()<--(b)

3,List型別

由標量型別構成的List,例如,['a', 'b'][1, 2, 3]

由函式range函式生成的List物件,例如,range(0,10),從start到end的有序數字,Range函式包含兩端。

列表(List comprehension):[x IN range(0,10) WHERE x % 2 = 0 | x^3]

4,Map型別

列表的常量表示:{ key: 'Value', listKey: [{ inner: 'Map1' }, { inner: 'Map2' }]}

Map投影,用於從節點、關係和其他Map物件中投影值,Map投影的格式是:

map_variable {map_element, [, …​n]}

引數註釋:

  • map_variable:用於引用Map物件
  • map_element:有四種格式是
    • 屬性選擇器:格式是 .Key,用於引用Map物件中的屬性
    • 嵌入屬性(Literal entry),是一個Key/Value對,例如,key: <expression>,表示嵌入到Map變數中的元素
    • 變數選擇器:把一個變數的名稱作為Key,變數的值作為Key的值,構建一個Key/Value對,作為Map變數中的元素
    • 屬性全選符號: .*

Map投影的示例:

MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
WITH actor, count(movie) AS nrOfMovies
RETURN actor { .name, nrOfMovies }

二,命名規則和作用域

對變數進行命名,變數的命名要遵守一定的規則,並且變數具有特定的作用域。

1,命名規則

名稱以英語字元開頭,能夠包含數字,但是數字不能作為首字元,除了下劃線和$,不能包含其他符號,

注意,下劃線應用於名稱的中間或結尾,例如,my_variable,$符號只能用於名稱的開頭,標示一個引數,例如$myParam。

名稱是大小寫敏感的,:PERSON 和 :Person 是不同的。

2,作用域

節點的Lable、關係型別和屬性鍵是不同的作用域(Scope),在相同的Scope下,名稱是不允許重複的;但是,在不同的Scope中,名稱是允許重複的,並且表示不同的含義。

CREATE (a:a {a: 'a'})-[r:a]→(b:a {a: 'a'})

 三,表示式

CASE
WHEN predicate THEN result
  [WHEN ...]
  [ELSE default]
END

四,引數

參與的語法是$Param,引數的名稱是Param,在傳遞引數時,必須保證傳遞的引數和Query中的引數名稱相同。

有Cypher的Query是,引數是$ids,

MATCH (n)
WHERE id(n) IN $ids
RETURN n.name

傳遞給Query的引數是:

{
  "ids" : [ 0, 1, 2 ]
}

五,操作符

1,通用操作符

distinct 用於移除重複值, n.property 用於訪問屬性,[]是變數的列表

CREATE (a:Person { name: 'Anne', eyeColor: 'blue' }),(b:Person { name: 'Bill', eyeColor: 'brown' }),(c:Person { name: 'Carol', eyeColor: 'blue' })
WITH [a, b, c] AS ps
UNWIND ps AS p
RETURN DISTINCT p.eyeColor

2,數學操作符

  • 加減乘除:+,-,*,/
  • 取模:%
  • 取冪:^

3,比較運算子

  • 等於:=
  • 不等於:<>
  • 小於、大於、小於等於、大於等於:<、>、<=、>=
  • IS NULL和 IS NOT NULL

4,邏輯運算子

與(AND),或(OR),異或(XOR),非(NOT)

WITH [2, 4, 7, 9, 12] AS numberlist
UNWIND numberlist AS number
WITH number
WHERE number = 4 OR (number > 6 AND number < 10)
RETURN number

5,字串

字串拼接:+

匹配正則:=~

WITH ['mouse', 'chair', 'door', 'house'] AS wordlist
UNWIND wordlist AS word
WITH word
WHERE word =~ '.*ous.*'
RETURN word

對於字串,使用 STARTS WITH、ENDS WITH和CONTAINS 過濾字串:

WITH ['John', 'Mark', 'Jonathan', 'Bill'] AS somenames
UNWIND somenames AS names
WITH names AS candidate
WHERE candidate STARTS WITH 'Jo'
RETURN candidate

6,列表操作

  • +,列表追加
  • IN:檢查成員
  • []:索引,特殊地,[start .. end],從start開始,遞增1,但是不包括end
RETURN [1,2,3,4,5]+[6,7] AS myList

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

7,訪問屬性

使用. 號訪問屬性

MATCH (n) WHERE 21 < n.age AND n.age <= 30 RETURN n

 

 

參考文件:

Cypher Syntax