3.1.2 模式(Patterns)

Neo4j图由节点和关系构成。节点可能还有标签和属性,关系可能还有类型和属性。节点表达的是实体,关系连接一对节点。节点可以看作类似关系数据库中的表,但又不完全一样。节点的标签可以理解为不同的表名,属性类似关系数据库中表的列。一个节点的数据类似关系数据库中表的一行数据。拥有相同标签的节点通常具有类似的属性,但不必完全一样,这一点与关系数据库中一张表中的行数据拥有相同的列是不一样的。

然而,节点和关系都是简单的低层次的构建块。单个节点或者关系只能编码很少的信息,但模式可以将很多节点和关系编码为任意复杂的想法。

Cypher查询语言很依赖于模式。只包含一个关系的简单模式连接了一对节点。例如,一个人LIVES_IN在某个城市或者某个城市PART_OF一个国家。使用了多个关系的复杂模式能够表达任意复杂的概念,可以支持各种有趣的使用场景。例如,下面的Cypher代码将两个简单的模式连接在一起:

像关系数据库中的SQL一样,Cypher是一种文本的声明式查询语言。它使用ASCII art(4)的形式来表达基于图的模式。采用类似SQL的语句,如MATCH、WHERE和DELETE,来组合这些模式以表达所预期的操作。

3.1.2.1 节点语法

Cypher采用一对圆括号来表示节点,如:()、(foo)。下面是一些常见的节点表示法:

简单的()表达了一个匿名节点。如果想在其他地方引用这个节点,可以添加一个变量,如(matrix)。此变量的可见范围局限于单个语句。

Movie标签声明了节点的类型。Neo4j节点索引也会使用到标签,每个索引都是建立在一个标签和属性的组合上。节点的属性以key/value列表的形式存在,并外加一对大括号。属性可以存储信息和(或)限制模式。

3.1.2.2 关系语法

Cypher使用一对短横线(即--)表示一个无方向关系。有方向的关系在其中一段加上一个箭头(即<--或-->)。方括号表达式[…]可用于添加详情。里面可以包含变量、属性和(或者)类型信息。关系的常见表达方式如下:

关系的方括号内的语法和语义与节点类似,定义了可以在别处引用的变量,关系的类型类似于节点的标签,关系的属性等同于节点的属性。注意,属性的值可以是数组。

3.1.2.3 模式语法

将节点和关系的语法组合在一起可以表达模式。下面是一个简单的模式:

3.1.2.4 模式变量

为了增强模块性和减少重复,Cypher允许将模式赋给一个变量。这使得匹配到的路径可以用于其他表达式。如: