Neo4j图数据库与Cypher查询语言
背景介绍
属性图模型以及其上的Cypher查询语言最早定义于著名的图数据库系统——Neo4j。Neo4j是由Neo4j公司开发的图数据库系统,其起源于2000年Neo4j的创始人开发的多媒体资产管理系统。在这个多媒体资产管理系统中,数据模型经常会发生变化,而且数据结构以及访问控制机制非常复杂。为此,Neo4j的创始人们选择了用图模型来存储“关系”并在此系统中实现了变长的遍历运算。此外,该系统通过属性集合的方式来对图上的元素进行标记。由此,Neo4j的雏形形成了。
2007年开始,上面那个多媒体资产管理系统开始作为一个开源数据库管理系统被发布出来。最初,这个Neo4j的前身系统是以一个Java库的形式来发布的,它被整合进了Apache的Tinkerpop的行动方案中并提供了Gremlin的API。随着这个系统被越来越多的使用,类似于SQL的属性图查询语言也成为了一个迫切的需要,并随着数据库系统的实现逐步发展。后来,这个Neo4j的前身系统逐步增加一些优化技术,包括对图上的点建立索引。这些优化技术还使得数据模型中图上的点也开始增加了标签,而在最初的设计中图上只有边是有类型的。最后,在2010年Neo4j的1.0版被发布出来,在这一版中属性图模型和初始的Cypher语言被提出来了。
目前,Neo4j提出的属性图数据模型以及Cypher查询语言被逐步完善并成为了目前一个主流的图数据管理方式。本文将主要介绍属性图模型和Cypher查询语言。
属性图模型
属性图模型是目前在工业界和学术界都非常流行的一种图数据模型。这个模型由点来表示现实世界中的实体,由边来表示实体与实体之间的关系。同时,点和边上都可以通过键值对的形式被关联上任意数量的属性。在这种图模型中,关系被提到了一个和实体本身一样重要的程度。
从形式化的角度来看,属性图模型包含三种元素组成:值、图和表。
所谓值,就是属性图数据模型中涉及的各种数据类型。
所谓图,一个属性图是一个七元组G=<N,R,src,tgt,ι,λ,τ >,七元组中各个元素的定义如下。
•N是点标识符集合N的子集,表示是图G中的点集;
•R是变标识符集合R的子集,表示是图G中的边集;
•src是一个函数,表示将一条边映射到其的起点;
•tgt是一个函数,表示将一条边映射到其的终点;
•ι是一个函数,表示将一个点或者一条边上一个属性键映射到一个值;
•λ是一个函数,表示将一个点映射到一个有限的点标签集合;
•τ是一个函数,表示将一条边映射到一个边类型。
在属性图模型中,还有的一种元素就是表(table),这个是用来定义Cypher查询语言结果的。
Cypher查询语言
针对属性图模型,Neo4j主要支持的查询语言是Cypher。
Cypher查询语言主要的发明者是Neo4j的工程师安德烈斯泰勒(Andrés Taylor)。Cypher借鉴了关系数据库上SQL查询语言的句法与特征,同时整合了SPARQL查询语言以及函数式编程语言的一些概念。Cypher和Gremlin的特征集合也有很强的关系,包括支持线性流式地顺序处理数据,这也使得它和嵌套式的查询语言SQL在使用上有非常不一样的体验。
在2015年下半年,Neo4j公司开始了openCypher项目。这是一个开放的平台,用来进行Cypher语言的标准化。openCypher项目目前形成了一系列成果,包括扩展巴科斯范式、ANTLR4语法、技术兼容性工具包等等。这些关于Cypher语言的改动以及成果都是开放的,所有都可以参与其中。在2017年,一系列公开的Cypher开发者大会召开用来确定未来Cypher查询语言的改动以及扩展,最终形成了目前最新版本的Cypher语言——Cypher9。接下来关于查询语言的介绍也将主要围绕Cypher 9。
一个Cypher查询语言包括四部分:表达式、图模式、子句和查询。
所谓表达式,就是出现在Cypher查询语句中的对于值的操作表达式,包括数值操作、字符串操作、关系操作、链表操作、映射表操作、路径操作等等。
所谓图模式,就是出现在Cypher查询语句MATCH子句中查询模式。Cypher定义了两种基本查询模式:点模式和关系模式。所谓点模式是一个三元组(a,L,P),其中a为所查询点对应的变量名、L是所查询的点需要满足的标签集合、P是所查询的点在属性上所需满足的条件。而关系模式是一个五元组(d,a,T,P,I),其中d为关系模式的方向、a是所查询关系对应的变量名、T是所查询关系需要满足的边类型集合、P是所查询关系在边属性上所需满足的条件、I表示所查询关系的可以对应多少条边。
所谓子句,就是表示一个从表到表到函数。Cypher中最主要子句的就是MATCH子句,表示一个图模式在属性图上的匹配,并将一张空表加入匹配结果进而形成一张新表作为结果。MATCH子句后面跟的就是图模式,可以是点模式,也可以是点模式加关系模式加另外的模式。除了MATCH子句外,Cypher还提供了UNWIND和WITH子句。UNWIND子句用来将链表进行展开,使链表中每一个元素对应表中的一行;WITH子句用来对表进行映射操作。
所谓查询,就是若干子句组合并以RETURN语句结尾或者多个查询的并。
[1]Nadime Francis et al. “Cypher: An Evolving Query Language for PropertyGraphs”. In:SIGMOD. 2018, pp. 1433–1445
[2]Cypher Query Language Developer Guides Tutorials. https:// neo4j.com/developer/cyp her-query-language/