谓词函数

简介

谓词是布尔函数,对于给定的一组非 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。

参数

名称

类型

描述

变量

ANY

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

列表

LIST<ANY>

此列表中的所有元素都必须使谓词成立,函数才会返回 true

谓词

ANY

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

返回

BOOLEAN

注意事项

all() 与大多数 Cypher® 函数不同,因为它会遍历列表,对每个元素评估一个表达式,而不是从单个评估中返回结果。

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

如果 list 为空,则 all() 返回 true,因为没有元素可以使 predicate 为 false。

示例 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

对空 LISTall()
WITH [] as emptyList
RETURN all(i in emptyList WHERE true) as allTrue, all(i in emptyList WHERE false) as allFalse
结果
allTrue allFalse

TRUE

TRUE

行数:1

any()

详细信息

语法

any(variable IN list WHERE predicate)

描述

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

参数

名称

类型

描述

变量

ANY

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

列表

LIST<ANY>

此列表中的所有元素都必须使谓词成立,函数才会返回 true

谓词

ANY

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

返回

BOOLEAN

注意事项

any() 与大多数 Cypher 函数不同,因为它会遍历列表,对每个元素评估一个表达式,而不是从单个评估中返回结果。

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

如果 list 为空,则 any() 返回 false,因为没有元素可以满足 predicate

示例 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

对空 LISTany()
WITH [] as emptyList
RETURN any(i IN emptyList WHERE true) as anyTrue, any(i IN emptyList WHERE false) as anyFalse
结果
anyTrue anyFalse

false

false

行数:1

exists()

详细信息

语法

exists(input)

描述

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

参数

名称

类型

描述

输入

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> 是否为空。

参数

名称

类型

描述

输入

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

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

none()

详细信息

语法

none(variable IN list WHERE predicate)

描述

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

参数

名称

类型

描述

变量

ANY

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

列表

LIST<ANY>

此列表中的所有元素都必须使谓词成立,函数才会返回 true

谓词

ANY

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

返回

BOOLEAN

注意事项

none() 与大多数 Cypher 函数不同,因为它会遍历列表,对每个元素评估一个表达式,而不是从单个评估中返回结果。

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

如果 list 为空,则 none() 返回 true,因为没有元素可以违反 predicate

示例 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: "American",name: "Carrie Anne Moss",age: 55})

(: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

对空 LISTnone()
WITH [] as emptyList
RETURN none(i IN emptyList WHERE true) as noneTrue, none(i IN emptyList WHERE false) as noneFalse
结果
noneTrue noneFalse

TRUE

TRUE

行数:1

single()

详细信息

语法

single(variable IN list WHERE predicate)

描述

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

参数

名称

类型

描述

变量

ANY

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

列表

LIST<ANY>

此列表中的所有元素都必须使谓词成立,函数才会返回 true

谓词

ANY

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

返回

BOOLEAN

注意事项

single() 与大多数 Cypher 函数不同,因为它会遍历列表,对每个元素评估一个表达式,而不是从单个评估中返回结果。

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

如果 list 为空,则 single() 返回 false,因为没有恰好一个元素满足 predicate

示例 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

对空 LISTsingle()
WITH [] as emptyList
RETURN single(i IN emptyList WHERE true) as singleTrue, single(i IN emptyList WHERE false) as singleFalse
结果
singleTrue singleFalse

false

false

行数:1

© . All rights reserved.