官术网_书友最值得收藏!

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之間的節點。

結果:

主站蜘蛛池模板: 滨州市| 元阳县| 绍兴市| 富源县| 枣强县| 台江县| 和平区| 漠河县| 鄢陵县| 潼南县| 江永县| 隆回县| 巩义市| 长汀县| 黄骅市| 麻阳| 五原县| 商南县| 金阳县| 黄梅县| 池州市| 河北区| 阿勒泰市| 永和县| 巴东县| 历史| 札达县| 江西省| 札达县| 海盐县| 镇雄县| 桐城市| 滕州市| 沧源| 大庆市| 兴宁市| 阳高县| 马山县| 茶陵县| 武宣县| 渭南市|