版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章Neo4j图数据库本章重点◎了解图数据库的相关概念◎了解图数据库的分类和图数据与关系数据库的不同应用领域◎掌握Neo4j安装和配置◎掌握Cypher查询语言的使用◎掌握Cypher函数的使用目录CONTENTS图数据库概述6.1Neo4j安装和配置6.2Cypher查询语言6.3Cypher函数6.4图数据库概述6.1随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系,随数据量的增长而呈几何级数增长,亟需一种能够处理海量复杂数据关系运算的数据库,图数据库应运而生。世界上很多著名的公司都在使用图数据库。比如:社交领域(Facebook和Twitter等),零售领域(eBay和沃尔玛等),金融领域(摩根大通、花旗和瑞银等)、汽车制造领域(沃尔沃、戴姆勒和丰田等),电信领域(Verizon、Orange和AT&T等),酒店领域(万豪和雅高酒店等)。1.分类由于存储和处理模型的不同,图数据库也有一些区分。比如:Neo4j属于原生图数据库,它使用的后端存储是专门为Neo4j这种图数据库定制和优化的,能更有利于发挥图数据库的性能;而JanusGraph不是原生图数据库,而是将数据存储在其他系统如HBase。1)图存储一些图数据库使用原生图存储,这类存储是经过优化的,是专门为了存储和管理图而设计的。并不是所有图数据库都使用原生图存储,也有一些图数据库将图数据序列化,然后保存到关系型数据库或者面向对象数据库,或其他通用数据存储中。2)图处理引擎原生图处理(也称为无索引邻接)是处理图数据的最有效方法,因为连接的节点在数据库中物理地指向彼此。2.对比1)与关系型数据库对比关系型数据库实际上并不擅长处理关系。很多场景下的业务需求完全超出了当前的关系型数据库架构,当我们要查询涉及多张表的数据时,需要开发人员JOIN(连接)几张表,效率非常低下。在数据关系中,图形数据库在查询速度方面非常高效,即使对于深度和复杂的查询也是如此。(2)与其他NoSQL数据库对比NoSQL数据库大致可以分为四类,分别为:键值(key/value)数据库、列存储数据库、文档型数据库和图数据库。各类NoSQL数据库的说明如表6-1所示。在上述NoSQL中,图数据库从最近十年的表现来看已经成为关注度最高、也是发展趋势最迅猛的数据库类型。图6-1就是db-对最近六年来所有数据库种类发展变化趋势的分析结果。与关系数据库或其他NoSQL数据库相比,图数据库的数据模型也更加简单,更具表现力。图数据库是为与事务(OLTP)系统一起使用而构建的,并且在设计时考虑了事务完整性和操作可用性。在目前技术社区和商用市场上最被广大业务和技术人员熟知,而且应用最广泛的当属Neo4j,如图6-2所示。Neo4j安装和配置6.26.2.1安装Neo4j1.下载JavaNeo4j是基于Java运行环境的图形数据库,对操作系统的要求为Windows10/11、macOS10.15+及Linux;需要Java环境支持。从Oracle官方网站下载Java。从Neo4j5.26开始需要JDK17或更高版本,本机安装的是JDK21。如图6-3所示,单击JDKDownload页面后,在弹出的页面,单击jdk-21_windows-x64_bin.exe下载至本地。2.安装JavaJDK双击下载后的jre-8u301-windows-x64.exe文件,在弹出的窗口中,选中“更改目标文件”后单击“安装”后,单击“更改”按钮,可更改安装路径,也可以使用默认路径,如图6-4所示。6.2.1安装Neo4j3.配置Java环境变量配置Java的环境变量的步骤如下。1)新建JAVA_HOME变量,在桌面“此电脑”图标上,单击右键选择“属性”,在“设置”对话框单击“高级系统设置”,在打开的“系统属性”对话框的“高级”选项下,单击“环境变量”按钮,在打开的“编辑环境变量”对话框,新建一个用户变量,如图6-5所示,变量名为“JAVA_HOME”,变量值为“C:\ProgramFiles\Java\jdk-21”。2)编辑系统Path变量,选中系统变量Path,进入“编辑环境变量”对话框,分别在最下方的两个文本框中输入“%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin”,如图6-6所示。3)检查配置是否成功,运行cmd,输入java--version,如果显示Java的版本信息,说明Java的安装和配置成功了,检查Java配置如图6-7所示。6.2.1安装Neo4j4.下载Neo4j安装文件从Neo4j官网下载最新版本Neo4j5.26.9社区(Community)版本neo4j-community-5.26.9-windows.zip,解压到主目录,需要注册(信息随意填写)后才能下载,如图6-8所示(本机安装的是neo4j-community-5.26.0-windows.zip版本),把下载的文件解压到本机的D:\bigdata\neo4j目录下。5.创建Neo4j的环境变量创建用户环境变量NEO4J_HOME,如图6-9(a)所示;并编辑系统环境变量Path,在最下方的文本框输入“%NEO4J_HOME%\bin”,如图6-9(b)所示。6.2.2配置Neo4j1.Neo4j配置文档配置文档存储在Neo4j安装目录的conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需要进行任何配置,就可以启动和运行服务器。配置文档存储在Neo4j安装目录的conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需要进行任何配置,就可以启动和运行服务器。Neo4j配置文档核心内容如下。1)核心数据文件的位置。核心数据文件存储的位置,默认是在data/graph.db目录中,要改变默认的存储目录,可以更新配置选项,如图6-10所示。2)安全验证,默认是启用的,如图6-11所示。3)配置Java堆内存的大小,如图6-12所示。6.2.2配置Neo4j2.neo4j网络协议neo4j支持三种网络协议,默认情况下,不需要配置就可以在本地直接运行。(1)Neo4j支持三种网络协议(Protocol)Neo4j支持三种网络协议(Protocol),分别是Bolt,HTTP和HTTPS,默认的连接器配置有三种,为了使用这三个端口,需要在Windows防火墙中创建InboundRules,允许通过端口7687,7474和7473访问本机,如图6-13所示。(2)连接器的可选属性listen_address:设置Neo4j监听的链接,由两部分组成:IP地址和端口号(Port)组成,格式是:<ip-address>:<port-number>(3)设置默认的监听地址设置默认的网络监听的IP地址,该默认地址用于设置三个网络协议(Bolt,HTTP和HTTPs)的监听地址,即设置网络协议的属性:listen_address地址。在默认情况下,Neo4j只允许本地主机(localhost)访问,要想通过网络远程访问Neo4j数据库,需要修改监听地址为,这样设置之后,就能允许远程主机的访问,如图6-14所示。(4)分别设置各个网络协议的监听地址和端口HTTP链接器默认的端口号是7474,Bolt链接器默认的端口号是7687,必须在Windows防火墙中允许远程主机访问这些端口号,如图6-15所示。6.2.3Neo4j集成浏览器1.通过控制台启动Neo4j程序以管理员权限启用DOS命令行窗口,输入以下命令,通过控制台启用Neo4j程序,进入Neo4j的安装目录下的bin目录,输入“neo4j.batconsole”命令,如果看到如图6-16所示的消息started,说明Neo4j已经开始运行。2.打开Neo4j集成浏览器Neo4j服务器具有一个集成的浏览器,在启动Neo4j服务之后,可以使用Neo4j集成的浏览器管理图数据库。在一个运行Neo4j服务器主机上,在浏览器的地址栏输入“http://localhost:7474”,显示如图6-17所示的登录界面。默认的host是http://localhost:7687,默认的用户是neo4j,默认的密码是:neo4j,第一次成功connect到Neo4j服务器之后,需要重置密码。访问GraphDatabase需要输入身份验证,host是Bolt协议标识的主机。3.使用Neo4j集成浏览器输入用户名和密码登录成功后,会显示如图6-18所示的Neo4j集成浏览器界面,用户可以在“neo4j$”后输入CLD语句,并单击右侧的向右的三角形按钮便可执行该CLD语句。6.2.4Neo4j基本概念Neo4j是一个高性能的NoSQL图形数据库,它将结构化数据存储在网络上而不是表中。它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。使用Neo4j创建的图(Graph)基于属性图模型,在该模型中,每个实体都有ID(Identity)唯一标识,每个节点由标签(Lable)分组,每个关系都有一个唯一的关系类型。1.标签(Label)在图形结构中,标签用于对节点进行分组,相当于节点的类型,拥有相同标签的节点属于同一个分组。一个节点可以拥有零个,一个或多个标签,因此,一个节点可以属于多个分组。对分组进行查询,能够缩小查询的节点范围,提高查询的性能。2.节点(Node)节点是指一个实实在在的对象,这个对象可以有好多的标签,表示对象的种类,也可以有好多的属性,描述其特征,节点与节点之间还可以形成多个有方向(或者没有方向)的关系。3.关系(Relationship)用来描述节点与节点之间的关系,这也是图数据与普通数据库最大的区别,正是因为有这些关系的存在,才可以描述那些我们普通行列数据库所很难表示的网状关系,比如我们复杂的人际关系网,所谓的六度理论,就可以很方便的用图数据库进行模拟,比如我们大脑神经元之间的连接方式,都是一张复杂的网。关系可以拥有属性。6.2.4Neo4j基本概念4.实体(Entity)实体是指节点(Node)和关系(Relationship);每个实体都有一个唯一的ID;通常情况下,节点除了ID属性之外,都会设置Name属性,用于以文本的方式来标识节点,Name属性的值通常是唯一的。1)每个实体都有零个,一个或多个属性,一个实体的属性键是唯一的;2)每个节点都有零个,一个或多个标签,属于一个或多个分组;3)每个关系仅有一个关系类型,关系用于连接两个节点;5.路径(Path)路径是指由起始节点和终止节点之间的实体(节点和关系)构成的有序组合。6.标记(Token)标记是非空的字符串,用于表示标签(Lable)、关系类型(RelationshipType)、或属性键(PropertyKey):1)标签(Label):用于对节点进行分组,多个节点可以有相同的标签,一个节点可以有多个标签,拥有相同标签的节点属于同一个分组;2)关系类型(RelationshipType):用于表示关系的类型,多个关系可以有相同的关系类型,但是一个关系仅有一个关系类型;3)属性键(PropertyKey):用于唯一标识一个属性,在一个关系或节点中,属性键是唯一的。7.属性(Property)描述节点的特性,采用的是Key-Value结构,可以随意设定来描述节点的特征;每个节点或关系可以有一个或多个属性;属性值可以是标量类型(Boolean、Integer、Float、String)、或组合类型(List,Map)。Cypher查询语言6.3Cypher查询语言(CQL)是Neo4j官网提供的声明式查询语言,非常强大,用它可以完成任意的图谱里面的查询过滤;由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。6.3.1CQL简介CQL(CypherQueryLanguage,Cypher查询语言),类似于Oracle数据库具有SQL(StructureQueryLanguage,结构化查询语言)一样,Neo4j具有CQL作为查询语言。1.Neo4jCQL特点(1)CQL是Neo4j图形数据库的查询语言。(2)CQL是一种声明性模式匹配语言。(3)CQL遵循SQL语法。(4)CQL语法是非常简单且人性化、可读的格式。2.Neo4jCQL命令常用的Neo4jCQL命令和作用如表6-2所示。3.Neo4jCQL数据类型Neo4jCQL数据类型数据类型与Java语言类似。它们用于定义节点或关系的属性,数据类型及其描述如表6-3所示。6.3.2创建节点在Neo4jCQL里面通过用一对小括号“()”表示一个节点,下面分为以下三种形式创建节点。1.neo4jCQL创建没有属性的节点1)语法规则2)语法说明label-name是节点标签名称,相当于Mysql数据库中的表名;而node-name是节点名称,其实代指在当前表中创建的一行数据。3)示例下面的CQL创建了一个名为em的节点,该节点的标签为Employee,如图6-19所示。create(<node-name>:<label-name>)6.3.2创建节点2.Neo4jCQL创建具有属性的节点1)语法规则2)语法说明它创建一个具有一些属性(键值对:<key1>:<Value1>)的节点来存储数据,其实即使在当前表中创建有若干个字段名和字段值的一行数据。3)示例下面的Neo4jCQL创建了一个名为e的节点,该节点的标签为Employee,该节点的属性的键值对为:{name:"Sellina",age:34},如图6-20所示。create(<node-name>:<label-name>{<key1>:<Value1><keyn>:<Valuen>});6.3.2创建节点3.Neo4jCQL创建具有多个标签的节点1)语法规则2)语法说明它创建一个具有多个标签的节点,且每个标签之间用“:”分隔。3)示例下面的Neo4jCQL的CREATE子句创建了一个名为e的节点,该节点的有2个标签,分别为“:Employee:Leader”,且该节点有3个属性,分别为:r{name:"Hanks",age:45,telephone,如图6-21所示。create(<node-name>:<label-name1>:<label-name2>:<label-namen>);6.3.3查询节点Neo4jCQL的MATCH命令用于从数据库获取有关节点和属性的数据,MATCH子句用于指定搜索的模式(Pattern)、WHERE子句用来过滤MATCH查询的结果,return子句配合使用返回节点的相关信息。1.MATCH查询1)语法规则match(<node-name>:<label-name>);2)语法说明该语句匹配指定名称和指定标签的节点。2.RETURN返回1)语法规则return<node-name>.<property1-name>,<node-name>.<propertyn-name>;2)语法说明Neo4jCQLreturn子句用于检索节点的某些属性、检索节点的所有属性、检索节点和关联关系的某些属性、检索节点和关联关系的所有属性。6.3.3查询节点3.WHERE子句像SQL一样,Neo4jCQL的match命令中提供了where子句来过滤MATCH查询的结果。1)语法规则where<property-name><comparison-operator><value>2)语法说明<property-name>:表示属性名。<comparison-operator>:可以是Neo4jCQL比较运算符之一,Neo4j支持的比较运算符包括:=(等于)、<>(不等于)、<(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)。<value>:是一个字面值,如数字,字符串等。Neo4j支持在Neo4jCQL的WHERE子句使用多个条件,Neo4j支持的多个条件的布尔运算符包括:and(与)、or(或)、not(非)、xor(异或)。6.3.3查询节点【示例6-1】查询整个图形数据库。1)CQL语句match(n)returnn;2)运行结果在名为neo4j数据库中,有2个标签(2张表):Employee、Leader;Employee标签下有两个节点(两行数据)、Leader标签有一个节点(一行数据),如图6-22所示。6.3.3查询节点【示例6-2】查看节点属性。1)CQL语句match(e:Employee)return,e.age,e.telephone;2)运行结果查询Employee标签(Employee表)节点的,e.age,e.telephone三个属性的值,如图6-23所示。6.3.3查询节点【示例6-3】查询指定属性值的节点。1)CQL语句match(e)where="Tom"returne;2)运行结果查询name属性的值为“Tom”的节点,如图6-24所示。6.3.3查询节点【示例6-4】查询指定标签的节点。1)CQL语句match(e:Employee:Leader)returne;2)运行结果查询具有Employee和Leader这两个标签的节点,并返回节点,如图6-25所示。6.3.4创建关系Neo4j图数据库遵循属性图模型来存储和管理其数据。根据属性图模型,关系应该是定向的。否则,Neo4j将抛出一个错误消息。基于方向性,Neo4j关系被分为两种主要类型:单向关系和双向关系。创建关系时,应在方括号“[]”中指定关系,具体取决于关系在连字符“-”和箭头“->或<-”之间的关系方向。1.使用新节点创建关系1)语法规则create(<node1-name>:<label-name>)-[r:DemoRelation]->(<node2-name>:<label-name>)2)语法说明创建节点node1和node2,并创建节点node1到node2的关系r。6.3.4创建关系【示例6-5】创建新节点和节点间关系。1)示例代码如下:create(e:Employee{name:'Tom',age:28})-[r:work_in]->(c:Company{name:'HUAWEI’})returne,r,c;2)示例运行结果如图6-26所示,创建了一个具有Employee标签、name和age属性的节点e;创建了一个具有Company标签、name属性的节点c,并创建了节点e到节点c的work_in关系r,即员工e在公司c工作的关系,并返回两个节点和关系。6.3.4创建关系2.使用已知节点创建带属性的关系1)语法规则match(<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)create(<node1-label-name>)-[<relationship-label-name>:<relationship-name>{<define-properties-list>}]->(<node2-label-name>)return<relationship-label-name>2)语法说明使用MATCH子句匹配查询节点node1和节点node2。【示例6-6】使用已有节点创建带属性的关系。创建(e:Employee:Leader{name:"Hanks"})节点到(c:Company)节点的lead关系,该关系有两个属性{position:'project
manager',duty:"budget"},代码如下:match(e:Employee:Leader{name:"Hanks"}),(c:Company)create(e)-[r:lead{position:'projectmanager',duty:"budget"}]->(c)returnr;上面的代码,使用MATCH子句查询具有Employee、Leader标签和name属性为Hanks的节点e,查询具有Company标签的节点c;使用CREATE子句创建e到c的关系r,且关系的属性名和属性值的键值对为{position:'project
manager',duty:"budget"},即身为员工和领导的节点e,在公司c节点的职责和岗位。与之同理,创建了公司节点c到员工节点e的雇用关系r,且关系的属性名和属性值的键值对为{years:3,insure:True},公司雇用员工的年限和保险情况同理,创建公司节点c到员工节点e的雇用hire关系,代码如下:match(c:Company),(e:Employee{name:"Sellina"})create(e)<-[r:hire{years:3,insure:True}]-(c)returne,c,r;6.3.5查询关系在Neo4jCQL中,查询关系分为三种符号:(1)“--”表示有关系,忽略关系的类型和方向;(2)“-->”或“<--”表示查询有方向的关系。1.查询数据库中所有的节点和关系【示例6-7】查询当前数据库的所有节点和关系。1)示例代码match(n)returnn;2)示例6-7运行结果如图6-28所示:上面的代码match(n)表示匹配数据库所有节点和关系,即查询整个图形数据的结构。6.3.5查询关系2.查询跟指定节点有关系的节点。【示例6-8】查询与具有Company标签节点有关系的所有节点。下面的代码查询具有Company标签的节点有关系的所有节点,注意在两个节点使用两个连续的减号“--”作为连接符,返回与具有Company标签的节点有关系的所有节点。1)示例代码如下:match(n)--(c:Company)returnn;2)示例运行结果如图6-29所示:6.3.5查询关系3.查询有向关系的节点【示例6-9】查询以具有Company标签节点为终止点的所有节点。1)下面的代码查询以具有Company标签节点为终止节点的关系的所有节点,注意在两个节点使用“<--”,即一个小于号和两个连续的减号合在一起作为连接符,可以实现以(c:Company)节点为终止点,所有满足条件的节点。示例代码如下:match(c:Company)<--(e)returne;2)示例运行结果如图6-30所示:6.3.5查询关系4.查询关系和关系类型【示例6-10】查询关系及其类型。下面的代码查询使用match子句查询具有Employee标签和name属性值为“Tom”的节点e到具有Company标签的节点c的关系r以及关系r的类型:match(e:Employee{name:'Tom'})-[r]->(c:Company)returnr,type(r);2)示例6-10运行结果如图6-31所示:6.3.5查询关系5.查询特定的关系类型1)通过"[Variable:Relationship{Key:Value}]"语法规则,指定关系r的类型和属性,代码如下:match(e:Employee{name:'Hanks'})-[r:lead{duty:"budget"}]->(c:Company)returnr,type(r);2)查询特定关系和关系类型运行结果如图6-32所示,从图中可以看出关系r的id为4,关系r起始节点id为2,终止节点id为1,关系的类型为“lead”,该关系的属性键值对为{duty:"budget"}。6.3.6DELETE删除Neo4j使用CQL的DELETE子句,可以只删除节点或删除节点及相关节点和关系。1.DELETE删除节点1)语法规则delete<node-name-list>【示例6-11】删除节点。下面的语句使用match(e:Employee)查询子句查询具有Employee标签的节点,DELETEe子句删除满足查询条件的节点,但是出现“Cannotdeletenode<2>,becauseitstillhasrelationships.Todeletethisnode,youmustfirstdeleteitsrelationships.”,表示被删除的两个节点还有关联的关系,必须先删除与其关联的关系才能删除节点,代码和运行结果如图6-33所示。6.3.6DELETE删除2.DELETE删除节点和关系1)语法规则delete<node1-name>,<node2-name>,<relationship-name>2)语法说明删除指定名称的节点和关系。【示例6-12】删除指定节点和关系。在示例中,使用match子句匹配(e:Employee{name:"Tom"})节点e,以及节点e到节点(c:Company)的关系[r],使用DELETEe,r子句删除节点e和关系r,示例的代码如下:match(e:Employee{name:"Tom"})-[r]->(c:Company)deletee,r;示例的运行结果如图6-34所示,通过运行结果的提示“Deleted1node,deleted1relationship”,表示一个节点和一个关系被删除。6.3.6DELETE删除3.清空整个数据库1)语法规则match(n)detachdeleten;2)语法说明删除数据库中所有的节点和关系,即清空数据库。6.3.7REMOVE和SET更新有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。可以使用Neo4jCQL的set子句向现有节点或关系添加新属性;使用Neo4jCQL的remove子句来删除节点或关系的现有属性和标签。Neo4jCQL的delete和remove命令之间的区别为:DELETE操作用于删除节点和关联关系;而remove操作用于删除标签和属性。Neo4jCQL的delete和remove命令之间的相似之处为:这两个命令不应单独使用,即两个命令都应该与match命令一起使用。1.REMOVE子句1)删除节点属性语法格式:match(node1-name:Label1,..{key1:value1,..}),…(noden-name:Label1,..{key1:value1,..})remove<node1-name>.<property1-name>,…<node2-name>.<property2-name>语法说明:node-name:是节点的名称。property-name:是节点的属性名称。<node1-name>.<property1-name>:节点名和节点属性之间使用“.”。6.3.7REMOVE和SET更新【示例6-13】删除指定节点的属性。在示例中,使用MATCH子句匹配(e:Employee{name:"Hanks"})节点e,使用removee.telephone子句删除节点e的telephone属性,并返回该节点,示例的代码如下:match(e:Employee{name:"Hanks"})removee.telephonereturne;示例的运行结果如图6-35所示,通过运行可以看到该节点的"properties"的中"telephone"属性被删除。6.3.7REMOVE和SET更新2)删除节点标签语法格式:MATCH(node1-name:Label1,..{key1:value1,..}),…(noden-name:Label1,..{key1:value1,..}),REMOVE<node-name>:<label2-name>,<noden-name>:<labeln-name>语法说明:node-name是节点的名称。property-name是节点的属性名称。<node1-name>.<label1-name>节点名和节点标签之间使用“:”。6.3.7REMOVE和SET更新【示例6-14】删除指定节点的标签。假如我们创建了一个有三个标签的节点,代码如下:create(e:Employee:Leader:Corporation{name:"Peter",age:48,telephone)returne;如图6-36所示,该节点有3个标签(Employee、Leader和Corporation)和三个属性(name、age和telephone)。示例中,使用match(e{name:"Peter"})子句匹配节点e,使用removee:Corporation子句删除节点的“Corporation”标签(法人标签),示例代码如下:match(e{name:"Peter"})removee:Corporationreturne;示例的运行结果如图6-37所示,通过运行结果提示“Removed1label”可见,节点e的1个标签“Corporation”被删除。6.3.7REMOVE和SET更新2.SET子句1)更新和添加节点属性语法格式:MATCH(node1-name:Label1,..{key1:value1,..}),…(noden-name:Label1,..{key1:value1,..}),SET<node1-name>.<property1-name>=value1,...<noden-name>.<propertyn-name>=valuen语法说明:node-name是节点的名称。property-name是节点的属性名称。<node1-name>.<property1-name>=value1:给节点node1-name的property1-name赋值为value1。6.3.7REMOVE和SET更新【示例6-15】给指定节点修改和添加属性。使用match(e:Employee{name:"Peter"})子句匹配节点e,使用set子句分别更新该节点telephone属性和添加.address属性,示例代码如下:match(e:Employee{name:"Peter"})sete.telephone=150123456789,e.address="Beijing"returne;示例6-15运行结果如图6-38所示,通过运行结果提示“Set2properties”,可以看到节点的两个属性被更新。6.3.7REMOVE和SET更新语法说明:
node-name是节点的名称。
property-name是节点的属性名称。
r为关系名称。
r.<property1-name>=value1:给关系r的property1-name赋值为value1。【示例6-16】修改和添加指定关系的属性。使用match(e:Employee{name:"Sellina"})子句匹配节点e,使用set子句分别更新该节点year属性和type属性,示例代码如下:match(node1-name:Label…{key:value..})-[r:Label{key:value}]->(node2-name:Label…{key:value..})setr.<property1-name>=value1,...r.<propertyn-name>=valuen2)更新和添加关系的属性语法格式:match(e:Employee{name:"Sellina"})<-[r]-(c:Company)setr.years=5,r.type="regularemployee"returnr;示例6-16运行结果如图6-39所示,通过运行结果提示“Set2properties”,可以看出关系r的两个属性被修改了。6.3.8ORDERBY排序Neo4jCQL在MATCH命令中提供了orderby子句,对match查询返回的结果进行排序。我们可以按升序或降序对行进行排序。默认情况下,按升序对行进行排序,如果我们要按降序对它们进行排序,需要使用DESC子句。1.ORDERBY子句语法格式如下:orderby<property-name-list>[desc]语法说明:
property-name-list:节点的属性列表。【示例6-17】按照节点的属性排序。使用match(e:Employee)子句匹配所有具有Employee标签的节点,使用return,e.age,e.telephone返回这些节点的3个属性,使用orderbye.agedesc子句,根据节点的age属性按照降序排序,示例代码如下:match(e:Employee)return,e.age,e.telephoneorderbye.agedesc;示例6-17的运行结果如图6-40所示:6.3.9UNION合并与SQL一样,Neo4jCQL也有两个子句:UNION和UNIONALL,可以将两个不同的结果合并成一组结果。1.UNION子句UNION子句将两组结果中的公共行组合并返回到一组结果中,它不从两个节点返回重复的行。该子句有一点限制,即结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型也应该相同。1)语法格式<matchCommand1>union<matchCommand2>2)语法说明:union可合并涉及不同节点类型或关系的查询2.AS子句不同节点使用不同的变量名,就会有不同的节点属性名称的前缀。这时union命令显示此错误消息。为了避免这种错误,Neo4j的CQL提供“as”子句,可以为不同前缀或不同属性名起别名。6.3.9UNION合并【示例6-18】联合查询结果。已知创建了一个新节点,示例代码如下:create(t:Teacher{name:"Mike",age:27,telephone)returnt;1)示例错误的运行结果如图6-41所示,根据错误提示“AllsubqueriesinanUNIONmusthavethesamecolumnnames”可知,错误的原因是两个查询子句使用了不同的列名(不同的前缀名)。2)要得到正确的运行结果,可以使用如下两种方法:(1)两个match查询使用相同的变量名,示例的代码和运行结果如图6-42所示。(2)在return子句中给不同前缀的属性名,使用as子句给属性名起相同的别名,如图6-43所示。6.3.10LIMIT和SKIPNeo4jCQL提供limit子句和skip来过滤或限制查询返回的行数,使用limit子句返回前几行,使用skip返回后几行。1.LIMIT子句1)语法格式:limitn2)语法说明:
n:n为整数。
LIMITn:只返回Topn个结果。1.SKIP子句1)语法格式:skipn2)语法说明:
n:n为整数。
skipn:只返回buttomn个结果。6.3.10LIMIT和SKIP图6-44查询指定数量的节点【示例6-19】查询所有节点、前两个节点和后两个节点。示例的代码和运行结果如图6-44所示,其中第1个运行结果查询所有具有Employee标签的节点;第2个运行结果查询所有具有Employee标签的后2个节点;第3个运行结果查询所有具有Employee标签的前2个节点。图6-44查询指定数量的节点6.3.11MERGE子句Neo4jCQL的merge子句是create子句和match子句的组合,可以实现创建节点、关系和属性。Neo4jCQL的merge子句在图中搜索给定模式,如果存在,则返回结果;如果它不存在于图数据库中,则它创建新的节点和关系并返回结果。1)语法格式:merge(<node-name>:<label-name>{<key>:<1-Value><n-key>:<n-Value>})2)语法说明:Neo4jCQL的MERGE子句语法与CQL的create子句类似。node-name:节点名。label-name:节点的标签名。<key>:<1-Value>:节点的属性名和属性值的键值对。6.3.11MERGE子句【示例6-20】使用MERGE子句创建节点。1)使用MERGE子句连续两次创建一个相同的节点,示例的代码如下:merge(e:Employee:Teacher{name:"Jennie",age:39,address:"Shanghai"});merge(e:Employee:Teacher{name:"Jennie",age:39,address:"Shanghai"});2)示例的运行结果如图6-45所示,通过运行结果可知,图的下半部分是第一行代码的运行结果,通过提示“Added2labels,created1node,set3properties”可知,已经成功的创建了一个有2个标签和3个属性的节点;图的上半部分是第二行代码的运行结果,通过提示“(nochanges,norecords)”可知,该节点已经存在,没有改变,没有新节点被创建。图6-45使用MERGE创建节点6.3.12NULL值Neo4jCQL将空值视为对节点或关系的属性的缺失值或未定义值。当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有“NULL”属性值的新节点。【示例6-21】查询电话号码为NULL的节点信息。1)示例的代码如下:match(e:Employee)wheree.telephoneisNULLreturn,e.age,e.telephone;2)示例6-21的运行结果如图6-46所示:6.3.13IN操作符与SQL一样,Neo4jCQL提供了一个“in”运算符,以便为CQL命令提供值的集合。1)语法格式:in[<Collection-of-values>]2)语法说明:<Collection-of-values>:它是由逗号运算符分隔的值的集合。node-name:节点名。【示例6-22】查找name属性值为"Tom"、"Peter"或"Sellina"的所有节点。match(e:Employee)wherein["Tom","Peter","Sellina"]return,e.age,e.telephone;示例6-22使用in["Tom","Peter","Sellina"]筛选条件的运行结果如图6-47所示:6.3.14INDEX索引Neo4jCQL支持节点或关系属性上的索引,以提高应用程序的性能。我们可以为具有相同标签名称的所有节点的属性创建索引。可以在match或where或in运算符上使用这些索引列来改进CQL命令的执行。1.CREATEINDEX创建索引1)语法格式:createindexon:<label_name>(<property_name>)2)语法说明:冒号“:”:运算符用于引用节点或关系标签名称。上述语法描述它在节点或关系的的上创建一个新索引。2.DROPINDEX删除索引1)语法格式:dropindexon:<label_name>(<property_name>)2)语法说明:与创建索引语法一致。6.3.14INDEX索引【示例6-23】创建和删除指定标签和属性的索引。1)示例的代码如下:createindexon:Employee(age);dropindexon:Employee(age);2)示例6-23的运行结果如图6-48所示:图6-48创建和删除索引在Neo4j数据库中,CQL的create命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。根据我们对某些节点或关系的应用需求,我们必须避免这种重复。然后我们不能直接得到这个。我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。像SQL一样,Neo4j数据库也支持对Node或Relationship的属性的unique约束。unique约束优势体现了两点:可以避免重复记录和强制执行数据完整性规则。1.创建唯一约束语法1)语法格式:createconstrainton(<label_name>)assert<property_name>isunique2)语法说明:
createconstrainton:是一个Neo4jCQL关键字。
<label_name>:是节点或关系的标签名称。
assert:是一个Neo4jCQL关键字,表示声明。
<property_name>:它是节点或关系的属性名称。
isunique:是一个Neo4jCQL关键字,通知Neo4j数据库服务器创建一个唯一约束。上述语法描述了只需要节点或关系就可以创造一个独特的约束,如果创建约束时节点属性有重复值,Neo4jDB服务器将会抛出一个错误,表示无法创建。6.3.15UNIQUE约束2.删除UNIQUE约束1)语法格式:dropconstrainton(<label_name>)assert<property_name>isunique2)语法说明:删除指定标签<label_name>下和指定属性名<property_name>的唯一约束。【示例6-24】创建和验证唯一约束。1)创建唯一约束。给指定Employee标签(表)中和指定属性名(字段)创建唯一约束。2)创建了唯一约束后,再创建有重复name属性值的节点报错,代码和运行结果如图6-49所示。3)删除唯一约束,根据提示信息“Removed1constraint”可见,删除了一个约束,如图6-50下面的语句和运行结果。4)删除唯一约束后,再次插入name属性的重复值,不再报错,如图6-50所示上面的语句和运行结果。6.3.15UNIQUE约束我们使用Neo4j数据浏览器来执行和查看Neo4jCQL命令或查询的结果。Neo4j数据浏览器包含两种视图来显示查询结果:1)UI查看2)网格视图在本节中,将讨论如何在UI视图中更改节点或关系的字体。当在数据浏览器中执行Neo4jCQL的return子句时,它会在网格视图或UI视图中显示结果。默认情况下,Neo4j数据浏览器以小字体显示节点或关系图,并在UI视图中显示默认颜色。如果我们想要在更大的字体或不同的颜色中查看它们,那么如何增加它们的字体(大小)或如何改变它们的颜色。关于Neo4j提供的图形浏览器,可以从其中查看节点的属性,或者改变其中的节点的大小颜色。接下来用一个例子来讨论这个问题。6.3.16图形字体【示例6-25】在Neo4j数据浏览器中更改节点或关系的字体、颜色和尺寸。步骤1:打开Neo4j数据浏览器,即在浏览器地址栏输入http://localhost:7474/。步骤2:在Neo4j数据浏览器输入如下命令:6.3.16图形字体match(e:Employee)-[r:work_in]->(c:Company)returnr,e,c;步骤3:单击命令行右侧的执行按钮,Neo4j数据浏览器通过使用默认图形字体显示此查询结果,运行结果如图6-51所示。步骤4:在图6-52所示的界面中,单击“Employee”标签,可以看到图6-52(a)所示选项,用来修改Employee标签节点Tom的字体颜色(Color)和字体大小(Size);单击“work_in”关系,可以看到图6-52(b)所示的选项,用来修改该关系的线条颜色(Color)和线条粗细(Linewidth)。图6-52修改节点和关系的显示设置在Neo4j中,“Id”是节点和关系的默认内部属性。这意味着,当我们创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。它会自动递增。下面用一个具体示例展示一下。【示例6-26】查看节点ID属性。步骤1:新创建一个节点,输入如下命令:6.3.17ID属性create(c:Company{name:"Tencent",found:1998})returnc;步骤2:单击命令行右侧的执行按钮,运行结果如图6-53所示,然后单击新创建的节点,在运行结果的底部可以看到该节点若干属性“<id>:3found:1998name:Tencent”和所属的标签“Employee”。所谓的Caption标题,就是更改Neo4j浏览器的节点显示的文字(圆圈内部)。下面用一个具体例子展示一下。。【示例6-27】更改节点的标题。步骤1:查询示例6-26中创建的节点,输入如下命令:6.3.18Caption标题match(c:Company{name:"Tencent"})returnc;步骤2:单击命令行右侧的执行按钮,示例6-27运行结果如图6-54所示,然后单击Company标签,在运行结果的底部可以看到该节点可以更改的若干Caption,单击“id”,可以将该节点圆圈内的标题更改为该节点的id值3。Cypher函数6.4Cypher函数是对图进行查询和操作的重要工具。本节的所有函数都是在如下图6-55所示的图数据库的基础上的操作。断言函数是对给定的输入返回true或者false的布尔函数。它们主要用于查询的where部分过滤子图。1.Exists()函数如果指定的模式存在于图中,或者特定的属性存在于节点、关系或Map中,那么exists()函数返回True。语法如下:6.4.1断言函数exists(pattern-or-property)语法说明:pattern-or-property:模式或者属性(以“p”的形式)。【示例6-28】查询具有name属性和到其他节点的work_in节点。步骤1:输入如下命令:match(n)whereexists()returnASname,exists((n)-[:work_in]->())aswork;上面的命令解释如下。(1)使用match(n)匹配节点n;(2)使用whereexists()查询条件,判断节点n是否存在name属性;(3)使用return子句,分别返回节点n的name属性值且别名为name;(4)exists((n)-[:work_in]->())aswork表示判断节点n是否存在到其他节点的work_in关系,且将别名为work。步骤2:单击命令行右侧的执行按钮,运行结果如图6-56所示。2.all()函数判断一个断言是否适用于列表中的所有元素。语法如下:6.4.1断言函数all(variableinlistwherepredicate)语法说明:list:返回列表的表达式
variable:用于断言中的变量
predicate:用于测试列表中所有元素的断言【示例6-29】返回路径中age属性大于25的所有节点。步骤1:输入如下命令:matchp=(a)-[*1..3]->(b)whereall(xinnodes(p)wherex.age>25)returnp;上面的命令解释如下:1)使用matchp=(a)-[*1..3]->(b):其中,“*”:来代表可变长度的路径,[*1..3]表示从一级到三级深度的关系,即表示节点a到节点b之间的路径长度为1到3的可变长度路径。2)xinnodes(p)wherex.age>25:其中,xinnodes(p)表示在选路径p上的所有x节点x;wherex.age>25用来筛选x.age>25(年龄大于25的节点);使用all()函数,来筛选路径p上的所有满足条件的节点。步骤2:单击命令行右侧的执行按钮,运行结果如图6-57所示。3.any()函数判断一个断言是否至少适用于列表中的一个元素。语法如下:6.4.1断言函数any(variableinlistwherepredicate)语法说明:
list:返回列表的表达式
variable:用于断言中的变量
predicate:用于测试列表中所有元素的断言【示例6-30】查询当前数据库中年龄大于35岁的任何节点。步骤1:输入如下命令:match(a)whereany(xina.agewherex>35)returna;上面的命令解释如下:1)any(xina.agewherex>35):表示匹配任何一个年龄大于35岁的节点。2)returna:表示返回节点a。步骤2:单击命令行右侧的执行按钮,运行结果如图6-58所示(分别按照文本格式和图形格式显示结果)。图6-58any()函数的使用4.none()函数如果断言不适用于列表中的任何元素,则返回true。语法如下:6.4.1断言函数none(variableinlistwherepredicate)语法说明:
list:返回列表的表达式;
variable:用于断言中的变量;
predicate:用于测试列表中所有元素的断言断,若言不适合用于列表中的任何元素则返回true。【示例6-31】返回的路径中没有节点的age属性值小于25。步骤1:输入如下命令:matchp=(n)-[*1..3]->(b)where='Tom'andnone(xinnodes(p)wherex.age<25)returnp;上面的命令解释如下:(1)='Tom':表示路径p上的起始节点的name属性为“Tom”。(2)none(xinnodes(p)wherex.age<25):表示检查当前路径p中所有节点是否都满足年龄小于25岁的节点。如果路径中没有节点的age属性小于25岁,则返回True;否则返回False。步骤2:单击命令行右侧的执行按钮,运行结果如图6-59所示。5.single()函数如果断言刚好只适用于列表中的某一个元素,则返回true。语法如下:6.4.1断言函数single(variableinlistwherepredicate)语法说明:
list:返回列表的表达式;
variable:用于断言中的变量;
predicate:用于测试列表中所有元素的断言。【示例6-32】每条返回的路径中刚好只有一个节点的name属性值为'HUAWEI'。步骤1:输入如下命令:matchp=(a)-->(b)where='Tom'andsingle(xinnodes(p)where='HUAWEI')returnp;上面的命令解释如下。(1)='Tom':表示路径p上的起始节点的name属性为“Tom”。(2)single(xinnodes(p)where='HUAWEI'):表示在所有路径中只有一个name属性为'HUAWEI'节点的路径。步骤2:单击命令行右侧的执行按钮,示例6-32运行结果如图6-60所示。标量函数用来返回节点或关系的一个单值。1.节点和关系的ID和属性的函数1)id():返回节点或关系的ID2)properties():返回节点或关系的属性(Map)【示例6-33】每条返回的路径中具有Employee标签的节点。步骤1:输入如下命令:6.4.2标量函数match(e:Employee)returnid(e),properties(e);上面的命令解释如下:(1)match(e:Employee):表示匹配所有具有Employee标签的节点(2)returnid(e),properties(e):返回节点的id和节点的属性值。步骤2:单击命令行右侧的执行按钮,运行结果如图6-61所示。2.关系开始节点、结束节点和类型的函数1)endNode(relationship):返回关系的结束节点2)startNode(relationship):返回关系的开始节点3)type(relationship):返回关系的类型【示例6-34】每条返回的路径中均以name属性值为'Tom'的节点为起点。步骤1:输入如下命令:6.4.2标量函数match(n)-[r]->()where='Tom'returntype(r),startNode(r),endNode(r);上面的命令解释如下:(1)match(n)-[r]->():表示匹配节点n和到所有节点的关系r。(2)where='Tom':表示n节点的name属性为'Tom'。(3)returntype(r),startNode(r),endNode(r):返回关系r的类型、起始节点和终止节点。步骤2:单击命令行右侧的执行按钮,运行结果如图6-62所示。3.列表函数(1)coalesce():返回所有节点的列表。(2)head():返回起点节点。(3)last():返回终点节点。(4)size():返回节点标签的数量。【示例6-35】查询指定路径列表的相关元素。步骤1:输入如下命令:6.4.2标量函数matchp=()-[r:hire]->()returnhead(nodes(p)),last(nodes(p)),coalesce(nodes(p)),size(nodes(p));上面的命令解释如下:(1)matchp=()-[r:hire]->():匹配节点到节点的标签为“hire”的关系r的路径p。(2)head(nodes(p)):表示返回每个路径p上的起点节点,分别是"name"属性值为"HUAWEI"、"Tencent"和"Tencent"节点的3个节点("Tencent"公司节点雇用了两个员工节点)。(3)last(nodes(p)):表示返回每个路径p上的终节点,分别是"name"属性值为"Sellina"、"Mike"和"Jennie"的节点。(4)coalesce(nodes(p)):表示返回每个路径p上的非空节点列表,即[起点,终点]的列表。(5)size(nodes(p)):表示返回每个路径p上节点的数量。步骤2:单击命令行右侧的执行按钮,运行结果如图6-63所示。4.长度函数1)size(string):表示字符串中字符的数量,可以把字符串当作是字符的列表。2)size(list):返回列表中元素的数量。3)size(pattern_expression):也是统计列表中元素的数量,但是不是直接传入列表,而是提供模式表达式(pattern_expression),用于在匹配查询(Matchquery)中提供一组新的结果,这些结果是路径列表,size()函数用于统计路径列表中元素(即路径)的数量。4)length(path):返回路径的长度,即路径中关系的数量。【示例6-36】查询路径长度、节点数量和节点name属性字符数量。步骤1:输入如下命令:6.4.2标量函数matchp=(a:Employee)-->()-->()return,size(),size(nodes(p)),length(p);上面的命令解释如下:1)matchp=(a:Employee)-->()-->():匹配路径p,路径p以具有Employee标签的节点为起始节点。2)head(nodes(p)):表示返回路径p上所有的第一个节点。3)last(nodes(p)):表示返回路径p上所有的最后一个节点。4)size(nodes(p)):表示返回路径p上节点数量。步骤2:单击命令行右侧的执行按钮,示例6-36运行结果如图6-64所示。数学函数仅适用于数值表达式。如果用于其他类型的值,将返回错误。Neo4j数学函数如表6-4所示。【示例6-37】数学函数的使用。步骤1:输入如下命令:6.4.3数学函数returnabs(-5),sqrt(9),round(7.6),ceil(7.1),floor(7.6),rand(),sign(-5);步骤2:单击命令行右侧的执行按钮,运行结果如图6-64所示。聚合函数与match命令中的return子句一起使用,来处理一组节点并返回一些聚合值。聚合函数及其描述如表6-5所示。【示例6-38】聚合函数的使用。步骤1:输入如下命令:6.4.4聚合函数match(e:Employee)returncount(*),max(e.age),min(e.age),avg(e.age),sum(e.age),collect(e.age);步骤2:单击命令行右侧的执行按钮,运行结果如图6-65所示。下面的函数都是只针对字符串表达式。如果用于其他值,将返回错误。有个例外就是toString(),它还接受数字值和布尔值,字符串函数及其描述如表6-6所示。【【示例6-39】字符串函数的使用。步骤1:输入如下命令:6.4.5字符串函数match(e:Employee)where='Sellina'return,substring(,2,4),replace(,'ell','ucc'),reverse(),split('Tom,Kate,Peter',','),tolower(),toupper(),left(,2),right(,2);步骤2:单击命令行右侧的执行按钮,示例6-39运行结果如图6-67
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西北海铁山东港产业园区管理委员会招聘3人备考题库(夺冠系列)附答案详解
- 2026秋季云南普洱市孟连县教育体育局学期考调专任教师11人备考题库附参考答案详解(精练)
- 2026年张家口市桥东区街道办人员招聘考试参考题库及答案详解
- 2026广东南粤银行招聘8人笔试备考题库及答案详解
- 2026年黑龙江省哈尔滨市街道办人员招聘考试备考试题及答案详解
- 2026年庆阳市西峰区中小学教师招聘考试参考试题及答案详解
- 2026年苏州市相城区中小学教师招聘考试备考试题及答案详解
- 2026年贵阳市花溪区中小学教师招聘笔试参考题库及答案详解
- 2026年贵阳市白云区中小学教师招聘笔试备考题库及答案详解
- 2026年茂名市茂港区街道办人员招聘笔试参考题库及答案详解
- 氩气安全知识培训材料课件
- 生态修复的讲解
- IPC6012DA中英文版刚性印制板的鉴定及性能规范汽车要求附件
- 院前创伤急救止血专家共识(2025年版)解读
- DB32T 3939-2020公路钢结构桥梁质量检验评定规程
- 中国艾滋病诊疗指南(2024版)解读课件
- 2021辅助生殖技术中异常子宫内膜诊疗的中国专家共识(全文)
- 2025陕西延长石油(集团)有限责任公司科技人才招聘116人笔试备考试题及答案解析
- 快递物流运输服务规范
- 人防工程(防护密闭套管∕管道)隐蔽检查验收记录
- 中华人民共和国标准设计施工总承包招标文件(2012年版)
评论
0/150
提交评论