neo4j--Cypher 基本語法

一、類型

Cypher處理的所有值都有一個特定的類型,它支持如下類型:

  1. 數值型
  2. 字符串
  3. 布爾型
  4. 節點
  5. 關係
  6. 路徑
  7. 映射(Map)
  8. 列表(List)

二、表達式

Cypher中的表達式如下:

  1. 十進制(整型和雙精度型)的字面值:13, -4000, 3.14, 6.022E23
  2. 十六進制整型字面值(以0x開頭):0x13zf, 0xFC3A9, -0x66eff
  3. 八進制整型字面值(以0開頭):01372, 02127, -05671
  4. 字符串字面值:'Hello', "World"
  5. 布爾字面值:true, false, TRUE, FALSE
  6. 變量:n, x, rel, myFancyVariable, `A name with weird stuff in it[]!`
  7. 屬性:n.prop, x.prop, rel.thisProperty, myFancyVariable. `(weird property name)`
  8. 動態屬性:n["prop"], rel[n.city + n.zip], map[coll[0]]
  9. 參數:$param, $0
  10. 表達式列表:['a', 'b'], [1, 2, 3], ['a', 2, n.property, $param], [ ]
  11. 函數調用:length(p), nodes(p)
  12. 聚合函數:avg(x.prop), count(*)
  13. 路徑-模式:(a)-->()<--(b)
  14. 計算式:1 + 2 >3 and 3 < 4.
  15. 返回true或者false的斷言表達式:a.prop = 'Hello', length(p) >10, exists(a.name)
  16. 正則表達式:a.name =~ 'Tob.*'
  17. 大小寫敏感的字符串匹配表達式:a.surname STARTS WITH 'Sven', a.surname ENDS WITH 'son' or a.surname CONTAINS 'son'
  18. 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:沒有匹配的情況下的默認返回表達式

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章