列表
一般列表
文字列表是通过使用方括号并在列表中的元素之间用逗号分隔来创建的。
RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list
列表 |
---|
|
行:1 |
列表可以包含不同的值类型。
RETURN [0, "hello", 3.14, null] AS list
列表 |
---|
|
行:1 |
Cypher 中的列表索引从 0 开始。要访问列表中的各个元素,请使用方括号。这将从起始索引提取到(但不包括)结束索引。
例如
WITH [5,1,7] AS list
RETURN list[2]
list[2] |
---|
|
行:1 |
列表范围和大小
以下示例使用range
函数创建列表。此函数返回一个包含给定起始数字和结束数字之间所有数字的列表。范围在两端都是包含的。
RETURN range(0, 10)[3] AS element
元素 |
---|
|
行:1 |
也可以使用负数,从列表的末尾开始。
RETURN range(0, 10)[-3] AS element
元素 |
---|
|
行:1 |
最后,可以在括号内使用范围来返回列表的范围。列表范围运算符 ([]
) 包含第一个值,但不包括最后一个值。
RETURN range(0, 10)[0..3] AS list
列表 |
---|
|
行:1 |
RETURN range(0, 10)[0..-5] AS list
列表 |
---|
|
行:1 |
RETURN range(0, 10)[-5..] AS list
列表 |
---|
|
行:1 |
RETURN range(0, 10)[..4] AS list
列表 |
---|
|
行:1 |
超出范围的切片将简单地被截断,但超出范围的单个元素将返回 null
。
RETURN range(0, 10)[15] AS list
列表 |
---|
|
行:1 |
RETURN range(0, 10)[5..15] AS list
列表 |
---|
|
行:1 |
可以按如下方式获取列表的size
RETURN size(range(0, 10)[0..3]) AS list
列表 |
---|
|
行:1 |
模式推导
模式推导是 Cypher 中可用的语法结构,用于根据模式匹配创建列表。模式推导像正常的 MATCH
子句一样匹配指定的模式,像正常的 WHERE
子句一样使用谓词,但会生成指定的自定义投影。
示例图
以下图用于下面的示例
要重新创建该图,请对空的 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 Reeves
的 Person
节点)与电影之间的关系。
MATCH (keanu:Person {name: 'Keanu Reeves'})
RETURN [(keanu)-->(b:Movie) WHERE b.title CONTAINS 'Matrix' | b.released] AS years
年份 |
---|
|
行:1 |
整个谓词(包括 WHERE
关键字)是可选的,可以省略。
将列表存储为属性
可以将简单值的同构列表存储为属性。例如,以下查询从连接到 Keanu Reeves
的 Movie
节点的 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
keanu.resume |
---|
|
行:1 |
但是,无法将异构列表存储为属性。例如,以下查询尝试将包含 title
和 released
属性的列表设置为 Keanu Reeves
的 resume
属性将失败。这是因为 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 Reeves
的 resume
属性(字符串列表)返回一个新列表
MATCH (keanu:Person {name:'Keanu Reeves'})
RETURN [x IN keanu.resume WHERE x contains 'The Matrix'] AS matrixList
matrixList |
---|
|
行:1 |
列表推导遵循数学集合构建器表示法(集合推导)的形式,而不是使用映射和过滤函数。
RETURN [x IN range(0,10) WHERE x % 2 = 0 | x^3 ] AS result
结果 |
---|
|
行:1 |
如果只需要过滤或映射,则可以省略 WHERE
部分或表达式。
RETURN [x IN range(0,10) WHERE x % 2 = 0 ] AS result
结果 |
---|
|
行:1 |
RETURN [x IN range(0,10) | x^3 ] AS result
结果 |
---|
|
行:1 |