标签表达式谓词

您可以使用标签表达式谓词来验证节点标签或关系类型是否匹配给定的标签表达式。

语法

<expr>:<label-expression>

其中 <expr> 是任何 Cypher® 表达式,而 <label-expression> 是任何 Cypher 标签表达式

示例图

本页示例使用以下图表

label expression predicates graph

要重新创建该图,请在空的 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 标签,并相应地返回 truefalse

MATCH (p:Person)
RETURN p.name AS name, p:Manager AS isManager
名称 (name) isManager

"Alice"

true

"Cecil"

false

"Cecilia"

false

"Charlie"

false

"Daniel"

false

"Eskil"

false

行数: 6

假设 p 是一个节点,且有一个更复杂的 标签表达式(例如 Manager|Director|CEO),p:Manager|Director|CEO 将测试节点 p 是否匹配标签表达式 Manager|Director|CEO,并相应地返回 truefalse。具体而言,p:Manager|Director|CEO 会测试 p 是否至少具有 ManagerDirectorCEO 这三个标签中的一个。

MATCH (p:Person)
RETURN p.name AS name,
       p:Manager|Director|CEO AS isManager
名称 (name) isManager

"Alice"

true

"Cecil"

false

"Cecilia"

false

"Charlie"

false

"Daniel"

true

"Eskil"

true

行数: 6

p:!CEO 测试 p 是否不具有 CEO 标签。

MATCH (p:Person)-[r]->(m)
RETURN p.name AS name,
       m:!CEO AS doesNotWorkDirectlyForTheCEO
名称 (name) doesNotWorkDirectlyForTheCEO

"Alice"

true

"Cecil"

true

"Cecilia"

true

"Charlie"

true

"Daniel"

false

行:5

<exp> 的结果为 null 时,标签表达式谓词的结果也为 null;例如,如果 pnull,则 p:!CEO 的结果为 null

MATCH (p:Person)
OPTIONAL MATCH (p)-[r]->(m)
RETURN p.name AS name,
       m:!CEO AS doesNotWorkDirectlyForTheCEO
名称 (name) doesNotWorkDirectlyForTheCEO

"Alice"

true

"Cecil"

true

"Cecilia"

true

"Charlie"

true

"Daniel"

false

"Eskil"

null

行数: 6

coalesce 函数可以将 null 转换为默认值。

MATCH (p:Person)
OPTIONAL MATCH (p)-[r]->(m)
RETURN p.name AS name,
       coalesce(m:!CEO, false) AS doesNotWorkDirectlyForTheCEO
名称 (name) doesNotWorkDirectlyForTheCEO

"Alice"

true

"Cecil"

true

"Cecilia"

true

"Charlie"

true

"Daniel"

false

"Eskil"

false

行数: 6

测试节点是否匹配动态标签表达式

如果您不知道管理器标签,可以通过从拥有直接下属的人员处收集所有非 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

"Alice"

true

"Cecil"

false

"Cecilia"

false

"Charlie"

false

"Daniel"

true

"Eskil"

true

行数: 6

测试关系是否具有特定关系类型

假设 r 是一个关系,r:WORKS_FOR 将测试 r 是否具有 WORKS_FOR 关系类型,并相应地返回 truefalse

MATCH (p:Person)-[r]->()
RETURN p.name AS name,
       r:WORKS_FOR AS isNotManager
名称 (name) isNotManager

"Alice"

false

"Cecil"

true

"Cecilia"

true

"Charlie"

true

"Daniel"

false

行:5

如果 rnull,则标签表达式谓词(例如 r:WORKS_FOR|REPORTS_TO)的结果为 nullcoalesce 函数可以将 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

"Alice"

true

"Cecil"

false

"Cecilia"

false

"Charlie"

false

"Daniel"

true

"Eskil"

true

行数: 6