谓词函数
示例图
以下图表用于下方的示例
要重新创建它,请在空的 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 {since: 1999}]->(carrie),
(keanu)-[:KNOWS {since: 2005}]->(liam),
(keanu)-[:KNOWS {since: 2010}]->(kathryn),
(kathryn)-[:KNOWS {since: 2012}]->(jessica),
(carrie)-[:KNOWS {since: 2008}]->(guy),
(liam)-[:KNOWS {since: 2009}]->(guy),
(keanu)-[:ACTED_IN]->(theMatrix),
(carrie)-[:ACTED_IN]->(theMatrix)
all()
语法 |
|
||
描述 |
如果谓词对给定 |
||
参数 |
名称 |
类型 |
描述 |
|
|
可在 |
|
|
|
此列表中的所有元素都必须满足谓词,函数才会返回 |
|
|
|
针对给定列表中所有项进行测试的谓词。 |
|
返回 |
|
||
|
如果 |
如果 |
MATCH p = (a:Person {name: 'Keanu Reeves'})-[]-{2,}()
WHERE all(x IN nodes(p) WHERE x.age < 60)
RETURN [n IN nodes(p) | n.name] AS actorsList
返回路径中的所有节点,其 age 属性均低于 60
| actorsList |
|---|
|
行:2 |
LIST 使用 all()WITH [] as emptyList
RETURN all(i in emptyList WHERE true) as allTrue, all(i in emptyList WHERE false) as allFalse
| allTrue | allFalse |
|---|---|
|
|
行:1 |
|
allReduce()仅 Cypher 252025.08 引入
语法 |
|
||
描述 |
如果在给定 |
||
参数 |
名称 |
类型 |
描述 |
|
|
一个变量,在列表迭代时保存 |
|
|
|
首次执行 |
|
|
|
迭代期间保存 |
|
|
|
正在迭代的列表。 |
|
|
|
一个表达式,其返回值将成为 |
|
|
|
在每次迭代中评估的谓词。它可以访问 |
|
返回 |
|
||
|
如果 |
如果 |
如果 |
如果 |
以下查询查找长度为 3 的 KNOWS 路径,其中 accumulator 以第一个节点的 age 开始,且路径中所有节点的累计 age 值从未超过 230。不满足此要求的路径将被排除,例如序列为 ["Keanu Reeves (58)", "Carrie Anne Moss (55)", "Guy Pearce (55)", "Liam Neeson (70)"] 的路径,其累计 age 值为 238。
MATCH (s) (()-[:KNOWS]-(n)){3}
WHERE allReduce(
acc = s.age,
node IN n | acc + node.age,
acc < 230
)
RETURN [i IN [s] + n | i.name || " (" + toString(i.age) || ")"] AS ageSequence,
reduce(acc = 0, node IN [s] + n | acc + node.age) AS aggregatedAges
ORDER BY aggregatedAges
| ageSequence | aggregatedAges |
|---|---|
|
|
|
|
行:2 |
|
下一个查询使用 allReduce() 比较相邻关系。它查找长度至少为 3 的 KNOWS 路径,其中每个关系的 since 值都大于前一个值且高于 2000。
MATCH path = ()-[r:KNOWS]-{3,}()
WHERE allReduce(
span = {},
rel IN r | { previous: span.current, current: rel.since },
(span.previous IS NULL OR span.previous < span.current) AND span.current > 2000
)
LET people = nodes(path)
RETURN [actor IN people | actor.name] AS connectedActors,
[rel IN r | rel.since] AS sinceYears
ORDER BY sinceYears
| connectedActors | sinceYears |
|---|---|
|
|
行:1 |
|
any()
语法 |
|
||
描述 |
如果谓词对给定 |
||
参数 |
名称 |
类型 |
描述 |
|
|
可在 |
|
|
|
此列表中的所有元素都必须满足谓词,函数才会返回 |
|
|
|
针对给定列表中所有项进行测试的谓词。 |
|
返回 |
|
||
|
如果 |
如果 |
MATCH p = (n:Person {name: 'Keanu Reeves'})-[:KNOWS]-{3}()
WHERE any(rel IN relationships(p) WHERE rel.since < 2000)
RETURN [person IN nodes(p) | person.name] AS connectedActors,
[rel IN relationships(p) | rel.since] AS sinceYears
| connectedActors | sinceYears |
|---|---|
|
|
行:1 |
|
LIST 使用 any()WITH [] as emptyList
RETURN any(i IN emptyList WHERE true) as anyTrue, any(i IN emptyList WHERE false) as anyFalse
| anyTrue | anyFalse |
|---|---|
|
|
行:1 |
|
exists()
语法 |
|
||
描述 |
如果图中存在与模式的匹配项,则返回 true。 |
||
参数 |
名称 |
类型 |
描述 |
|
|
要验证其存在的模式。 |
|
返回 |
|
||
如果 |
|
要检查属性是否不为 |
MATCH (p:Person)
RETURN p.name AS name,
exists((p)-[:ACTED_IN]->()) AS has_acted_in_rel
此查询返回每个 Person 节点的 name 属性,以及一个布尔值(true 或 false),指示这些节点在图中是否具有 ACTED_IN 关系。
| 名称 (name) | has_acted_in_rel |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行数: 6 |
|
|
有关比 |
isEmpty()
语法 |
|
||
描述 |
检查 |
||
参数 |
名称 |
类型 |
描述 |
|
|
要检查是否为空的值。 |
|
返回 |
|
||
MATCH (p:Person)
WHERE NOT isEmpty(p.nationality)
RETURN p.name, p.nationality
此查询返回图中设置了 nationality 属性值的每个 Person 节点(即除 Jessica Chastain 之外的所有 Person 节点)
| p.name | p.nationality |
|---|---|
|
|
|
|
|
|
|
|
|
|
行:5 |
|
MATCH (n)
WHERE isEmpty(properties(n))
RETURN n
因为示例图中不包含空节点,所以没有返回任何内容
(no changes, no records)
MATCH (p:Person)
WHERE isEmpty(p.address)
RETURN p.name AS name
返回每个具有空 STRING address 属性的节点的 name 属性
| 名称 (name) |
|---|
|
行:1 |
|
|
none()
语法 |
|
||
描述 |
如果谓词对给定 |
||
参数 |
名称 |
类型 |
描述 |
|
|
可在 |
|
|
|
此列表中的所有元素都必须满足谓词,函数才会返回 |
|
|
|
针对给定列表中所有项进行测试的谓词。 |
|
返回 |
|
||
|
如果 |
如果 |
MATCH p = (n:Person {name: 'Keanu Reeves'})-[]-{2}()
WHERE none(x IN nodes(p) WHERE x.age > 60)
RETURN [x IN nodes(p) | x.name] AS connectedActors
返回路径中的所有节点,其 age 属性均不大于 60
| connectedActors |
|---|
|
行:1 |
LIST 使用 none()WITH [] as emptyList
RETURN none(i IN emptyList WHERE true) as noneTrue, none(i IN emptyList WHERE false) as noneFalse
| noneTrue | noneFalse |
|---|---|
|
|
行:1 |
|
single()
语法 |
|
||
描述 |
如果谓词对给定 |
||
参数 |
名称 |
类型 |
描述 |
|
|
可在 |
|
|
|
此列表中的所有元素都必须满足谓词,函数才会返回 |
|
|
|
针对给定列表中所有项进行测试的谓词。 |
|
返回 |
|
||
|
如果 |
如果 |
MATCH p = (n:Person {name: 'Keanu Reeves'})-[:KNOWS]-+(b)
WHERE single(x IN [b] WHERE x.nationality = 'Northern Irish')
RETURN [person IN nodes(p) | person.name + " (" + person.nationality + ")"] AS northernIrishPaths
ORDER BY length(p)
| northernIrishPaths |
|---|
|
|
行:2 |
LIST 使用 single()WITH [] as emptyList
RETURN single(i IN emptyList WHERE true) as singleTrue, single(i IN emptyList WHERE false) as singleFalse
| singleTrue | singleFalse |
|---|---|
|
|
行:1 |
|