1.3 WHERE
WHERE在MATCH或者OPTINAL MATCH語句中添加約束,或者與WITH一起使用來過濾結果。
1.3.1 基本使用
(1)布爾運算
返回發行日期介於1990~2000年的電影名稱。
MATCH (nineties:Movie)
WHERE nineties.released > 1990 AND nineties.released < 2000
RETURN nineties.title
(2)節點標籤的過濾
可以在WHERE中類似使用WHERE n:foo寫入標籤斷言來過濾節點。
將返回’Movie節點。
MATCH (n) WHERE n:Movie RETURN n |
(3)節點屬性的過濾
返回released > 1990的"Movie"節點。
MATCH (n) WHERE n.released > 1990 RETURN n |
(4)關係屬性的過濾
返回參演過1990年後發佈的電影的演員。
MATCH (n)-[:ACTED_IN]->(m) WHERE m.released > 1990 RETURN n |
(5)屬性存在性檢查
返回擁有title屬性的節點
MATCH (n) WHERE exists(n.title) RETURN n |
1.3.2 字符串匹配
(1)匹配字符串的開始
STARTS WITH用於以大小寫敏感的方式匹配字符串的開始。
返回名字以"Tom"開始的節點。
MATCH (n) WHERE n.name STARTS WITH 'Tom' RETURN n |
(2)匹配字符串的結尾
ENDS WITH用於以大小寫敏感的方式匹配字符串的結尾。
返回了姓名以'Hanks'結尾的人。
MATCH (n) WHERE n.name ENDS WITH 'Hanks' RETURN n |
(3)字符串包含
CONTAINS用於檢查字符串中是否包含某個字符串,它是大小寫敏感的,且不關心匹配部分在字符串中的位置。
返回了姓名裏包含'bin'的人。
MATCH (n) WHERE n.name CONTAINS 'bin' RETURN n |
(4) 字符串反向匹配
使用NOT關鍵詞可以返回不滿足給定字符串匹配要求的結果。
返回了姓名不以"s"結尾的人。
MATCH (n) WHERE NOT n.name ENDS WITH 's' RETURN n |
1.3.3 正則表達式
Cypher支持正則表達式過濾。正則表達式的語法繼承來自Java正則表達式。
(1) 可以使用=~ 'regexp'來進行正則表達式模糊匹配。
MATCH (n) WHERE n.name =~ 'Tom.*' RETURN n |
(2)正則表達式的非大小寫敏感
在正則表達式前面加入(?i)之後,整個正則表達式將變成非大小寫敏感。
MATCH (n) WHERE n.name =~ '(?i)TOM.*' RETURN n |
返回了姓名以Tom開頭的人。
1.3.4 在WHERE中使用路徑模式
(1) 模式過濾
返回Kevin Bacon參演過的電影。
MATCH (n { name:'Kevin Bacon'}),(m) WHERE (n)-[:ACTED_IN]-(m) RETURN n,m 相當於: match (n{name:'Kevin Bacon'})-[r:ACTED_IN]-(m) return n, m |
(2) 模式中的NOT過濾
NOT功能可用於排除某個模式。
返回了Kevin Bacon沒有參演過的電影。
MATCH (n { name:'Kevin Bacon'}),(m:Movie) WHERE NOT (n)-[:ACTED_IN]-(m) RETURN m |
(3)模式中的屬性過濾
可以在模式中添加屬性來過濾結果。
返回參演Apollo 13電影的所有演員。
MATCH (n) WHERE (n)-[: ACTED_IN]-({ title: 'Apollo 13' }) RETURN n 相當於: match (n)-[:ACTED_IN]-({title:'Apollo 13'}) return n |
(4)關係類型過濾
可以在MATCH模式中添加關係類型,但有時候希望在類型過濾上具有豐富的功能。這時,可以將類型與其他進行比較。例如,下面的例子將關係類型與一個正在表達式進行比較。
返回所有導演。
MATCH (n)-[r]->() WHERE type(r)=~ 'DIRE.*' RETURN n |
1.3.5 列表
(1)IN運算符
檢查列表中是否存在某個元素,可以使用IN運算符。
MATCH (a) WHERE a.name IN ['Keanu Reeves', 'Lana Wachowski','Hugo Weaving'] RETURN a |
返回三個人的節點。
1.3.6 不存在的屬性和值
(1) 屬性不存在,對它的判斷默認返回false。對於不存在的屬性值就當作null,在下面例子中,對於沒有name屬性的節點的比較將返回false。
MATCH (n) WHERE n.name = 'Keanu Reeves' RETURN n |
返回Keanu Reeves節點
(2)屬性不存在默認爲true的情況
如果要比較的屬性存在,則可以與期望的值進行比較。如果不存在(IS NULL),默認值爲true。如:
MATCH (n) WHERE n.name = 'Keanu Reeves' OR n.name IS NULL RETURN n ORDER BY n.name |
返回Keanu Reeves節點和所有電影節點
(3)空值過濾
有時候需要測試某個值或變量是否爲null。在Cypher中與SQL類似,可以使用IS NULL。相反,“不爲空”使用IS NOT NULL,儘管NOT (IS NULL x)也可以。
MATCH (m) WHERE m.title IS NULL RETURN m |
返回人物節點。
1.3.7使用範圍
(1)簡單範圍
檢查某個元素是否在指定的範圍,可以使用不等運算符<,>=和>。
MATCH (a) WHERE a. released >= 1990 RETURN a |
(2)範圍的組合
多個不等式可以組合構成一個範圍。
MATCH (nineties:Movie)
WHERE nineties.released > 1990 AND nineties.released < 2000
RETURN nineties.title
也可以寫成:
MATCH (nineties:Movie)
WHERE 1990 < nineties.released < 2000
RETURN nineties.title
1.4 RETURN
RETURN語句定義了查詢結果集中返回的內容。
1.4.1 返回節點
MATCH (n { name: 'Steve Zahn' }) RETURN n |
1.4.2 返回關係
MATCH (n { name: 'Steve Zahn' })-[r:KNOWS]->(c) RETURN r |
1.4.3 返回屬性
MATCH (n { name: 'Steve Zahn' }) RETURN n.name |
1.4.4 返回所有元素
MATCH p =(a { name: 'Steve Zahn' })-[r]->(b) RETURN * |
1.4.5 變量中的特殊字符
如果想使用空格等特殊字符,可以用反引號`將其括起來。如下所示:
MATCH (`This isn't a common variable`) WHERE `This isn't a common variable`.name = 'Steve Zahn' RETURN `This isn't a common variable`.happy |
1.4.6 列別名
如果希望列名不同於表達式中使用的名字,可以使用AS<new name>對其重命名。
MATCH (a { name: 'Steve Zahn' }) RETURN a.born AS bornYear |
1.4.7 可選屬性
如果某個屬性可能存在,也可能不存在。這時,依然可以正常地去查詢,對於不存在的屬性,Cypher返回null。
MATCH (n) RETURN n.title |
本例中有title屬性的節點返回了具體的title,而沒有這個屬性的節點則返回null。
1.4.8 其他表達式
任何表達式都可以作爲返回項。如字面值,斷言,屬性,函數和任何其他表達式。
MATCH (a { name: 'Steve Zahn' }) RETURN a.born > 1960, "I'm a literal",(a)-->() |
本例中返回了斷言,字符串和帶模式表達參數的函數調用。
1.4.9 唯一性結果
DISTINCT用於僅僅 獲取結果集中所依賴列的唯一行。
MATCH (a) RETURN DISTINCT a.name |
返回結果去掉重名。