标签表达式谓词
您可以使用标签表达式谓词来验证节点标签或关系类型是否匹配给定的标签表达式。
语法
<expr>:<label-expression>
其中 <expr> 是任何 Cypher® 表达式,而 <label-expression> 是任何 Cypher 标签表达式。
示例图
本页示例使用以下图表
要重新创建该图,请在空的 Neo4j 数据库中运行以下查询
CREATE (alice:Person&Manager {name:'Alice', age: 65, skills: ['Java', 'Python']}),
(cecil:Person&Developer {name: 'Cecil', age: 25, skills: ['Java', 'Python']}),
(cecilia:Person&Developer {name: 'Cecilia', age: 31, skills: ['JavaScript', 'TypeScript']}),
(charlie:Person&Engineer {name: 'Charlie', age: 61, skills: ['C++', 'Python']}),
(daniel:Person&Director {name: 'Daniel', age: 39, skills: ['JavaScript', 'Slides']}),
(eskil:Person&CEO {name: 'Eskil', age: 39, skills: ['Slides', 'ChatGPT']}),
(cecil)-[:WORKS_FOR]->(alice),
(cecilia)-[:WORKS_FOR]->(alice),
(charlie)-[:WORKS_FOR]->(daniel),
(alice)-[:REPORTS_TO]->(daniel),
(daniel)-[:REPORTS_TO]->(eskil)
测试节点是否具有特定标签
假设 p 是一个节点,p:Manager 将测试 p 是否具有 Manager 标签,并相应地返回 true 或 false。
MATCH (p:Person)
RETURN p.name AS name, p:Manager AS isManager
| 名称 (name) | isManager |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行数: 6 |
|
假设 p 是一个节点,且有一个更复杂的 标签表达式(例如 Manager|Director|CEO),p:Manager|Director|CEO 将测试节点 p 是否匹配标签表达式 Manager|Director|CEO,并相应地返回 true 或 false。具体而言,p:Manager|Director|CEO 会测试 p 是否至少具有 Manager、Director 和 CEO 这三个标签中的一个。
MATCH (p:Person)
RETURN p.name AS name,
p:Manager|Director|CEO AS isManager
| 名称 (name) | isManager |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行数: 6 |
|
p:!CEO 测试 p 是否不具有 CEO 标签。
MATCH (p:Person)-[r]->(m)
RETURN p.name AS name,
m:!CEO AS doesNotWorkDirectlyForTheCEO
| 名称 (name) | doesNotWorkDirectlyForTheCEO |
|---|---|
|
|
|
|
|
|
|
|
|
|
行:5 |
|
当 <exp> 的结果为 null 时,标签表达式谓词的结果也为 null;例如,如果 p 为 null,则 p:!CEO 的结果为 null。
MATCH (p:Person)
OPTIONAL MATCH (p)-[r]->(m)
RETURN p.name AS name,
m:!CEO AS doesNotWorkDirectlyForTheCEO
| 名称 (name) | doesNotWorkDirectlyForTheCEO |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行数: 6 |
|
coalesce 函数可以将 null 转换为默认值。
MATCH (p:Person)
OPTIONAL MATCH (p)-[r]->(m)
RETURN p.name AS name,
coalesce(m:!CEO, false) AS doesNotWorkDirectlyForTheCEO
| 名称 (name) | doesNotWorkDirectlyForTheCEO |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行数: 6 |
|
测试节点是否匹配动态标签表达式仅限 Cypher 25引入于 Neo4j 2025.07
如果您不知道管理器标签,可以通过从拥有直接下属的人员处收集所有非 Person 标签来推断出一个 managerLabels 列表。您可以使用标签表达式谓词来匹配 动态标签表达式。p:$any(managerLabels) 将测试节点 p 是否具有列表 managerLabels 中的至少一个标签。
MATCH ()-[r]->(p:Person)
UNWIND labels(p) AS label
FILTER label <> "Person"
RETURN COLLECT(label) AS managerLabels
NEXT
MATCH (p)
RETURN p.name AS name, p:$any(managerLabels) AS isManager
| 名称 (name) | isManager |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行数: 6 |
|
测试关系是否具有特定关系类型
假设 r 是一个关系,r:WORKS_FOR 将测试 r 是否具有 WORKS_FOR 关系类型,并相应地返回 true 或 false。
MATCH (p:Person)-[r]->()
RETURN p.name AS name,
r:WORKS_FOR AS isNotManager
| 名称 (name) | isNotManager |
|---|---|
|
|
|
|
|
|
|
|
|
|
行:5 |
|
如果 r 为 null,则标签表达式谓词(例如 r:WORKS_FOR|REPORTS_TO)的结果为 null。coalesce 函数可以将 null 转换为默认值。
MATCH (p:Person)
OPTIONAL MATCH ()-[r]->(p)
RETURN DISTINCT
p.name AS name,
coalesce(r:WORKS_FOR|REPORTS_TO, false) AS hasReports
| 名称 (name) | hasReports |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
行数: 6 |
|