一、類型
Cypher處理的所有值都有一個特定的類型,它支持如下類型:
- 數值型
- 字符串
- 布爾型
- 節點
- 關係
- 路徑
- 映射(Map)
- 列表(List)
二、表達式
Cypher中的表達式如下:
- 十進制(整型和雙精度型)的字面值:13, -4000, 3.14, 6.022E23
- 十六進制整型字面值(以0x開頭):0x13zf, 0xFC3A9, -0x66eff
- 八進制整型字面值(以0開頭):01372, 02127, -05671
- 字符串字面值:'Hello', "World"
- 布爾字面值:true, false, TRUE, FALSE
- 變量:n, x, rel, myFancyVariable, `A name with weird stuff in it[]!`
- 屬性:n.prop, x.prop, rel.thisProperty, myFancyVariable. `(weird property name)`
- 動態屬性:n["prop"], rel[n.city + n.zip], map[coll[0]]
- 參數:$param, $0
- 表達式列表:['a', 'b'], [1, 2, 3], ['a', 2, n.property, $param], [ ]
- 函數調用:length(p), nodes(p)
- 聚合函數:avg(x.prop), count(*)
- 路徑-模式:(a)-->()<--(b)
- 計算式:1 + 2 >3 and 3 < 4.
- 返回true或者false的斷言表達式:a.prop = 'Hello', length(p) >10, exists(a.name)
- 正則表達式:a.name =~ 'Tob.*'
- 大小寫敏感的字符串匹配表達式:a.surname STARTS WITH 'Sven', a.surname ENDS WITH 'son' or a.surname CONTAINS 'son'
- CASE表達式
三、參數
Cypher支持帶參數的查詢。這意味着開發人員不是必須用字符串來構建查詢。此外,這也讓執行計劃的緩存更容易。
參數能夠用於WHERE語句中的字面值和表達式,START語句中的索引值,索引查詢以及節點和關係的id。參數不能用於屬性名、關係類型和標籤,因爲這些模式(pattern)將作爲查詢結構的一部分被編譯進查詢計劃。
合法的參數名是字母,數字以及兩者的組合。下面是一個使用參數的完整例子。參數以JSON格式提供。具體如何提交它們取決於所使用驅動程序。
{ "name" : "Johan" } |
Match (n) where n.name=$name return n
四、運算符
1、數學運算符
包括+,-,*,/ 和%,^。
2、比較運算符
包括=,<>,<,>,<=,>=,IS NULL和IS NOT NULL。
3、布爾運算符
包括AND,OR,XOR和NOT。
4、字符串運算符
連接字符串的運算符爲+。正則表達式的匹配運算符爲=~。
5、列表運算符
列表的連接也可以通過+運算符。可以用IN來檢查列表中是否存在某個元素。
6、值的相等與比較
Cypher支持使用=和<>來比較兩個值的相等/不相等關係。同類型的值只有它們是同一個值的時候才相等,如3 = 3和"x" <> "xy"。
7、值的排序與比較
比較運算符<=,<(升序)和>=,>(降序)可以用於值排序的比較。如下所示:
- 數字型值的排序比較採用數字順序
- java.lang.Double.NaN大於所有值
- 字符串排序的比較採用字典順序。如"x" < "xy"
- 布爾值的排序遵循false < true
- 當有個參數爲null的時候,比較結果爲null。如null < 3的結果爲null
- 將其他類型的值相互比較進行排序將報錯
8、鏈式比較運算
比較運算可以被任意地鏈在一起。如x < y <= z等價於x < y AND y <= z。如:
MATCH (n) WHERE 21 < n.age <= 30 RETURN n |
等價於
MATCH (n) WHERE 21 < n.age AND n.age <= 30 RETURN n |
五、註釋
Cypher語言的註釋類似其他語言,用雙斜線//來註釋行。例如:
MATCH (n) RETURN n //這是行末尾註釋 MATCH (n) //這是整行註釋 RETURN n MATCH (n) WHERE n.property = '//這不是註釋' RETURN n |
六、模式(Patterns)
使用模式可以描述你期望看到的數據的形狀。例如,在MATCH、CREATE、DELETE等語句中,當用模式描述一個形狀的時候,Cypher將按照模式來獲取相應的數據。
模式描述數據的形式很類似在白板上畫出圖的形狀。通常用圓圈來表達節點,使用箭頭來表達關係。節點模式
模式能表達的最簡單的形狀就是節點。節點使用一對圓括號表示,然後中間含一個變量名字。例如:
(a) |
這個模式描述了一個節點,其名稱使用變量a表示。
關聯節點的模式
模式可以描述多個節點及其之間的關係。Cypher使用箭頭來表達兩個節點之間的關係。例如:
(a)-->(b) |
例如:
(a)-->(b)<--(c) |
例如:
(a)-->()<--(c) |
標籤
模式除了可以描述節點之外,還可以用來描述標籤。比如:
(a:User)-->(b) |
也可以描述一個節點的多個標籤,如:
(a:User:Admin)-->(b) |
指定屬性
屬性在模式中使用鍵值對的映射結構來表達,然後用大括號包起來。例如,一個有兩個屬性的節點如下所示:
(a {name: 'Andres', sport: 'Brazilian Ju-Jitsu'}) |
關係中的屬性:
(a)-[{blocked: false}]->(b) |
描述關係
如前面的例子所示,可以用箭頭簡單地描述兩個節點之間的關係。它描述了關係的存在性和方向性。但如果不關心關係的方向,則箭頭的頭部可以省略。例如:
(a)--(b) |
與節點類似,如果後續需要引用到該關係,則可以給關係賦一個變量名。變量名需要用方括號括起來,放在箭頭的短橫線中間,如下所示:
(a)-[r]->(b) |
就像節點有標籤一樣,關係可以有類型(type)。給關係指定類型,如下所示:
(a)-[r:REL_TYPE]->(b) |
不像節點可以有多個標籤,關係只能有一個類型。但如果所描述的關係可以是一個類型集中的任意一種類型,可以將這些類型都列入到模式中,它們之間以豎線“|”分割。如:
(a)-[r:TYPE1|TYPE2]->(b) |
注意:這種模式僅適用於描述已經存在的數據(如在MATCH語句中),而在CREATE或者MERGE語句中是不允許的,因爲一個關係不能創建多個類型。
與節點類似,關係的命名也是可以省略的。如:
(a)-[:REL_TYPE]->(b) |
與使用一串節點和關係來描述一個長路徑的模式不同,很多關係(以及中間的節點)可以採用指定關係的長度的模式來描述。例如:
(a)-[*2]->(b) |
它描述了一張三個節點和兩個關係的圖。這些節點和關係都在同一條路徑中(路徑的長度爲2)。它等同於:
(a)-->()-->(b) |
關係的長度也可以指定一個範圍,這被稱爲可變長度的關係。例如:
(a)-[*3..5]->(b) |
關係的長度最小值爲3,最大值爲5。它描述了一個或者有4個節點和3個關係,或者5個節點4個關係,或者6個節點和5個關係連在一起的圖組成的一條路徑。
長度的邊界也是可以省略的,如描述一個路徑長度大於等於3的路徑:
(a)-[*3..]->(b) |
路徑長度小於等於5的路徑,如:
(a)-[*..5]->(b) |
兩個邊界都可以省略,這允許任意長度的路徑,如:
(a)-[*]->(b) |
七、列表
Cypher對列表(list)有很好的支持。可以使用方括號和一組以逗號分割的元素來創建一個列表。
例如
RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list |
八、空值
空值null在Cypher中表示未找到或者未定義。從概念上講,null意味着”一個未找到的未知值”。 對待null會與其他值有些不同。例如從節點中獲取一個並不存在的屬性將返回null。大多數以null作爲輸入的表達式將返回null。這包括WHERE語句中用於斷言的布爾表達式。
null不等於null。兩個未知的值並不意味着它們是同一個值。因此,null = null返回null而不是true。
判斷 某個節點上 有或沒有 某個屬性,如下
Match (n) where n.name is null return n
Match (n) where n. name is not null return n
空值的邏輯運算
邏輯運算符(包括AND,OR,XOR,IN,NOT)把null當作未知的三值邏輯值。下面爲AND,OR和XOR的邏輯值表。
a |
b |
a AND b |
a OR b |
a XOR b |
false |
false |
false |
false |
false |
false |
null |
false |
null |
null |
false |
true |
false |
true |
true |
true |
false |
false |
true |
true |
true |
null |
null |
true |
null |
true |
true |
true |
true |
false |
null |
false |
false |
null |
null |
null |
null |
null |
null |
null |
null |
true |
null |
true |
null |
空值與IN
IN運算符遵循類似的邏輯。如果列表中存在某個值,結果就返回true。如果列表包含null值並且沒有匹配到值,結果返回null。否則結果爲false。下面表中是一些例子:
表達式 |
結果 |
2 IN [1, 2, 3] |
true |
2 IN [1, null, 3] |
null |
2 IN [1, 2, null] |
true |
2 IN [1] |
false |
2 IN [] |
false |
null IN [1, 2, 3] |
null |
null IN [1, null, 3] |
null |
null IN [] |
false |
all, any, none和single與IN類似,如果可以確切地計算結果,將返回true或者false。否則將返回null。
返回空值的表達式
- 從列表中獲取不存在的元素:[][0],head([])
- 試圖訪問節點或者關係的不存在的屬性:n.missingProperty
- 與null做比較:1 < null
- 包含null的算術運算:1 + null
- 包含任何null參數的函數調用:sin(null)
九、節點語法
Cypher採用一對圓括號來表示節點。如:(), (foo)。下面是一些常見的節點表示法:
() (matrix) matrix爲變量名 (:Movie) Movie爲標籤 (matrix:Movie) (matrix:Movie {title: "The Matrix"}) (matrix:Movie {title: "The Matrix", released: 1997}) |
若想查詢返回某些東西,就必須命名變量名來查詢:
Match (matrix:Movie {title: "The Matrix"}) return matrix
十、關係語法
Cypher使用一對短橫線(即“-”)表示:一個無方向關係。有方向的關係在其中一段加上一個箭頭(即“<-”或“->”)。方括號表達式[…]可用於添加詳情。裏面可以包含變量、屬性和或者類型信息。關係的常見表達方式如下:
-- --> -[role]-> -[:ACTED_IN]-> -[role:ACTED_IN]-> -[role:ACTED_IN {roles: ["Neo"]}]-> |
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),
(LillyW)-[:DIRECTED]->(TheMatrix),
(LanaW)-[:DIRECTED]->(TheMatrix),
(JoelS)-[:PRODUCED]->(TheMatrix)
查詢:
Match (n)-[role]->(m) return n, role ,m
Match (n)-->(m) return n ,m
Match (n)--(m) return n ,m
刪除:
match(n),(m) optional match (n)-[r]-(m)delete r,n,m
十一、模式語法
將節點和關係的語法組合在一起可以表達模式。
(keanu:Person:Actor {name: "Keanu Reeves"})-[role:ACTED_IN {roles: ["Neo"]}]-> (matrix:Movie {title: "The Matrix"} ) |
十二、Case表達式
計算表達式的值,然後依次與WHEN語句中的表達式進行比較,直到匹配上爲止。如果未匹配上,則ELSE中的表達式將作爲結果。如果ELSE語句不存在,那麼將返回null。
語法:
CASE test WHEN value THEN result [WHEN ...] [ELSE default] END |
參數:
- test:一個有效的表達式
- value:一個表達式,它的結果將與test表達式的結果進行比較
- result:如果value表達式能夠與test表達式匹配,它將作爲結果表達式
- default:沒有匹配的情況下的默認返回表達式