映射表达式
示例图
以下图用于下面的示例
要重新创建图,请在空的 Neo4j 数据库上运行以下查询
CREATE (keanu:Person {name: 'Keanu Reeves', nationality: 'Canadian'}),
(carrieAnne:Person {name: 'Carrie-Anne Moss'}),
(theMatrixRevolutions:Movie {title: 'The Matrix Revolutions', released: 2003}),
(theMatrixReloaded:Movie {title: 'The Matrix Reloaded', released: 2003}),
(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]->(theMatrix),
(keanu)-[:ACTED_IN]->(theMatrixRevolutions),
(keanu)-[:ACTED_IN]->(theMatrixReloaded),
(keanu)-[:ACTED_IN]->(theMatrixResurrections),
(keanu)-[:ACTED_IN]->(theDevilsAdvocate),
(carrieAnne)-[:ACTED_IN]->(theMatrix),
(carrieAnne)-[:ACTED_IN]->(theMatrixRevolutions),
(carrieAnne)-[:ACTED_IN]->(theMatrixReloaded),
(carrieAnne)-[:ACTED_IN]->(theMatrixResurrections)
映射运算符
Cypher 包含两个映射运算符
-
通过键静态访问值:点运算符 (
.
)。 -
通过键动态访问值:下标运算符 (
[]
)。
静态访问 MAP
值
可以通过在 .
运算符后指定键来静态访问 MAP
值。
MAP
值访问WITH {a: 10, b: 20, c: 30} AS map
RETURN map.a AS firstValue,
map.c AS lastValue
firstValue | lastValue |
---|---|
|
|
行数:1 |
要静态访问嵌套 MAP
中的值,请使用链式 .
运算符。每个 .
运算符深入一层嵌套结构。
MAP
值WITH {a: 10, b: 20, c: 30, innerMap: {x: 100, y: 200, z: 300}} AS map
RETURN map.a AS firstOuterValue,
map.innerMap.y AS secondInnerValue
firstOuterValue | secondInnerValue |
---|---|
|
|
行数:1 |
节点和关系属性以键值对的形式存储在 MAP
中。因此,可以使用 .
运算符静态访问属性。
MATCH (p:Person)
RETURN p AS nodePropertyMaps,
p.name AS accessedMapValue
nodePropertyMaps | accessedMapValue |
---|---|
|
|
|
|
行数:2 |
动态访问 MAP
值
要动态访问 MAP
值,请使用下标运算符 []
。键可以由变量或参数提供。
MAP
值WITH {a: 10, b: 20, c: 30} AS map,
'a' AS dynamicKey
RETURN map[dynamicKey] AS dynamicValue
dynamicValue |
---|
|
行数:1 |
{
"dynamicKey" : "a"
}
MAP
值WITH {a: 10, b: 20, c: 30} AS map
RETURN map[$dynamicKey] AS dynamicValue
dynamicValue |
---|
|
行数:1 |
MAP
值WITH {a: 10, b: 20, c: 30, innerMap: {x: 100, y: 200, z: 300}} AS map,
'z' AS dynamicInnerKey
RETURN map.innerMap[dynamicInnerKey] AS dynamicInnerValue
dynamicInnerValue |
---|
|
行数:1 |
可以使用列表推导式从 MAP
中动态访问多个值。此查询遍历 LIST
dynamicKeys
并从 map
中检索它们对应的键值。
MAP
值访问和列表推导式WITH {a: 10, b: 20, c: 30} AS map,
['a', 'c'] AS dynamicKeys
RETURN [key IN dynamicKeys | map[key]] AS dynamicValue
dynamicValue |
---|
|
行数:1 |
MATCH (p:Person)
WITH p, 'name' AS dynamicValue
RETURN p[dynamicValue] AS names
names |
---|
|
|
行数:2 |
使用 []
运算符引用 MAP
中不存在的键将返回 null
。
MAP
键WITH {a: 10, b: 20, c: 30} AS map,
'z' AS dynamicKey
RETURN map[dynamicKey] AS dynamicValue
dynamicValue |
---|
|
行数:1 |
映射投影
Cypher 支持映射投影,它允许从节点、关系和其他 MAP
值创建 MAP
值。
映射投影以绑定到要投影的 MAP
的变量开头,并包含由逗号分隔的 MAP
键的主体,用花括号 {}
括起来。每个映射元素指定一个键值对,该键值对包含在生成的映射投影中。
mapVariable {mapElement [, ...n]}
mapElement
可以是以下之一
-
一个键选择器,它引用
MAP
中的一个键并拉取相应的值。 -
一个字面量条目,它使用自定义键值对,其中指定了键并使用表达式定义了值。
-
一个变量选择器,它投影变量的值,使用变量名作为键,并将其引用的值作为值。
-
一个全映射投影,它从
mapVariable
投影所有键值对。
映射中的键名必须是 STRING 类型。如果 mapVariable 为 null ,则投影结果为 null 。 |
带键选择器的映射投影在您需要从 MAP
中提取特定键值对时很有用。
WITH {a: 10, b: 20, c: 30} AS map
RETURN map{.a, .c} AS projectedMap
projectedMap |
---|
|
行数:1 |
在下面的查询中,使用带有属性选择器的映射投影来collect
每部电影的 title
和 release
年份。
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
RETURN p.name AS actor, collect(m{.title, .released}) AS movies
actor | movies |
---|---|
|
|
|
|
行数:2 |
带字面量条目的映射投影在您想要向投影的 MAP
值添加自定义值而不修改原始数据结构时很有用。
WITH {a: 10, b: 20, c: 30} AS map
RETURN map{a: map.a, valueSum: map.a + map.b + map.c} AS projectedMap
projectedMap |
---|
|
行数:1 |
此查询使用带有字面量条目的映射投影,其中 size(movies)
表达式计算 Keanu Reeves
参演的电影总数。
MATCH (keanu:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(movie:Movie)
WITH keanu, collect(movie) AS movies
RETURN keanu {.name, totalMovies: size(movies)} AS keanuDetails
keanuDetails |
---|
|
行数:1 |
带变量选择器的映射投影在您想要根据变量名投影值时很有用。
MATCH (keanu:Person {name: 'Keanu Reeves'})
WITH keanu, date('1964-09-02') AS dob, 'Beirut, Lebanon' AS birthPlace
RETURN keanu{.name, dob, birthPlace} AS projectedKeanu
projectedKeanu |
---|
|
行数:1 |
下面的查询查找图中所有与 Movie
节点有一个或多个 ACTED_IN
类型关系连接的 Person
节点。它使用 count() 函数来计算每个 Person
节点以这种方式连接的 Movie
节点的数量,并使用变量选择器来投影计数的值。
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
WITH actor, count(movie) AS totalMovies
RETURN actor{totalMovies, .name} AS nameAndMovies
nameAndMovies |
---|
|
|
行数:2 |
带全映射投影的映射投影在您想要投影 MAP
中的所有键值对而无需明确列出它们时很有用。
WITH {a: 10, b: 20, c: 30} AS map
RETURN map{.*} AS projectedMap
projectedMap |
---|
|
行数:1 |
下面的查询返回 Keanu Reeves
节点的所有属性。使用全映射选择器来投影所有节点属性。
MATCH (keanu:Person {name: 'Keanu Reeves'})
RETURN keanu{.*} AS allKeanuProperties
AllKeanuProperties |
---|
|
行数:1 |