列表

Cypher® 包含对列表的全面支持。本节首先描述一般列表,然后讨论如何在列表中使用列表推导和模式推导。

有关运算符的信息,例如列表连接 (+)、元素存在检查 (IN) 和访问 ([]),请参见此处IN[] 运算符相对于 null 的行为在此处详细说明。

一般列表

文字列表是通过使用方括号并在列表中的元素之间用逗号分隔来创建的。

查询
RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list
表 1. 结果
列表

[0,1,2,3,4,5,6,7,8,9]

行:1

列表可以包含不同的值类型。

查询
RETURN [0, "hello", 3.14, null] AS list
表 2. 结果
列表

[0, "hello", 3.14, null]

行:1

Cypher 中的列表索引从 0 开始。要访问列表中的各个元素,请使用方括号。这将从起始索引提取到(但不包括)结束索引。

例如

查询
WITH [5,1,7] AS list
RETURN list[2]
表 3. 结果
list[2]

7

行:1

列表范围和大小

以下示例使用range 函数创建列表。此函数返回一个包含给定起始数字和结束数字之间所有数字的列表。范围在两端都是包含的。

查询
RETURN range(0, 10)[3] AS element
表 4. 结果
元素

3

行:1

也可以使用负数,从列表的末尾开始。

查询
RETURN range(0, 10)[-3] AS element
表 5. 结果
元素

8

行:1

最后,可以在括号内使用范围来返回列表的范围。列表范围运算符 ([]) 包含第一个值,但不包括最后一个值。

查询
RETURN range(0, 10)[0..3] AS list
表 6. 结果
列表

[0,1,2]

行:1

查询
RETURN range(0, 10)[0..-5] AS list
表 7. 结果
列表

[0,1,2,3,4,5]

行:1

查询
RETURN range(0, 10)[-5..] AS list
表 8. 结果
列表

[6,7,8,9,10]

行:1

查询
RETURN range(0, 10)[..4] AS list
表 9. 结果
列表

[0,1,2,3]

行:1

超出范围的切片将简单地被截断,但超出范围的单个元素将返回 null

查询
RETURN range(0, 10)[15] AS list
表 10. 结果
列表

<null>

行:1

查询
RETURN range(0, 10)[5..15] AS list
表 11. 结果
列表

[5,6,7,8,9,10]

行:1

可以按如下方式获取列表的size

查询
RETURN size(range(0, 10)[0..3]) AS list
表 12. 结果
列表

3

行:1

模式推导

模式推导是 Cypher 中可用的语法结构,用于根据模式匹配创建列表。模式推导像正常的 MATCH 子句一样匹配指定的模式,像正常的 WHERE 子句一样使用谓词,但会生成指定的自定义投影。

示例图

以下图用于下面的示例

values and types lists graph

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

CREATE
  (keanu:Person {name: 'Keanu Reeves'}),
  (johnnyMnemonic:Movie {title: 'Johnny Mnemonic', released: 1995}),
  (theMatrixRevolutions:Movie {title: 'The Matrix Revolutions', released: 2003}),
  (theMatrixReloaded:Movie {title: 'The Matrix Reloaded', released: 2003}),
  (theReplacements:Movie {title: 'The Replacements', released: 2000}),
  (theMatrix:Movie {title: 'The Matrix', released: 1999}),
  (theDevilsAdvocate:Movie {title: 'The Devils Advocate', released: 1997}),
  (theMatrixResurrections:Movie {title: 'The Matrix Resurrections', released: 2021}),
  (keanu)-[:ACTED_IN]->(johnnyMnemonic),
  (keanu)-[:ACTED_IN]->(theMatrixRevolutions),
  (keanu)-[:ACTED_IN]->(theMatrixReloaded),
  (keanu)-[:ACTED_IN]->(theReplacements),
  (keanu)-[:ACTED_IN]->(theMatrix),
  (keanu)-[:ACTED_IN]->(theDevilsAdvocate),
  (keanu)-[:ACTED_IN]->(theMatrixResurrections)

示例

此示例返回一个包含电影发行年份的列表。模式推导中的模式匹配查找电影标题中的 Matrix,以及节点 keanu(名为 Keanu ReevesPerson 节点)与电影之间的关系。

查询
MATCH (keanu:Person {name: 'Keanu Reeves'})
RETURN [(keanu)-->(b:Movie) WHERE b.title CONTAINS 'Matrix' | b.released] AS years
表 13. 结果
年份

[2021,2003,2003,1999]

行:1

整个谓词(包括 WHERE 关键字)是可选的,可以省略。

将列表存储为属性

可以将简单值的同构列表存储为属性。例如,以下查询从连接到 Keanu ReevesMovie 节点的 title 属性创建列表。然后将该列表设置为 Keanu Reeves 上的 resume 属性。

查询
MATCH (keanu:Person {name: 'Keanu Reeves'})
WITH keanu,[(keanu)-->(b:Movie) | b.title] AS movieTitles
SET keanu.resume = movieTitles
RETURN keanu.resume
表 14. 结果
keanu.resume

["The Matrix Resurrections", "The Devils Advocate", "The Matrix", "The Replacements", "The Matrix Reloaded", "The Matrix Revolutions", "Johnny Mnemonic"]

行:1

但是,无法将异构列表存储为属性。例如,以下查询尝试将包含 titlereleased 属性的列表设置为 Keanu Reevesresume 属性将失败。这是因为 title 属性值存储为 STRING 值,而 released 属性值存储为 INTEGER 值。

查询
MATCH (keanu:Person {name: 'Keanu Reeves'})
WITH keanu,[(keanu)-->(b:Movie) | b.title]  + [(keanu)-->(b:Movie) | b.released] AS movieTitles
SET keanu.resume = movieTitles
RETURN keanu.resume
Neo4j only supports a subset of Cypher types for storage as singleton or array properties. Please refer to section cypher/syntax/values of the manual for more details.

列表推导

列表推导是 Cypher 中可用的语法结构,用于根据现有列表创建列表。

例如,以下查询从之前创建的 Keanu Reevesresume 属性(字符串列表)返回一个新列表

查询
MATCH (keanu:Person {name:'Keanu Reeves'})
RETURN [x IN keanu.resume WHERE x contains 'The Matrix'] AS matrixList
表 15. 结果
matrixList

["The Matrix Resurrections", "The Matrix", "The Matrix Reloaded", "The Matrix Revolutions"]

行:1

列表推导遵循数学集合构建器表示法(集合推导)的形式,而不是使用映射和过滤函数。

查询
RETURN [x IN range(0,10) WHERE x % 2 = 0 | x^3 ] AS result
表 16. 结果
结果

[0.0,8.0,64.0,216.0,512.0,1000.0]

行:1

如果只需要过滤或映射,则可以省略 WHERE 部分或表达式。

查询
RETURN [x IN range(0,10) WHERE x % 2 = 0 ] AS result
表 17. 结果
结果

[0,2,4,6,8,10]

行:1

查询
RETURN [x IN range(0,10) | x^3 ] AS result
表 18. 结果
结果

[0.0,1.0,8.0,27.0,64.0,125.0,216.0,343.0,512.0,729.0,1000.0]

行:1