【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 NULLIS 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 列表中不包含 JavaPerson 节点。

六、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 列表中包含 PythonPerson 节点。

七、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 列表中只有一个 PythonPerson 节点。

九、断言函数结合 MATCHWITH


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
  • 仅返回具有 nameage 属性的 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
  • 仅返回朋友列表中包含 BobPerson 节点。

十、断言函数的常见错误与注意事项


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 NULLIS NOT NULLALL()ANY()NONE()SINGLE()
  • 断言函数通常与 MATCHWHEREWITH 结合使用,可对节点、关系、路径和属性进行严格的数据验证。
  • 通过使用断言函数,可以有效提升 Cypher 查询的灵活性、数据完整性和查询效率。

掌握这些断言函数,可以帮助你在 Neo4j 中更高效地进行数据筛选、验证和数据完整性检查。