首页 > 编程笔记 > MySQL笔记 阅读:15

Cypher WHERE语句用法详解(附带实例)

WHERE 语句的语法如下:
WHERE <property-name> <comparison-operator> <value>

Neo4j Cypher 中的比较运算符包括 = 、< >、<、>、<=、>=,它们分别表示等于、不等于、小于、大于、小于或等于、大于或等于。

WHERE 语句中可以包含多个条件,条件之间通过布尔运算符进行连接。布尔运算符包括 AND(与)、OR(或)、NOT(非)、XOR(异或)等。

我们先删除图中的所有节点和关系,代码如下:
MATCH (n) DETACH DELETE n
注意,上述代码会删除所有的节点及关系,读者在使用过程中一定要谨慎。

然后创建一些节点,代码如下:
CREATE (:Swedish {belt:"white",name:"Andy",age:36})
CREATE ({email:"peter_n@example.com",name:"Peter",age:35})
CREATE ({address:"Sweden/Malmo",name:"Timothy",age:25})

最后创建关系,代码如下:
MATCH (Andy:Swedish{name:"Andy"}),(Peter{name:"Peter"}),(Timothy{name:"Timothy"})
CREATE (Andy) - [:KNOWS{since:1999}] -> (Peter)
CREATE (Andy) - [:KNOWS{since:2012}] -> (Timothy)
上述节点和关系构成的图如下图所示:


图 1 节点和关系构成的图

WHERE语句基本过滤

1) 布尔操作

匹配所有的节点,并对节点进行过滤,并返回符合如下过滤条件的节点,代码如下:
MATCH (n)
WHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = 'Timothy') OR NOT (n.name =
'Timothy' OR n.name = 'Peter')
RETURN n.name, n.age
这个过滤条件可能较为复杂,读者可以根据具体情况在代码中自行删减一些条件,以加深对代码的理解。

上述代码的返回值如下:
│"n.name" │"n.age"│
│"Andy"   │36     │
│"Peter"  │35     │
│"Timothy"│25     │

2) 过滤节点标签

过滤节点标签为 Swedish 的节点,并返回该节点的 name 和 age 属性值,代码如下:
MATCH (n)
WHERE n:Swedish
RETURN n.name, n.age
返回值如下:
│"n.name"│"n.age"│
│"Andy"  │36     │

3) 过滤节点属性

匹配所有节点,过滤条件为节点的 age 属性值小于 30,过滤后返回节点的 name 和 age 属性值,代码如下:
MATCH (n)
WHERE n.age < 30
RETURN n.name, n.age
返回值如下:
│"n.name"  │"n.age"                        │
│"Timothy" │25                             │

4) 过滤关系属性

匹配标签为 KNOWS 的关系,过滤 since 属性值小于 2000 的关系,并返回相关节点的对应属性值,代码如下:
MATCH (n) - [k:KNOWS] -> (f)
WHERE k.since < 2000
RETURN f.name, f.age, f.email
返回值如下:
│"f.name"  │"f.age"  │"f.email"            │
│"Peter"   │35       │"peter_n@example.com"│

5) 过滤动态计算节点的属性

定义字符串 AGE 的别名为 propname,匹配并过滤所有节点,过滤条件为节点的 age 属性值小于 30。之后返回符合条件的节点的 name 和 age 属性,代码如下:
WITH 'AGE' AS propname
MATCH (n)
WHERE n[toLower(propname)]< 30
RETURN n.name, n.age

WHERE 语句中的 toLower 表示将大写字符串 AGE 转为小写字符串 age。上述代码的返回值如下:
│"n.name"  │"n.age"                        │
│"Timothy" │25                             │

6) 过滤存在指定配置的节点或属性

过滤存在 belt 属性的节点,并返回节点的 name 和 age 属性,代码如下:
MATCH (n)
WHERE exists(n.belt)
RETURN n.name, n.belt
返回值如下:
│"n.name"  │"n.belt"                       │
│"Andy"    │"white"                        │

WHERE语句字符串过滤

当过滤条件为字符串时,字符串的前缀和后缀通过 STARTS WITH 和 ENDS WITH 语句进行匹配。对于子字符串搜索(不考虑字符串中的位置),可以使用 CONTAINS 语句。字符串匹配会区分字母大小写。对于非字符串的过滤,这些语句将返回 null。

1) 使用STARTS WITH语句过滤字符串前缀

STARTS WITH 语句用于在字符串的开头执行匹配操作,代码如下:
MATCH (n)
WHERE n.name STARTS WITH 'Pet'
RETURN n.name, n.age
返回值如下:
│"n.name"│"n.age"│
│"Peter" │35     │
返回的是 Peter 节点的 name 和 age 属性值,这是因为该节点的 name 属性值以“Pet”开头。

2) 使用ENDS WITH语句过滤字符串后缀

ENDS WITH 语句用于在字符串的结尾执行匹配操作,代码如下:
MATCH (n)
WHERE n.name ENDS WITH 'ter'
RETURN n.name, n.age
返回值如下:
│"n.name"│"n.age"│
│"Peter" │35     │
返回的是 Peter 节点的 name 和 age 属性值,这是因为 name 属性值以“ter”结尾。

3) 使用CONTAINS语句搜索字符串

CONTAINS 语句用于判断是否包含指定字符串,区分字母大小写,不考虑字符串的具体位置。代码如下:
MATCH (n)
WHERE n.name CONTAINS 'ete'
RETURN n.name, n.age
返回值如下:
│"n.name"│"n.age"│
│"Peter" │35     │
返回的是 Peter 节点的 name 和 age 属性值,这是因为该节点的 name 属性值包含“ete”。

3) 正则表达式过滤

Cypher 支持使用正则表达式进行过滤,其正则表达式语法继承自 Java 正则表达式的语法。正则表达式中支持改变字符串匹配方式的标志,其中包括不区分字母大小写(?i)、多行(?m)和逗点(?s)。标记位于正则表达式的开头,例如,不区分字母大小写的匹配代码如下:
MATCH (n) WHERE n.name =~ '(?i)Lon.* ' RETURN n
上述代码的返回值为 name 属性值为“London”或“LonDon”等的节点。

基于正则表达式的过滤中可以使用 =~'regexp' 语句来匹配正则表达式,其中, regexp 表示正则表达式字符串。

例如,匹配 name 属性值为“Tim.*”形式的正则表达式的代码如下:
MATCH (n)
WHERE n.name =~ 'Tim.*'
RETURN n.name, n.age
返回值如下:
│"n.name" │"n.age"│
│"Timothy"│25     │

相关文章