MATCH用于特定具有属性值的查询,而大多数情况下,我们需要查询具备一定条件的数据,这时可用WHERE子句来过滤MATCH的查询结果。
特别地,MATCH 后的语句可以省略:
- relationship,例如:
(node1_name: node1_label_name)-->(node2_name:node2_label_name) ;
- node_name,例如:
(node1_name: node1_label_name)-[: relationship]->( )。
>>>下文举例中标签为person的所有节点如下表所示,以下基于该数据进行过滤查询举例。
情况一:简单条件查询
关键字:WHERE,如除某条件外用 WHERE NOT,句法如下:
MATCH Statement
WHERE Condition
//negative condition
MATCH Statement
WHERE NOT Condition
举例1:(正)查询标签为person,name为Jennifer的节点的两种方式。
-等价-
举例2:(反) 查询标签为person,name不是Jennifer的节点。
情况二:多条件查询
2.1 查询同时满足两个及以上条件的属性
用 WHERE 且在多个条件之间用布尔操作符 AND 连接,句法如下:
MATCH Statement
WHERE condition1 AND condition2
举例:查找name为Jennifer且birthdate为1990/12/12的节点。
2.2 查询满足至少一个条件的属性
用 WHERE 并在多个条件之间用布尔操作符 OR 连接,句法如下:
MATCH Statement
WHERE condition1 OR condition2
举例:查找name为Jennifer或Tom的节点。
- 注意:WHERE p.name = ("Jennifer" OR "Tom") 是错误的❌。
2.3 查询满足且仅满足一个条件的属性
用 WHERE 并在条件之间用布尔操作符 XOR 连接,句法如下:
MATCH Statement
WHERE condition1 XOR condition2
举例:查询节点name为lily异或age是60的节点。
上述查询条件等价于:
(1)name = "lily" and age ≠ 60:节点lily。
(2)name ≠ "lily" and age = 60:节点TomHanks。
情况三:值域(数值范围)查询
3.1 属性值在某个范围内的查询
句法如下:
MATCH Statement
WHERE (number1 <=/<) XXX.property_value (<=/< number2)
举例:查找age在[20,60]之间的节点。
3.2 属性值属于某个数组的查询
关键字 IN,句法如下:
MATCH Statement
WHERE XXX.property_value IN [ARRAY]
举例1:查询age值在数组[20,30,50,60]中的节点。
举例2:查询name为Jennifer和Tom的节点。
情况四:存在性查询
4.1 查询某属性是否存在
- 方法一:WHERE exists() (neo4j未来版本会删除该关键字);
- 方法二:WHERE proprety is not null。
句法如下:
MATCH Statement
WHERE exists(XXX.property_name)
//2
MATCH Statement
WHERE XXX.property_name is not null
举例:查询name为lily且属性age存在的数据。
-等价-
4.2 查询关系/模式是否存在
句法如下:
MATCH Statement1
WHERE exists(Statement2)
- WHERE 之后的语句中不可以出现新变量!
举例1:
情况五:字符串模糊查询
5.1 查询以特定字符串为首的属性值
用 WHERE ... STARTS WITH 查询,句法如下,其中XX是字符串:
MATCH Statement
WHERE XXX.property_name STARTS WITH 'XX'
举例:查询标签为person的所有节点name以”li"开头的节点。
★注意:是STARTS WITH 有尾巴“S”。
5.2 查询以特定字符串结尾的属性
用 WHERE ... ENDS WITH 查询,句法如下:
MATCH Statement
WHERE XXX.property_name ENDS WITH 'XX'
举例:查询name以"er"结尾的节点。
5.3 查询包含特定字符串的属性
用 WHERE ... CONTAINS 查询,句法如下:
MATCH Statement
WHERE XXX.property_name CONTAINS 'XX'
举例:查询name中包含'n'的节点。
5.4 使用regular expression进行模糊查询
可以用正则表达式对所有属性值为字符串的属性进行查询,句法如下,这里注意是“=~”(中间无空格):
MATCH Statement
WHERE XXX.property_name = ~'regular expression'
举例1:查询name以“J”开头的节点。
举例2:查询name以两个单词(中间空格)形式存在的节点。
情况六:复杂查询
6.1 查询一个模式后的筛选
在match的模式中筛选出符合条件的模式,使用关键字 OPTIONAL MATCH,句法如下:
MATCH Statement1
OPTIONAL MATCH Statement2
RETURN XXX
- 符合statement1和statement2的模式,返回相关值;
- 符合statement1但不符合statement2的模式,也将被查询出来,但返回值为null;
- 如果需要同时满足两个条件,则用本文 5.2 的WHERE statement1 AND statement2。
举例:查询名字为Tom的所有person,如果Tom还是名字为Jennifer的person的朋友更好。
6.2 同时满足多个模式的查询
若要查询满足多个模式的节点、属性等,可用如下句法:
//同时满足多个关系不连续模式的查询
MATCH Pattern1, Pattern2, ......
//满足多个关系连续模式的查询
MATCH (node_name1:node_label_name1)-[:relationship1]-(node_name2:node_label_name2)-
[:relationship2]-(node_name3:node_label_name3)
- 若模式之间关系不连续,用逗号隔开;
- 若模式之间关系连续,仅需简单叠加。
举例:查找Tom,他既是Jennifer的朋友又是lily的朋友。
(1)方法一:用连续模式
(2)方法二:用不连续模式(“,”)
(3)方法三:用MATCH... WHERE... AND...(注意WHERE后不可以出现新变量名)