语法-Map

Neo
Neo
2022-03-20 / 0 评论 / 70 阅读

本节内容源自Cypher官方手册V4.4版,笔者对其进行学习、翻译、记录。

本节介绍如何在 Cyphers 中使用Map。

下图用于以下示例:

image.png

Map

Cypher 支持 Map 的构建。映射中的键名必须是 String 类型。如果通过 HTTP API 调用返回,将返回一个 JSON 对象。如果在 Java 中返回,将返回一个java.util.Map<String,Object> 类型的对象。

RETURN {key: 'Value', listKey: [{inner: 'Map1'}, {inner: 'Map2'}]}
{key:'Value',listKey:[{inner:'Map1'},{inner:'Map2'}]}
{listKey -> [{inner -> "Map1"},{inner -> "Map2"}], key -> "Value"}

Map投影

Cypher 支持称为“Map投影”的概念。它允许从节点、关系和其他Map值轻松构建Map投影。

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

map_variable {map_element, [, ...n]}

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

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

  • 文字条目 - 这是一个键值对,其值为任意表达式key:

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

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

以下条件适用:

  • 如果map_variable指向一个null值,则整个Map投影将评估为null。

  • 映射中的键名必须是String类型。

Map投影示例

找到'Charlie Sheen'并返回关于他和他演过的电影的数据。

MATCH (actor:Person {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie:Movie)
RETURN actor{.name, .realName, movies: collect(movie{.title, .year})}
{movies -> [{year -> 1979, title -> "Apocalypse Now"},{year -> 1984, title -> "Red Dawn"},{year -> 1987, title -> "Wall Street"}], realName -> "Carlos Irwin Estévez", name -> "Charlie Sheen"}

找到所有在电影中表演过的人,并显示每个人的号码。这个例子引入了一个带有计数的变量,并使用一个变量选择器来投影该值。

MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
WITH actor, count(movie) AS nbrOfMovies
RETURN actor{.name, nbrOfMovies}
{nbrOfMovies -> 2, name -> "Martin Sheen"}
{nbrOfMovies -> 3, name -> "Charlie Sheen"}

再次关注'Charlie Sheen',这次从节点返回所有属性。在这里,我们使用 all-properties 选择器来投影所有节点属性,此外,还显式地投影age。由于该属性在节点上不存在,因此null会投影一个值。

MATCH (actor:Person {name: 'Charlie Sheen'})
RETURN actor{.*, .age}
{realName -> "Carlos Irwin Estévez", name -> "Charlie Sheen", age -> <null>}