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 |
返回结果去掉重名。