3.2.8 列表
Cypher对列表(List)有很好的支持。
3.2.8.1 概述
可以使用方括号和一组以逗号分隔的元素来创建一个列表。
查询:
结果:
下面的例子使用range函数创建列表。它指定了列表包含元素的开始数字和结束数字。范围的两端也是包含在内的,例如:
查询:
结果:
可以使用方括号[]访问列表中的元素。
查询:
结果:
索引也可以为负数,这时将以列表的末尾作为开始点访问。
查询:
结果:
也可以在[]中指定列表返回指定范围的元素。它将提取开始索引到结束索引的值,但不包含结束索引所对应的值。如下面例子中,开始索引为0,结束索引为3,结果将返回索引0、1、2对应的值,但不会返回结束索引3对应的值。
查询:
结果:
查询:
结果:
查询:
结果:
查询:
结果:
注意:如果是一个range的索引值越界了,那么直接从越界的地方进行截断以返回结果。如果是单个元素的索引值越界了,则返回null。
查询:
结果:
查询:
结果:
可以用size函数获取列表的长度,例如:
查询:
结果:
3.2.8.2 List推导式
List推导式(Comprehension)是Cypher基于现有列表创建列表的一种语法构造。它遵循数学上的集合,替代映射和过滤函数。
查询:
结果:
如果希望分别过滤或映射,WHERE部分或者表达式部分都是可以省略的。
查询:
结果:
查询:
结果:
3.2.8.3 模式推导式
模式推导式是Cypher基于模式匹配的结果创建列表的一种语法构造。模式推导式将像一般的MATCH语句那样去匹配模式,断言部分与一般的WHERE语句一样,但它将产生一个指定的图制投射。
查询:
结果:
整个断言,包括WHERE关键字都是可选的,可以被省略。
3.2.8.4 字面值映射
Cypher也可以构造映射。通过REST接口可以获取JSON对象。在Java中对应的是java.util.Map<String, Object>。
查询:
结果:
3.2.8.5 Map投射
Cypher支持一个名为“map projections”(Map投射)的概念。它使得基于已有节点、关系和其他map值来构建map变得容易。
Map投射以指向图实体且用逗号分隔的变量簇开头,并包含以{}包括起来的映射元素。其语法如下:
一个map元素投射一个或多个键值对到map投射。这里有4种类型的map投射元素:
● 属性选择器:以投射属性名作为键,map_variable中对应键的值作为键值。
● 字面值项:来自任意表达式的键值对,如key: <expression>。
● 变量选择器:投射一个变量,变量名作为键,变量的值作为投射的值。它的语法只有变量。
● 全属性选择器:射来自map_variable中的所有键值对。
提示:提示:如果map_variable的值指向一个null,那么整个map投射将返回null。
举一个投射的例子。找到Charlie Sheen和返回关于他和他参演过的电影。这个例子展示了字面值项类型的map投射,反过来它还在聚合函数collect()中使用了map投射。
查询:
结果:
以上例子找出演过电影的所有演员,并显示他们所参演电影的数量。这个例子用一个变量来代表数量,使用变量选择器来投射值,如下所示:
查询:
结果:
还是以“Charlie Sheen”为例,下面查询语句将返回该节点的所有属性。这里使用了全属性选择器来投射所有的节点属性和一个额外的显式投射的age属性。因为此属性在该节点不存在,所以投射的值为null。
查询:
结果: