映射表达式

映射表达式允许您在 Cypher® 中操作和查询 MAP 值。

keys() 函数可用于返回 MAP 中所有键的 LIST

示例图

以下图用于下面的示例

values and types maps graph

要重新创建图,请在空的 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

10

30

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

10

200

行数:1

节点和关系属性以键值对的形式存储在 MAP 中。因此,可以使用 . 运算符静态访问属性。

静态访问节点属性
MATCH (p:Person)
RETURN p AS nodePropertyMaps,
       p.name AS accessedMapValue
结果
nodePropertyMaps accessedMapValue

(:Person {nationality: "Canadian", name: "Keanu Reeves"})

"Keanu Reeves"

(:Person {name: "Carrie-Anne Moss"})

"Carrie-Anne Moss"

行数:2

动态访问 MAP

要动态访问 MAP 值,请使用下标运算符 []。键可以由变量或参数提供。

使用变量动态访问 MAP
WITH {a: 10, b: 20, c: 30} AS map,
     'a' AS dynamicKey
RETURN map[dynamicKey] AS dynamicValue
结果
dynamicValue

10

行数:1

参数
{
  "dynamicKey" : "a"
}
使用参数动态访问 MAP
WITH {a: 10, b: 20, c: 30} AS map
RETURN map[$dynamicKey] AS dynamicValue
结果
dynamicValue

10

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

300

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

[10, 30]

行数:1

动态访问节点属性值
MATCH (p:Person)
WITH p, 'name' AS dynamicValue
RETURN p[dynamicValue] AS names
结果
names

"Keanu Reeves"

"Carrie-Anne Moss"

行数:2

使用 [] 运算符引用 MAP 中不存在的键将返回 null

动态引用不存在的 MAP
WITH {a: 10, b: 20, c: 30} AS map,
     'z' AS dynamicKey
RETURN map[dynamicKey] AS dynamicValue
结果
dynamicValue

null

行数:1

映射投影

Cypher 支持映射投影,它允许从节点、关系和其他 MAP 值创建 MAP 值。

映射投影以绑定到要投影的 MAP 的变量开头,并包含由逗号分隔的 MAP 键的主体,用花括号 {} 括起来。每个映射元素指定一个键值对,该键值对包含在生成的映射投影中。

语法
mapVariable {mapElement [, ...n]}

mapElement 可以是以下之一

  • 一个键选择器,它引用 MAP 中的一个键并拉取相应的值。

  • 一个字面量条目,它使用自定义键值对,其中指定了键并使用表达式定义了值。

  • 一个变量选择器,它投影变量的值,使用变量名作为键,并将其引用的值作为值。

  • 一个全映射投影,它从 mapVariable 投影所有键值对。

映射中的键名必须是 STRING 类型。
如果 mapVariablenull,则投影结果为 null
示例 1. 带键选择器的映射投影

带键选择器的映射投影在您需要从 MAP 中提取特定键值对时很有用。

基本示例
WITH {a: 10, b: 20, c: 30} AS map
RETURN map{.a, .c} AS projectedMap
结果
projectedMap

{a: 10, c: 30}

行数:1

在下面的查询中,使用带有属性选择器的映射投影来collect每部电影的 titlerelease 年份。

带键选择器的映射投影
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
RETURN p.name AS actor, collect(m{.title, .released}) AS movies
结果
actor movies

"Keanu Reeves"

[{title: "The Matrix Resurrections", released: 2021}, {title: "The Matrix Revolutions", released: 2003}, {title: "The Matrix Reloaded", released: 2003}, {title: "The Matrix", released: 1999}, {title: "The Devils Advocate", released: 1997}]

"Carrie-Anne Moss"

[{title: "The Matrix Resurrections", released: 2021}, {title: "The Matrix Revolutions", released: 2003}, {title: "The Matrix Reloaded", released: 2003}, {title: "The Matrix", released: 1999}]

行数:2

示例 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

{a: 10, valueSum: 60}

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

{name: "Keanu Reeves", totalMovies: 5}

行数:1

示例 3. 带变量选择器的映射投影

带变量选择器的映射投影在您想要根据变量名投影值时很有用。

基本示例
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

{name: "Keanu Reeves", birthPlace: "Beirut, Lebanon", dob: 1964-09-02}

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

{name: "Keanu Reeves", totalMovies: 5}

{name: "Carrie-Anne Moss", totalMovies: 4}

行数:2

示例 4. 带全映射投影的映射投影

带全映射投影的映射投影在您想要投影 MAP 中的所有键值对而无需明确列出它们时很有用。

基本示例
WITH {a: 10, b: 20, c: 30} AS map
RETURN map{.*} AS projectedMap
结果
projectedMap

{a: 10, b: 20, c: 30}

行数:1

下面的查询返回 Keanu Reeves 节点的所有属性。使用全映射选择器来投影所有节点属性。

带全映射选择器的映射投影
MATCH (keanu:Person {name: 'Keanu Reeves'})
RETURN keanu{.*} AS allKeanuProperties
结果
AllKeanuProperties

{nationality: "Canadian", name: "Keanu Reeves"}

行数:1

© . All rights reserved.