3.3.3 WHERE語句
WHERE在MATCH或者OPTINAL MATCH語句中添加約束,或者與WITH一起使用來過濾結果。
WHERE不能單獨使用,它只能作為MATCH、OPTINAL MATCH、START和WITH的一部分。如果是用在WITH和START中,它用于過濾結果。對于MATCH和OPTINAL MATCH,WHERE為模式增加約束,它不能看作是匹配完成后的結果過濾。
WHERE圖例如圖3-7所示。

圖3-7 WHERE圖例
3.3.3.1 基本使用
1.布爾運算
可以在WHERE中使用布爾運算符,如AND、OR,以及布爾函數NOT。
查詢:

結果:

2.節點標簽的過濾
可以在WHERE中類似使用WHERE n:foo寫入標簽斷言來過濾節點。
查詢:

將返回Andres節點。
結果:

提示:提示:如果要查詢不包含某個標簽的其他所有節點的反向查詢,可在WHERE后加NOT。
3.節點屬性的過濾
可以在WHERE語句中對節點的屬性進行過濾。
查詢:

返回了Tobias節點,因為其年齡小于30。
結果:

4.關系屬性的過濾
要對關系的屬性進行過濾,可在WHERE中添加如下關鍵詞:
查詢:

返回了Peter,因為Andres自1999年就認識他了。
結果:

5.動態節點屬性過濾
以方括號語法的形式使用動態計算的值來過濾屬性。
參數:

查詢:

返回了“Tobias”,因為他的年齡小于30。
結果:

6.屬性存在性檢查
可以使用exists()檢查節點或者關系的某個屬性是否存在。
查詢:

返回了Andres,因為只有belt屬性。
提示:提示:has()函數已被移除,并被exists()替代了。
結果:

3.3.3.2 字符串匹配
可以用START WITH和ENDS WITH來匹配字符串的開始和結尾。如果不關心所匹配字符串的位置,可以用CONTAINS,匹配是區分大小寫的。
1.匹配字符串的開始
STARTS WITH用于以大小寫敏感的方式匹配字符串的開始。
查詢:

返回了Peter,因為其名字以“Pet”開始。
結果:

2.匹配字符串的結尾
ENDS WITH用于以大小寫敏感的方式匹配字符串的結尾。
查詢:

返回了Peter,因為其名字以“ter”結尾。
結果:

3.字符串包含
CONTAINS用于檢查字符串中是否包含某個字符串,它是大小寫敏感的,且不關心匹配部分在字符串中的位置。
查詢:

返回了Peter,因為其名字包含了“ete”字符串。
結果:

4.字符串反向匹配
使用NOT關鍵詞可以返回不滿足給定字符串匹配要求的結果。
查詢:

返回了Peter,因為其名字不以“s”結尾。
結果:

3.3.3.3 正則表達式
Cypher支持正則表達式過濾。正則表達式的語法繼承來自Java正則表達式(5)。它支持字符串如何匹配標記,包括不區分大小寫(?i)、多行(?m)和單行(?s)。標記放在正則表達式的開頭,例如MATCH (n) WHERE n.name =~ '(?i)Lon.*' RETURN n將返回名字為London和LonDoN的節點。
1.正則表達式
可以使用=~ 'regexp'來進行正則表達式的匹配。
查詢:

返回了Tobias,因為其名字以“Tob”開始。
結果:

2.正則表達式中的轉義字符
如果需要在正則表達式中插入斜杠,則需要使用轉義字符。
注意:字符串中的反斜杠也需要轉義。
查詢:

返回了Tobias,因為其地址在“Sweden/Malmo”。
結果:

3.正則表達式的非大小寫敏感
在正則表達式前面加入“(?i)”之后,整個正則表達式將變成非大小寫敏感。
查詢:

返回了Andres,因為其名字在不考慮大小寫的情況下以“ANDR”開始。
結果:

3.3.3.4 在WHERE中使用路徑模式
1.模式過濾
模式是返回一個路徑列表的表達式。列表表達式也是一種斷言,空列表代表false,非空列表代表true。因此,模式不僅僅是一種表達式,同時也是一種斷言。模式的局限性在于只能在單條路徑中表達它,不能像在MATCH語句中那樣使用逗號分隔多條路徑,但可以通過AND組合多個模式。
提示:不能在WHERE中的模式引入新的變量。盡管它看起來與MATCH中的模式類似。但MATCH(a)-[]→(b)與WHERE (a)-[]→(b)有很大的不同,前者將產生一個它匹配到的a和b之間的路徑子圖,而后者是排除匹配到的a和b之間沒有一個有向關系鏈的任何子圖。
查詢:

結果將返回有外向關系指向Tobias的節點。
結果:

2.模式中的NOT過濾
NOT可用于排除某個模式。
查詢:

結果將返回沒有外向關系指向Peter的節點。
結果:

3.模式中的屬性過濾
可以在模式中添加屬性來過濾結果。
查詢:

結果將返回與節點Tobias有KNOWS關系的所有節點。
結果:

4.關系類型過濾
可以在MATCH模式中添加關系類型,但有時候希望在類型過濾上具有豐富的功能。這時,可以將類型與其他進行比較。例如,下面是一個對關系類型與一個正則表達式進行比較的例子。
查詢:

該查詢將返回與Andres節點以“K”開始的所有關系。
結果:

5.在WHERE中使用簡單存在子查詢
可以在內部MATCH子句中使用從外部引入的變量,如以下示例所示:
查詢:

結果:

6.嵌套存在子查詢
存在子查詢可以嵌套,如下例所示。嵌套也會影響范圍。這意味著可以從子查詢內部訪問所有變量,這些變量要么在外部范圍內,要么在同一個子查詢中定義。
查詢:

結果:

3.3.3.5 列表
IN運算符:可以使用IN運算符檢查列表中是否存在某個元素。
查詢:

以上查詢將檢查字符串列表中是否存在某個屬性。
結果:

3.3.3.6 不存在的屬性和值
如果屬性不存在,對它的判斷默認返回false。對于不存在的屬性值則當作null,在下面例子中,對于沒有belt屬性的節點的比較將返回false。
查詢:

結果將僅返回belt為white的節點。
結果:

1.屬性不存在默認為true的情況
通過如下查詢語句可以實現:如果要比較的屬性存在,則可以與期望的值進行比較;如果不存在(IS NULL),則默認值為true。
查詢:

結果將返回滿足belt屬性值為white和不存在belt屬性的所有節點。
結果:

2.空值過濾
有時候需要測試某個值或變量是否為null。在Cypher中與SQL類似,可以使用IS NULL,相反,“不為空”則使用IS NOT NULL,盡管也可以使用NOT (IS NULL x)。
查詢:

結果將返回name屬性值為Peter的且不存在belt屬性的節點。
結果:

3.3.3.7 使用范圍
1.簡單范圍
可以使用不等運算符<、>=和>檢查某個元素是否在指定的范圍。
查詢:

結果將返回節點的name屬性值大于或等于Peter的節點。
結果:

2.范圍的組合
可以將多個不等式組合成一個范圍。
查詢:

結果將返回name屬性值介于Andres和Tobias之間的節點。
結果:

- Python絕技:運用Python成為頂級數據工程師
- Test-Driven Development with Mockito
- 數據化網站運營深度剖析
- 大數據:規劃、實施、運維
- UDK iOS Game Development Beginner's Guide
- OracleDBA實戰攻略:運維管理、診斷優化、高可用與最佳實踐
- LabVIEW 完全自學手冊
- Oracle RAC日記
- MySQL DBA修煉之道
- 大數據數學基礎(R語言描述)
- Hands-On System Programming with C++
- Oracle 11g數據庫管理員指南
- Oracle 內核技術揭密
- 深入理解Flink:實時大數據處理實踐
- Configuration Management with Chef-Solo