列表运算符

列表运算符用于对 LIST 值执行操作。Cypher® 包含以下列表运算符:

  • 成员关系:IN

有关其他列表谓词,请参阅:

示例图

以下图用于下面的示例。

predicate operators

要在空的 Neo4j 数据库中重新创建该图,请运行以下查询:

CREATE (alice:Person {name:'Alice', age: 65, role: 'Project manager', email: 'alice@company.com'}),
       (cecil:Person {name: 'Cecil', age: 25, role: 'Software developer', email: 'cecil@private.se'}),
       (cecilia:Person {name: 'Cecilia', age: 31, role: 'Software developer'}),
       (charlie:Person {name: 'Charlie', age: 61, role: 'Security engineer'}),
       (daniel:Person {name: 'Daniel', age: 39, role: 'Director', email: 'daniel@company.com'}),
       (eskil:Person {name: 'Eskil', age: 39, role: 'CEO', email: 'eskil@company.com'})

示例

示例 1. 基本 LIST 成员检查
IN 运算符
MATCH (n:Person)
WHERE n.role IN ['Software developer', 'Project manager']
RETURN n.name AS name, n.role AS role
结果
姓名 角色

"Alice"

"项目经理"

"Cecil"

"软件开发者"

"Cecilia"

"软件开发者"

行数:3

检查动态 LIST 中的成员关系
MATCH (p:Person)
WITH p, ['Software developer', 'CEO'] AS roles
WHERE p.role IN roles
RETURN p.name AS name, p.role AS role
结果
姓名 角色

"Cecil"

"软件开发者"

"Cecilia"

"软件开发者"

"Eskil"

"CEO"

行数:3

以下查询查找与 CecilEskil 共享 rolename 不同的 Person 节点。

多个 IN 运算符
WITH ['Cecil', 'Eskil'] AS names
MATCH (ce:Person)
WHERE ce.name IN names
WITH collect(ce.role) AS roles, names
MATCH (p:Person)
WHERE p.role IN roles AND NOT p.name IN names
RETURN p.name AS name, p.role AS role

只返回 Cecilia,因为她与 Cecil 共享一个 role (图中没有 Person 节点与 Eskil 共享 role)。

结果
姓名 角色

"Cecilia"

"软件开发者"

行数:1

示例 2. 检查包含重复值的 LIST 中的成员关系

LIST 中重复值的存在不影响 IN 运算符的结果,该运算符检查一个元素是否至少出现一次。例如,以下查询返回 true (有两个 Person 节点为 39 岁)。

检查包含重复值的 LIST 中的成员关系
MATCH (p:Person)
WITH collect(p.age) AS allAges
RETURN 39 IN allAges AS listWithDuplicates
结果
listWithDuplicates

true

行数:1

null 行为

null 参与成员关系检查时,结果将是 null

IN 运算符与 null 一起使用
RETURN null IN [1, 2, null] AS nullInList, 123 IN null AS valueInNull
结果
nullInList valueInNull

null

null

行数:1

要检查 null 是否是 LIST 的成员,请使用 any() 函数。

检查 null 是否是 LIST 的成员
RETURN any(x IN [1, 2, null] WHERE x IS NULL) AS containsNull
结果
containsNull

true

行数:1

嵌套列表

当与嵌套的 LIST 值一起使用时,IN 运算符评估一个 LIST 是否与作为外部 LIST 一部分的任何嵌套 LIST 值完全匹配。嵌套 LIST 中单个元素的部分匹配将返回 false

检查嵌套 LIST 值中的成员关系
RETURN [0, 2] IN [[1, 2], [3, 4]] AS listInNestedList
结果
listInNestedList

false

行数:1

检查嵌套 LIST 值中的成员关系
RETURN [3, 4] IN [[1, 2], [3, 4]] AS listInNestedList
结果
listInNestedList

true

行数:1

检查嵌套 LIST 值中的部分成员关系
RETURN [1] IN [[1, 2], [3, 4]] AS listInNestedTest
结果
listInNestedList

false

行数:1

列表子集

子集检查验证一个 LIST 的所有元素是否存在于另一个 LIST 中。all() 函数用于确保第一个 LIST 中的每个元素都在第二个 LIST 中找到。

子集检查
WITH [1,3,4] AS sub, [3,5,1,7,6,2,8,4] AS list
RETURN all(x IN sub WHERE x IN list) AS subInList

这将返回 true,因为 sub 中的所有元素都是 list 的一部分。

结果
subInList

true

行数:1

子集检查
WITH [1,3,9] AS sub, [3,5,1,7,6,2,8,4] AS list
RETURN all(x IN sub WHERE x IN list) AS subInList

这将返回 false,因为 sub 中的所有元素都不是 list 的一部分。

结果
subInList

false

行数:1