【Cypher】断言(Predicate) 函数:返回 true 或者 false 的布尔函数,例如 EXISTS()、IS NULL、IS NOT NULL、ALL()、ANY()、NONE()
Cypher 中的断言函数详解
一、什么是 Cypher 断言函数?
断言函数(Assertion Functions)是 Cypher 提供的一组布尔函数,用于验证数据的存在性、匹配性或完整性。
- 断言函数通常在
WHERE
子句中使用,用于筛选或验证查询条件。 - 如果断言条件为
TRUE
,则返回匹配的数据,否则不返回。
二、常见断言函数列表
2.1 EXISTS()
- 检查属性、关系、模式或路径是否存在。
- 适用于节点、关系属性以及复杂路径的存在性检查。
语法:
EXISTS(variable.property)
2.2 IS NULL
- 检查属性值是否为空。
- 如果属性值为
NULL
,返回TRUE
,否则返回FALSE
。
语法:
variable.property IS NULL
2.3 IS NOT NULL
- 检查属性值是否不为空。
- 如果属性值不为
NULL
,返回TRUE
,否则返回FALSE
。
语法:
variable.property IS NOT NULL
2.4 ALL()
- 检查列表中所有元素是否满足条件。
- 如果列表中所有元素都满足断言条件,返回
TRUE
,否则返回FALSE
。
语法:
ALL(variable IN list WHERE condition)
2.5 ANY()
- 检查列表中是否存在至少一个元素满足条件。
- 如果列表中存在一个元素满足断言条件,返回
TRUE
,否则返回FALSE
。
语法:
ANY(variable IN list WHERE condition)
2.6 NONE()
- 检查列表中没有任何元素满足条件。
- 如果列表中没有任何元素满足断言条件,返回
TRUE
,否则返回FALSE
。
语法:
NONE(variable IN list WHERE condition)
2.7 SINGLE()
- 检查列表中只有一个元素满足条件。
- 如果列表中恰好有一个元素满足断言条件,返回
TRUE
,否则返回FALSE
。
语法:
SINGLE(variable IN list WHERE condition)
三、EXISTS()
断言函数
3.1 检查属性是否存在
MATCH (n:Person)
WHERE EXISTS(n.age)
RETURN n.name, n.age
- 仅返回具有
age
属性的Person
节点。
3.2 检查关系是否存在
MATCH (a:Person)-[r:KNOWS]->(b:Person)
WHERE EXISTS(r.since)
RETURN a.name, b.name, r.since
- 仅返回具有
since
属性的KNOWS
关系。
3.3 检查复杂模式的存在性
MATCH (a:Person)
WHERE EXISTS((a)-[:FRIENDS_WITH]->(:Person))
RETURN a.name
- 返回
Person
节点中有FRIENDS_WITH
关系的节点名称。
四、IS NULL
和 IS NOT NULL
断言函数
4.1 检查属性是否为空
MATCH (n:Person)
WHERE n.age IS NULL
RETURN n.name
- 仅返回
age
属性为空的Person
节点。
4.2 检查属性是否不为空
MATCH (n:Person)
WHERE n.age IS NOT NULL
RETURN n.name, n.age
- 仅返回具有
age
属性的Person
节点。
五、ALL()
断言函数
5.1 检查列表中所有元素是否满足条件
WITH [1, 2, 3, 4, 5] AS numbers
RETURN ALL(num IN numbers WHERE num > 0) AS result
- 检查
numbers
列表中所有元素是否大于0
,返回TRUE
。
5.2 检查节点属性列表
MATCH (n:Person)
WHERE ALL(skill IN n.skills WHERE skill <> 'Java')
RETURN n.name, n.skills
- 仅返回
skills
列表中不包含Java
的Person
节点。
六、ANY()
断言函数
6.1 检查列表中是否有元素满足条件
WITH [1, 2, 3, 4, 5] AS numbers
RETURN ANY(num IN numbers WHERE num > 3) AS result
- 检查
numbers
列表中是否有元素大于3
,返回TRUE
。
6.2 检查节点属性列表
MATCH (n:Person)
WHERE ANY(skill IN n.skills WHERE skill = 'Python')
RETURN n.name, n.skills
- 仅返回
skills
列表中包含Python
的Person
节点。
七、NONE()
断言函数
7.1 检查列表中没有元素满足条件
WITH [1, 2, 3, 4, 5] AS numbers
RETURN NONE(num IN numbers WHERE num < 0) AS result
- 检查
numbers
列表中是否没有元素小于0
,返回TRUE
。
7.2 检查节点属性列表
MATCH (n:Person)
WHERE NONE(skill IN n.skills WHERE skill = 'C++')
RETURN n.name, n.skills
- 仅返回
skills
列表中不包含C++
的Person
节点。
八、SINGLE()
断言函数
8.1 检查列表中是否只有一个元素满足条件
WITH [1, 2, 3, 4, 5] AS numbers
RETURN SINGLE(num IN numbers WHERE num = 3) AS result
- 检查
numbers
列表中是否只有3
满足条件,返回TRUE
。
8.2 检查节点属性列表
MATCH (n:Person)
WHERE SINGLE(skill IN n.skills WHERE skill = 'Python')
RETURN n.name, n.skills
- 仅返回
skills
列表中只有一个Python
的Person
节点。
九、断言函数结合 MATCH
和 WITH
9.1 检查朋友的年龄
MATCH (p:Person)-[:FRIENDS_WITH]->(f:Person)
WHERE EXISTS(f.age) AND f.age > 30
RETURN p.name, f.name, f.age
- 仅返回
FRIENDS_WITH
关系中年龄大于 30 的朋友。
9.2 检查节点属性的完整性
MATCH (n:Person)
WITH n, EXISTS(n.name) AS hasName, EXISTS(n.age) AS hasAge
WHERE hasName AND hasAge
RETURN n.name, n.age
- 仅返回具有
name
和age
属性的Person
节点。
9.3 结合 ALL()
检查节点关系
MATCH (p:Person)-[:FRIENDS_WITH]->(f:Person)
WITH p, COLLECT(f.age) AS friendAges
WHERE ALL(age IN friendAges WHERE age > 25)
RETURN p.name, friendAges
- 仅返回
Person
节点的所有朋友年龄都大于25
的节点。
9.4 结合 ANY()
检查路径存在性
MATCH (p:Person)
WITH p, [(p)-[:FRIENDS_WITH]->(f) | f.name] AS friends
WHERE ANY(name IN friends WHERE name = 'Bob')
RETURN p.name
- 仅返回朋友列表中包含
Bob
的Person
节点。
十、断言函数的常见错误与注意事项
10.1 EXISTS()
只能用于属性或模式
MATCH (n:Person)
WHERE EXISTS(n)
RETURN n
- 错误:
EXISTS()
不能直接用于节点变量。 - 解决方案:
MATCH (n:Person)
WHERE EXISTS(n.name)
RETURN n
10.2 IS NULL
只能用于属性检查
MATCH (n:Person)
WHERE n IS NULL
RETURN n
- 错误:
IS NULL
只能用于属性。 - 解决方案:
MATCH (n:Person)
WHERE n.name IS NULL
RETURN n
10.3 ALL()
和 ANY()
只能作用于列表
MATCH (n:Person)
WHERE ALL(n.name WHERE n.name <> '')
RETURN n
- 错误:
ALL()
只能用于列表。 - 解决方案:
WITH ['Alice', 'Bob', 'Charlie'] AS names
RETURN ALL(name IN names WHERE name <> '') AS result
十一、总结
- Cypher 提供了一系列断言函数来验证数据的存在性和完整性,包括
EXISTS()
、IS NULL
、IS NOT NULL
、ALL()
、ANY()
、NONE()
和SINGLE()
。 - 断言函数通常与
MATCH
、WHERE
和WITH
结合使用,可对节点、关系、路径和属性进行严格的数据验证。 - 通过使用断言函数,可以有效提升 Cypher 查询的灵活性、数据完整性和查询效率。
掌握这些断言函数,可以帮助你在 Neo4j 中更高效地进行数据筛选、验证和数据完整性检查。
上一篇: 几秒钟就充满电!科学
下一篇: 暂无数据