列表运算符

列表运算符用于对 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
结果
名称 (name) role(角色)

"Alice"

"项目经理"

"Cecil"

"Software developer"

"Cecilia"

"Software developer"

行: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
结果
名称 (name) role(角色)

"Cecil"

"Software developer"

"Cecilia"

"Software developer"

"Eskil"

"首席执行官"

行: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)。

结果
名称 (name) role(角色)

"Cecilia"

"Software developer"

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

null 上使用 IN 运算符
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