地图

Cypher® 支持构建地图。本节首先讨论字面量地图,然后介绍地图投影。

有关属性访问运算符(如 .[])的信息,请参阅 此处[] 运算符在 null 方面的行为,请参阅 此处

字面量地图

地图中的键名称必须是字面量。如果通过 HTTP API 调用 返回,则将返回一个 JSON 对象。如果在 Java 中返回,则将返回 java.util.Map<String,Object> 类型的对象。

查询
RETURN {key: 'Value', listKey: [{inner: 'Map1'}, {inner: 'Map2'}]} AS map
表 1. 结果
map

{'listKey': [{'inner': 'Map1'}, {'inner': 'Map2'}], 'key': 'Value'}

行数:1

地图投影

Cypher 支持地图投影,它允许从节点、关系和其他地图值构建地图投影。

地图投影以绑定到要从中投影的图形实体的变量开头,并包含由 {} 括起来的逗号分隔的地图元素主体。

地图投影
map_variable {map_element, [, ...n]}

地图元素将一个或多个键值对投影到地图投影。存在四种不同类型的地图投影元素

  • 属性选择器 - 将属性名称作为键投影,并将 map_variable 中的值作为投影的值。

  • 字面量条目 - 这是一个键值对,其中值是任意表达式 key: <expression>

  • 变量选择器 - 投影变量,变量名称作为键,变量指向的值作为投影的值。其语法只是变量。

  • 所有属性选择器 - 投影 map_variable 值中的所有键值对。

以下条件适用

  • 如果 map_variable 指向 null 值,则整个地图投影将计算为 null

  • 地图中的键名称必须是 STRING 类型。

示例图

以下图用于下面的示例

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)

示例

以下查询查找 Keanu Reeves 节点以及他出演的电影。它是一个带有字面量条目的地图投影的示例,该条目反过来还在聚合 collect() 函数内部使用地图投影。

查询
MATCH (keanu:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(movie:Movie)
WITH keanu, collect(movie{.title, .released}) AS movies
RETURN keanu{.name, movies: movies}
表 2. 结果
keanu

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

行数:1

以下查询查找图中所有具有一个或多个类型为 ACTED_IN 的关系的 Person 节点,这些关系连接到 Movie 节点。它使用 count() 函数来计算以这种方式连接到每个 Person 节点的 Movie 节点的数量,并使用变量选择器来投影计数的值。

查询
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
WITH actor, count(movie) AS numberOfMovies
RETURN actor{.name, numberOfMovies}
表 3. 结果
actor

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

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

行数:2

以下查询返回 Keanu Reeves 节点中的所有属性。使用所有属性选择器来投影所有节点属性,并另外显式投影属性 age。由于此属性在 Keanu Reeves 节点上不存在,因此会改为投影 null 值。

查询
MATCH (keanu:Person {name: 'Keanu Reeves'})
RETURN keanu{.*, .age}
表 4. 结果
keanu

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

行数:1

以下查询是使用 . 运算符静态访问单个地图成员的示例

查询
WITH {age: 58, profession: 'Actor'} as keanuStats
RETURN keanuStats.profession AS profession
表 5. 结果
profession

"Actor"

行数:1