谓词函数

介绍

谓词是布尔函数,对于给定的非 null 输入集返回 truefalse。它们最常用于在查询的 WHERE 部分中过滤路径。

示例图

以下图用于下面的示例

[width="600"

要重新创建它,请针对空的 Neo4j 数据库运行以下查询

CREATE
  (keanu:Person {name:'Keanu Reeves', age:58, nationality:'Canadian'}),
  (carrie:Person {name:'Carrie Anne Moss', age:55, nationality:'American'}),
  (liam:Person {name:'Liam Neeson', age:70, nationality:'Northern Irish'}),
  (guy:Person {name:'Guy Pearce', age:55, nationality:'Australian'}),
  (kathryn:Person {name:'Kathryn Bigelow', age:71, nationality:'American'}),
  (jessica:Person {name:'Jessica Chastain', age:45, address:''}),
  (theMatrix:Movie {title:'The Matrix'}),
  (keanu)-[:KNOWS]->(carrie),
  (keanu)-[:KNOWS]->(liam),
  (keanu)-[:KNOWS]->(kathryn),
  (kathryn)-[:KNOWS]->(jessica),
  (carrie)-[:KNOWS]->(guy),
  (liam)-[:KNOWS]->(guy),
  (keanu)-[:ACTED_IN]->(theMatrix),
  (carrie)-[:ACTED_IN]->(theMatrix)

all()

详细信息

语法

all(variable IN list WHERE predicate)

描述

如果谓词对给定 LIST<ANY> 中的所有元素都成立,则返回 true。

参数

名称

类型

描述

variable

ANY

可以在 WHERE 子句中使用的变量。

list

LIST<ANY>

谓词必须对该列表中的所有元素成立,函数才能返回 true

predicate

ANY

对给定列表中的所有项目进行测试的谓词。

返回值

BOOLEAN

注意事项

如果 listnull,或者如果 predicate 针对至少一个元素评估为 null 并且没有针对任何其他元素评估为 false,则返回 null

示例 1. all()
查询
MATCH p = (a)-[*]->(b)
WHERE
  a.name = 'Keanu Reeves'
  AND b.name = 'Guy Pearce'
  AND all(x IN nodes(p) WHERE x.age < 60)
RETURN p

返回路径中的所有节点都将具有 age 属性,其值为小于 60

predicate function example
结果
p

(:Person {nationality: "Canadian",name: "Keanu Reeves",age: 58})-[:KNOWS]->(:Person {nationality: "American",name: "Carrie Anne Moss",age: 55})-[:KNOWS]->(:Person {nationality: "Australian",name: "Guy Pearce",age: 55})

行数:1

any()

详细信息

语法

any(variable IN list WHERE predicate)

描述

如果谓词对给定 LIST<ANY> 中的至少一个元素成立,则返回 true。

参数

名称

类型

描述

variable

ANY

可以在 WHERE 子句中使用的变量。

list

LIST<ANY>

谓词必须对该列表中的所有元素成立,函数才能返回 true

predicate

ANY

对给定列表中的所有项目进行测试的谓词。

返回值

BOOLEAN

注意事项

如果 listnull,或者如果 predicate 针对至少一个元素评估为 null 并且没有针对任何其他元素评估为 false,则返回 null

示例 2. any()
查询
MATCH (p:Person)
WHERE any(nationality IN p.nationality WHERE nationality = 'American')
RETURN p

该查询返回 nationality 属性值为 AmericanPerson 节点。

结果
p

{"nationality":"American","name":"Carrie Anne Moss","age":55}

{"nationality":"American","name":"Kathryn Bigelow","age":71}

行数:2

exists()

详细信息

语法

exists(input)

描述

如果图中存在模式的匹配项,则返回 true。

参数

名称

类型

描述

input

ANY

要验证其存在的模式。

返回值

BOOLEAN

注意事项

如果 inputnull,则返回 null

要检查属性是否不为 null,请使用 IS NOT NULL 谓词

示例 3. exists()
查询
MATCH (p:Person)
RETURN
  p.name AS name,
  exists((p)-[:ACTED_IN]->()) AS has_acted_in_rel

该查询返回每个 Person 节点的 name 属性,以及一个布尔值(truefalse),指示这些节点在图中是否具有 ACTED_IN 关系。

结果
name has_acted_in_rel

"Carrie Anne Moss"

true

"Keanu Reeves"

true

"Liam Neeson"

false

"Guy Pearce"

false

"Kathryn Bigelow"

false

"Jessica Chastain"

false

行数:6

有关 EXISTS 子查询的信息,该子查询比 exists() 函数更通用,请参见 EXISTS 子查询

isEmpty()

详细信息

语法

isEmpty(input)

描述

检查 STRINGMAPLIST<ANY> 是否为空。

参数

名称

类型

描述

input

STRING | MAP | LIST<ANY>

要检查是否为空的值。

返回值

BOOLEAN

示例 4. isEmpty(list)
查询
MATCH (p:Person)
WHERE NOT isEmpty(p.nationality)
RETURN p.name, p.nationality

该查询返回图中具有设置 nationality 属性值的每个 Person 节点(即,除 Jessica Chastain 之外的所有 Person 节点)。

结果
p.name p.nationality

"Keanu Reeves"

"Canadian"

"Carrie Anne Moss"

"American"

"Liam Neeson"

"Northern Irish"

"Guy Pearce"

"Australian"

"Kathryn Bigelow"

"American"

行数:5

示例 5. isEmpty(map)
查询
MATCH (n)
WHERE isEmpty(properties(n))
RETURN n

因为示例图不包含空节点,所以没有返回任何内容。

结果
(no changes, no records)
示例 6. isEmpty(string)
查询
MATCH (p:Person)
WHERE isEmpty(p.address)
RETURN p.name AS name

返回每个具有空 STRING address 属性的节点的 name 属性。

结果
name

"Jessica Chastain"

行数:1

如果将 null 传递给函数,则函数 isEmpty() 与大多数其他 Cypher® 函数一样,返回 null。这意味着谓词 isEmpty(n.address) 将过滤掉所有未设置 address 属性的节点。因此,isEmpty() 不适合测试 null 值。为此目的,应使用 IS NULLIS NOT NULL

none()

详细信息

语法

none(variable IN list WHERE predicate)

描述

如果谓词对给定 LIST<ANY> 中的任何元素都不成立,则返回 true。

参数

名称

类型

描述

variable

ANY

可以在 WHERE 子句中使用的变量。

list

LIST<ANY>

谓词必须对该列表中的所有元素成立,函数才能返回 true

predicate

ANY

对给定列表中的所有项目进行测试的谓词。

返回值

BOOLEAN

注意事项

如果 listnull,或者如果 predicate 针对至少一个元素评估为 null 并且没有针对任何其他元素评估为 true,则返回 null

示例 7. none()
查询
MATCH p = (n)-[*]->(b)
WHERE
  n.name = 'Keanu Reeves'
  AND none(x IN nodes(p) WHERE x.age > 60)
RETURN p

返回路径中的任何节点都没有 age 属性,其值大于 60

predicate function example
结果
p

(:Person {nationality: "Canadian",name: "Keanu Reeves",age: 58})-[:KNOWS]→(:Person {nationality: "Northern Irish",name: "Liam Neeson",age: 70})

(:Person {nationality: "Canadian",name: "Keanu Reeves",age: 58})-[:KNOWS]→(:Person {nationality: "American",name: "Carrie Anne Moss",age: 55})-[:KNOWS]→(:Person {nationality: "Australian",name: "Guy Pearce",age: 55})

行数:2

single()

详细信息

语法

single(variable IN list WHERE predicate)

描述

如果谓词对给定 LIST<ANY> 中的元素恰好成立一次,则返回 true。

参数

名称

类型

描述

variable

ANY

可以在 WHERE 子句中使用的变量。

list

LIST<ANY>

谓词必须对该列表中的所有元素成立,函数才能返回 true

predicate

ANY

对给定列表中的所有项目进行测试的谓词。

返回值

BOOLEAN

注意事项

如果 listnull,或者如果 predicate 针对至少一个元素评估为 null 并且没有针对任何其他元素评估为 true,则返回 null

示例 8. single()
查询
MATCH p = (n)-->(b)
WHERE
  n.name = 'Keanu Reeves'
  AND single(x IN nodes(p) WHERE x.nationality = 'Northern Irish')
RETURN p

在每个返回的路径中,恰好有一个节点具有 nationality 属性值 Northern Irish

结果
p

(:Person {nationality: "Canadian",name: "Keanu Reeves",age: 58})-[:KNOWS]→(:Person {nationality: "Northern Irish",name: "Liam Neeson",age: 70})

行数:1