高性能图数据库Neo4j从入门到实战

发布于:2024-07-24 ⋅ 阅读:(160) ⋅ 点赞:(0)

图数据库Neo4j介绍

什么是图数据库(graph database)

随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生。

世界上很多著名的公司都在使用图数据库,比如:

  • 社交领域:Facebook, Twitter,Linkedin用它来管理社交关系,实现好友推荐
  • 零售领域:eBay,沃尔玛使用它实现商品实时推荐,给买家更好的购物体验
  • 金融领域:摩根大通,花旗和瑞银等银行在用图数据库做风控处理
  • 汽车制造领域:沃尔沃,戴姆勒和丰田等顶级汽车制造商依靠图数据库推动创新制造解决方案
  • 电信领域:Verizon, Orange和AT&T 等电信公司依靠图数据库来管理网络,控制访问并支持客户360
  • 酒店领域:万豪和雅高酒店等顶级酒店公司依使用图数据库来管理复杂且快速变化的库存图数据库并非指存储图片的数据库,而是以图数据结构存储和查询数据。

图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据

图论〔Graph Theory〕是数学的一个分支。它以图为研究对象图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

在这里插入图片描述
在这里插入图片描述

使用 Google+(GooglePlus)应用程序来了解现实世界中 Graph 数据库的需求。 观察下面的图表。在这里,我们用圆圈表示了 Google+应用个人资料。
在这里插入图片描述
在上图中,轮廓“A”具有圆圈以连接到其他轮廓:家庭圈(B,C,D)和朋友圈(B,C)。

再次,如果我们打开配置文件“B”,我们可以观察以下连接的数据
在这里插入图片描述
像这样,这些应用程序包含大量的结构化,半结构化和非结构化的连接数据。 在 RDBMS 数据库中表示这种非结构化连接数据并不容易。如果我们在 RDBMS 数据库中存储这种更多连接的数据,那么检索或遍历是非常困难和缓慢的。所以要表示或存储这种更连接的数据,我们应该选择一个流行的图数据库。

图数据库非常容易地存储这种更多连接的数据。 它将每个配置文件数据作为节点存储在内部,它与相邻节点连接的节点,它们通过关系相互连接。他们存储这种连接的数据与上面的图表中的相同,这样检索或遍历是非常容易和更快的。

关系查询性能对比 在数据关系中心,图形数据库在查询速度方面非常高效,即使对于深度和复杂的查询也是如此。在关系型数据库和图数据库(Neo4j)之间进行了实验:在一个社交网络里找到最大深度为5的朋友的朋友,他们的数据集包括100万人,每人约有50个朋友。

实验结果如下:
在这里插入图片描述
对比关系型数据库

关系型数据库(RDBMS) 图数据库
节点
列和数据 属性和数据
约束 关系

在关系型数据库中,Person和Department表之间用外键表示关系:
在这里插入图片描述
在图数据库中,节点和关系取代表,外键和join:
在这里插入图片描述
在图数据库中, 无论何时运行类似JOIN的操作,数据库都会使用此列表并直接访问连接的节点, 而无需进行昂贵的搜索和匹配计算。

对比其他NoSQL数据库

NoSQL数据库大致可以分为四类:

  • 键值(key/value)数据库
  • 列存储数据库
  • 文档型数据库
  • 图数据库

在这里插入图片描述

分类 数据模型 优势 劣势 举例
键值数据库 哈希表 查找速度快 数据无结构化,通常只被当作字符串或者二进制数据 Redis
列存储数据库 列式数据存储 查找速度快;支持分布横向扩展;数据压缩率高 功能相对受限 HBase
文档型数据库 键值对扩展 数据结构要求不严格;表结构可变;不需要预先定义表结构 查询性能不高,缺乏统一的查询语法 MongoDB
图数据库 节点和关系组成的图 利用图结构相关算法(最短路径、节点度关系查找等) 可能需要对整个图做计算,不利于图数据分布存储 Neo4j、JanusGraph

什么是Neo4j

Neo4j是一个开源的NoSQL图形数据库,2003 年开始开发,使用 scala和java 语言,2007年开始发布。

  • 是世界上最先进的图数据库之一,提供原生的图数据存储,检索和处理;
  • 采用属性图模型(Property graph model),极大的完善和丰富图数据模型;
  • 专属查询语言 Cypher,直观,高效;

官网: https://neo4j.com/

Neo4j的特性:

  • SQL就像简单的查询语言Neo4j CQL
  • 它遵循属性图数据模型
  • 它通过使用Apache Lucence支持索引
  • 它支持UNIQUE约束
  • 它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
  • 它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
  • 它采用原生图形库与本地GPE(图形处理引擎)
  • 它支持查询的数据导出到JSON和XLS格式
  • 它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
  • 它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
  • 它支持两种Java API:Cypher API和Native Java API来开发Java应用程序

Neo4j的优点:

  • 它很容易表示连接的数据
  • 检索/遍历/导航更多的连接数据是非常容易和快速的
  • 它非常容易地表示半结构化数据
  • Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
  • 使用简单而强大的数据模型
  • 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引

Neo4j数据模型

图论基础

图是一组节点和连接这些节点的关系,图形以属性的形式将数据存储在节点和关系中,属性是用于表示数据的键值对。

在图论中,我们可以表示一个带有圆的节点,节点之间的关系用一个箭头标记表示。

最简单的可能图是单个节点

在这里插入图片描述
我们可以使用节点表示社交网络(如Google+(GooglePlus)个人资料),它不包含任何属性。向Google+个人资料添加一些属性:
在这里插入图片描述
在两个节点之间创建关系:
在这里插入图片描述
此处在两个配置文件之间创建关系名称“跟随”。 这意味着 Profile-I 遵循 Profile-II。

属性图模型

Neo4j图数据库遵循属性图模型来存储和管理其数据。

属性图模型规则

  • 表示节点,关系和属性中的数据
  • 节点和关系都包含属性
  • 关系连接节点
  • 属性是键值对
  • 节点用圆圈表示,关系用方向键表示。
  • 关系具有方向:单向和双向。
  • 每个关系包含“开始节点”或“从节点”和“到节点”或“结束节点”

  在属性图数据模型中,关系应该是定向的。如果我们尝试创建没有方向的关系,那么它将抛出一个错误消息。在Neo4j中,关系也应该是有方向性的。如果我们尝试创建没有方向的关系,那么Neo4j会抛出一个错误消息,“关系应该是方向性的”。

  Neo4j图数据库将其所有数据存储在节点和关系中,我们不需要任何额外的RDBMS数据库或NoSQL数据库来存储Neo4j数据库数据,它以图的形式存储数据。Neo4j使用本机GPE(图形处理引擎)来使用它的本机图存储格式。

图数据库数据模型的主要构建块是:

  • 节点
  • 关系
  • 属性

简单的属性图的例子:
在这里插入图片描述
在这里插入图片描述

这里我们使用圆圈表示节点。 使用箭头表示关系,关系是有方向性的。 我们可以用Properties(键值对)来表示Node的数据。 在这个例子中,我们在Node的Circle中表示了每个Node的Id属性。

Neo4j的构建元素

Neo4j图数据库主要有以下构建元素:

  • 节点
  • 属性
  • 关系
  • 标签
  • 数据浏览器

在这里插入图片描述

节点

节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。

  • 节点是主要的数据元素
  • 节点通过关系连接到其他节点
  • 节点可以具有一个或多个属性(即,存储为键/值对的属性)
  • 节点有一个或多个标签,用于描述其在图表中的作用

属性

属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何Neo4j数据类型来表示

  • 属性是命名值,其中名称(或键)是字符串
  • 属性可以被索引和约束
  • 可以从多个属性创建复合索引

关系

关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。

  • 关系连接两个节点
  • 关系是方向性的
  • 节点可以有多个甚至递归的关系
  • 关系可以有一个或多个属性(即存储为键/值对的属性)

基于方向性,Neo4j关系被分为两种主要类型:

  • 单向关系
  • 双向关系

标签

标签(Label)将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。

  • 标签用于将节点分组
  • 一个节点可以具有多个标签
  • 对标签进行索引以加速在图中查找节点
  • 本机标签索引针对速度进行了优化

Neo4j Browser

一旦我们安装Neo4j,我们就可以访问Neo4j数据浏览器
在这里插入图片描述

使用场景

  • 欺诈检测
    在这里插入图片描述
  • 实时推荐引擎
    在这里插入图片描述
  • 知识图谱
    在这里插入图片描述
  • 反洗钱
    在这里插入图片描述
  • 主数据管理
    在这里插入图片描述
  • 供应链管理
    在这里插入图片描述
  • 增强网络和IT运营管理能力
    在这里插入图片描述
  • 数据谱系
  • 身份和访问管理
    在这里插入图片描述
  • 材料清单
  • 社交网络

neo4j 环境搭建

下载地址:https://neo4j.com/download-center/

安装方式

  • Neo4j Enterprise Server
  • Neo4j Community Server
  • Neo4j Desktop

安装Neo4j Community Server

注意: neo4j最新版对应的java版本是jdk11
在这里插入图片描述
jdk8可以下载Neo4j Community Edition 3.5.28
文档:https://neo4j.com/docs/operations-manual/3.5/
解压到新目录(注意:目录名称不要有中文),比如: D:\neo4j\

将Neo4j作为控制台应用程序运行
<NEO4J_HOME>\bin\neo4j console
# 将Neo4j作为服务使用进行安装
<NEO4J_HOME>\bin\neo4j install–service

console: 直接启动 neo4j 服务器
install-service | uninstall-service | update-service : 安装/卸载/更新 neo4j 服务
start/stop/restart/status: 启动/停止/重启/状态
-V 输出更多信息

进入到bin目录,执行

neo4j console

在浏览器中访问http://localhost:7474
使用用户名neo4j和默认密码neo4j进行连接,然后会提示更改密码。
Neo4j Browser是开发人员用来探索Neo4j数据库、执行Cypher查询并以表格或图形形式查看结果的工具。
在这里插入图片描述

docker 安装Neo4j Community Server

开放下面的端口

  • 7474 for HTTP.
  • 7473 for HTTPS.
  • 7687 for Bolt.

拉取镜像

docker pull neo4j:3.5.22-community

运行镜像

 docker run --publish=7474:7474 --publish=7687:7687 -e "NEO4J_AUTH=neo4j/123456"    --volume=$HOME/neo4j/data:/data     neo4j
docker run -d -p 7474:7474 -p 7687:7687 --name neo4j \
	-e "NEO4J_AUTH=neo4j/123456" \
	-v /usr/local/soft/neo4j/data:/data \
	-v /usr/local/soft/neo4j/logs:/logs \
	-v /usr/local/soft/neo4j/conf:/var/lib/neo4j/conf \
	-v /usr/local/soft/neo4j/import:/var/lib/neo4j/import \
neo4j:3.5.22-community

Neo4j Desktop安装

下载安装包默认安装
在这里插入图片描述
启动后可以选择安装本地neo4j数据库或者连接远程neo4j数据库。
在这里插入图片描述

Neo4j - CQL使用

Neo4j - CQL简介

  Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言。像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言
  • 它遵循SQL语法。
  • 它的语法是非常简单且人性化、可读的格式。
CQL命令 用法
CREATE 创建节点,关系和属性
MATCH 检索有关节点,关系和属性数据
RETURN 返回查询结果
WHERE 提供条件过滤检索数据
DELETE 删除节点和关系
REMOVE 删除节点和关系的属性
ORDER BY 排序检索数据
SET 添加或更新标签

三个共同朋友的社交图:
在这里插入图片描述

使用cypher语言来描述关系:

(fox)<-[:knows]-(周瑜)-[:knows]->(诸葛)-[:knows]->(fox)

常用命令

https://neo4j.com/docs/cypher-manual/3.5/clauses/

LOAD CSV

导入csv到neo4j
在这里插入图片描述

#将csv拷贝到 %NEO4J_HOME%\import目录
load csv from 'file:///明星关系数据1.csv' as line
create (:明星 {name:line[1],tail:line[4],label:line[3]})
#将csv拷贝到 %NEO4J_HOME%\import目录
load csv from "file:///明星关系数据1.csv" as line
create (:明星{from:line[1],relation:line[4],to:line[3]})

CREATE命令

Neo4j使用CQL“CREATE”命令

  • 创建没有属性的节点
  • 使用属性创建节点
  • 在没有属性的节点之间创建关系
  • 使用属性创建节点之间的关系
  • 为节点或关系创建单个或多个标签

语法命令

CREATE (<node-name>:<label-name>)

#创建多个节点
create (<node-name>:<label-name>),(<node-name>:<label-name>)

在这里插入图片描述
语法说明

语法元素 描述
CREATE 它是一个neo4j CQL命令
node-name 它是要创建的节点名称
label-name 它是一个节点标签名称

注意事项 -

1、Neo4j数据库服务器使用此<node-name>将此节点详细信息存储在Database.As中作为Neo4j DBA或Developer,我们不能使用它来访问节点详细信息。

2、Neo4j数据库服务器创建一个<label-name>作为内部节点名称的别名。作为Neo4j DBA或Developer,我们应该使用此标签名称来访问节点详细信息。

MATCH 命令

Neo4j CQL MATCH 命令用于

  • 从数据库获取有关节点和属性的数据
  • 从数据库获取有关节点,关系和属性的数据

语法格式:

MATCH 
(
   <node-name>:<label-name>
)

语法说明:

语法元素 描述
CREATE 它是一个neo4j CQL命令
node-name 它是要创建的节点名称
label-name 它是一个节点标签名称

在这里插入图片描述
在这里插入图片描述

RETURN 子句

Neo4j CQL RETURN子句用于 -

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

语法结构

RETURN 
   <node-name>.<property1-name>,
   ........
   <node-name>.<propertyn-name>

语法说明:

语法元素 描述
CREATE 它是一个neo4j CQL命令
node-name 它是要创建的节点名称
propertyn-name 属性是键值对。定义要分配给创建节点的属性的名称

在这里插入图片描述
在这里插入图片描述

MATCH和RETURN

在Neo4j CQL中,我们不能单独使用MATCH或RETURN命令,因此我们应该合并这两个命令以从数据库检索数据。

Neo4j使用CQL MATCH + RETURN命令 -

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

语法结构

MATCH Command
RETURN Command

语法说明

语法元素 描述
MATCH 命令 这是Neo4j CQL MATCH命令
RETURN 命令 这是Neo4j CQL RETURN 命令

CREATE+MATCH+RETURN命令

先创建一个客户

create (e:customer {id:1001,name:"yuyang",location:'hangzhou'})

在这里插入图片描述
在这里插入图片描述
相关信息
在这里插入图片描述
创建一个信用卡节点

create (cc:CreditCard {id:"9999",number:"1234567890",cvv:"888",expiredate:"22/17"})

在这里插入图片描述
然后我们可以查询对应的信息

match (k:customer) return k.name,k.location,k.id

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
还可以查询信用卡的信息

match (m:CreditCard) return m.number,m.cvv,m.id,m.expiredate

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关系基础

Neo4j图数据库遵循属性图模型来存储和管理其数据。

根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。

基于方向性,Neo4j关系被分为两种主要类型。

  • 单向关系
  • 双向关系

在以下场景中,我们可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。

  • 在两个现有节点之间创建无属性的关系
  • 在两个现有节点之间创建有属性的关系
  • 在两个新节点之间创建无属性的关系
  • 在两个新节点之间创建有属性的关系
  • 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系

注意 -

将创建客户和CreditCard之间的关系,如下所示:
在这里插入图片描述

CREATE创建标签

CREATE标签可以创建单个标签或者多个标签

CREATE(node-name:lable-name1:lable-name2)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还有就是可以根据CREATE语句来创建标签之间的关系

CREATE (node1-name:lable1-name) - [relationship-name:relationship-lable-name]->(node2-name:lable2-name)

案例:

create (p1:Profile1)-[r1:喜欢]->(p2:Profile2)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

WHERE子句

像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。

语法结构

WHERE <condition>

复杂的语法结构

WHERE <condition> <boolean-operator> <condition>

Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。

S NO. 布尔表达式 描述
1 AND 它是一个支持AND操作的Neo4j CQL 关键字。
2 OR 它是一个Neo4j CQL 关键字来支持OR操作。
3 NOT 它是一个Neo4j CQL 关键字来支持NOT操作。
4 XOR 它是一个支持XOR操作的Neo4j CQL 关键字。

Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件。

S NO. 布尔表达式 描述
1 = 它是Neo4j CQL “等于”运算符
2 <> 它是一个Neo4j CQL “不等于”运算符
3 < 它是一个Neo4j CQL “小于”运算符
4 > 它是一个Neo4j CQL “大于”运算符
5 <= 它是一个Neo4j CQL “小于或等于”运算符
6 >= 它是一个Neo4j CQL “大于或等于”运算符

案例:

match (m:Employee) where m.age>18 or m.id=1004 return m

在这里插入图片描述
多个节点关联查询

where子句也可以创建关系

语法结构

MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) 
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
       {<relationship-properties>}]->(<node2-label-name>) 
S.No. 语法元素 描述
1 MATCH ,WHERE , CREATE 它们是Neo4J CQL关键字
2 < node1-label-name > 它是一个用于创建关系的节点 —标签名称
3 < node1-name > 它是一个用于创建关系的节点名称
4 < node2-label-name > 它是一个用于创建关系的节点—标签名称
5 < node2-name > 它是一个用于创建关系的节点名称
6 < condition > 它是一个Neo4J CQL WHERE 子句条件。它可以是简单的或复杂的
7 < node1-label-name > 这是新创建的节点一和节点二之间的关系的标签名称
8 < relationship-name > 这是新创建的节点1和节点2之间的关系的名称
9 < relationship-properties > 这是一个新创建节点一和节点二之间关系的属性列表(键-值对)

案例:

match (c:customer),(d:CreditCard) where c.id=1001 and d.id="9999" create (c)-[r:消费{shopdate:'2022/09/28',price:5000}]->(d) return r

在这里插入图片描述

DELETE命令

Neo4j使用CQL DELETE子句

  • 删除节点。
  • 删除节点及相关节点和关系。

对应的语法结构

DELETE <node-name-list>
S.No. 语法元素 描述
1 DELETE 它是一个Neo4j CQL关键字
2 < node-name-list > 它是一个要从

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关系删除
在这里插入图片描述

在这里插入图片描述

注意 -

我们应该使用逗号(,)运算符来分隔节点名。

REMOVE命令

有时基于我们的客户端要求,我们需要向现有节点或关系添加或删除属性。

我们使用Neo4j CQL SET子句向现有节点或关系添加新属性。

我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性

Neo4j CQL REMOVE命令用于

  • 删除节点或关系的标签
  • 删除节点或关系的属性

Neo4j CQL DELETE和REMOVE命令之间的主要区别 -

  • DELETE操作用于删除节点和关联关系。
  • REMOVE操作用于删除标签和属性。

Neo4j CQL DELETE和REMOVE命令之间的相似性 -

  • 这两个命令不应单独使用。
  • 两个命令都应该与MATCH命令一起使用。
    在这里插入图片描述
    在这里插入图片描述
    通过remove来移除标签
match (d:`电影`) remove d:Movie

在这里插入图片描述

SET子句

有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。

要做到这一点,Neo4j CQL 提供了一个SET子句。

Neo4j CQL 已提供 SET 子句来执行以下操作。

  • 向现有节点或关系添加新属性
  • 添加或更新属性值

语法结构

SET  <property-name-list>
S.No. 语法元素 描述
1 SET 它是一个Neo4j 的CQL关键字
2 < property-name-list > 它是一个属性列表,用于执行添加或更新操作以满足我们的要求

添加属性:

MATCH (book:Book)
SET book.title = 'superstar'
RETURN book

在这里插入图片描述
在这里插入图片描述

ORDER BY排序

Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。

我们可以按升序或降序对行进行排序。

默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。

语法结构

ORDER BY  <property-name-list>  [DESC]	 

在这里插入图片描述
举例:

MATCH (emp:Employee)
RETURN emp.id,emp.name,emp.age,emp.deptno
ORDER BY emp.name

在这里插入图片描述

UNION合并

与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果

  • UNION
  • UNION ALL

UNION子句

它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。

限制:

结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。

语法结构

<MATCH Command1>
   UNION
<MATCH Command2>

在这里插入图片描述

注意 -

如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。

as 来处理不同的前缀

MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
   cc.valid_from as valid_from,cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
   dc.valid_from as valid_from,dc.valid_to as valid_to

在这里插入图片描述
UNION ALL子句

它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。

限制

结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

union all 语法

<MATCH Command1>
UNION ALL
<MATCH Command2>

LIMIT和SKIP子句

Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。

如果我们要修整CQL查询结果集顶部的结果,那么我们应该使用CQL SKIP子句

在这里插入图片描述

在这里插入图片描述

skip跳过
在这里插入图片描述
skip和limit可以结合使用达到分页的效果
在这里插入图片描述

合并

Neo4j使用CQL MERGE命令 -

  • 创建节点,关系和属性
  • 为从数据库检索数据

MERGE命令是CREATE命令和MATCH命令的组合。

MERGE = CREATE + MATCH

merge语法

MERGE (<node-name>:<label-name>
{
   <Property1-name>:<Pro<rty1-Value>
   .....
   <Propertyn-name>:<Propertyn-Value>
})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意 -

Neo4j CQL MERGE命令语法与CQL CREATE命令类似。

NULL值

Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。

当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

IN操作符

与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。

IN[<Collection-of-values>]

案例:

MATCH (e:Employee) 
WHERE e.id IN [10010,1003]
RETURN e.id,e.name,e.age

在这里插入图片描述

CQL函数

常用函数

函数 用法
String 字符串 它们用于使用String字面量
Aggregation 聚合 它们用于对CQL查询结果执行一些聚合操作
Relationship 关系 他们用于获取关系的细节,如startnode,endnode等

字符串函数

与SQL一样,Neo4J CQL提供了一组String函数,用于在CQL查询中获取所需的结果。

功能 描述
UPPER 它用于将所有字母更改为大写字母
LOWER 它用于将所有字母改为小写字母
SUBSTRING 它用于获取给定String的子字符串
REPLACE 它用于替换一个字符串的子字符串
MATCH (e:Employee) RETURN e.id,upper(e.name) ,e.age,lower(e.name)

MATCH (e:Employee) RETURN e.id,upper(e.name) ,e.age,lower(e.name),substring(e.name,1,3) as subname,replace(e.name,'a','A') as repname

在这里插入图片描述
在这里插入图片描述

AGGREGATION聚合

和SQL一样,Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。 它类似于SQL中的GROUP BY子句。

可以使用MATCH命令中的RETURN +聚合函数来处理一组节点并返回一些聚合值。

聚集功能 描述
COUNT 它返回由MATCH命令返回的行数
MAX 它从MATCH命令返回的一组行返回最大值
MIN 它返回由MATCH命令返回的一组行的最小值
SUM 它返回由MATCH命令返回的所有行的求和值
AVG 它返回由MATCH命令返回的所有行的平均值
MATCH (e:Employee) where e.age is not null RETURN count(e.name) ,max(e.age),min(e.age),sum(e.age),avg(e.age)

在这里插入图片描述

关系函数

Neo4j CQL提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。

功能 描述
STARTNODE 它用于知道关系的开始节点
ENDNODE 它用于知道关系的结束节点
ID 它用于知道关系的ID
TYPE 它用于知道字符串表示中的一个关系的TYPE
MATCH (a:Profile1) -[r:喜欢]->(b:Profile2) return startnode(r),endnode(r),id(r),type(r)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Neo4J和SpringBoot整合

添加对应的依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
        </dependency>

然后添加对应的配置文件

# neo4j配置
spring.data.neo4j.uri= bolt://localhost:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123456

Node的操作

然后创建对应的实体对象

@Data
@NodeEntity("P")
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    @Property("name")
    private String name;
    
    @Property("age")
    private Integer age;
}

@NodeEntity:标明是一个节点实体
@RelationshipEntity:标明是一个关系实体
@Id:实体主键
@Property:实体属性
@GeneratedValue:实体属性值自增
@StartNode:开始节点(可以理解为父节点)
@EndNode:结束节点(可以理解为子节点)

然后创建对应的Repository接口

@Repository
public interface PersonRepository extends Neo4jRepository<Person,Long> {
}

然后我们就可以测试Node的创建了

 	@Autowired
    private PersonRepository personRepository;

    @Test
    void contextLoads() {
        Person person = new Person();
        person.setName("渔阳");
        personRepository.save(person);
    }

创建成功
在这里插入图片描述

Node关系的维护

创建关系实体

@Data
@RelationshipEntity(type = "徒弟")
public class PersonRelation implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @StartNode
    private Person parent;

    @EndNode
    private Person child;

    @Property
    private String relation;

    public PersonRelation(Person parent, Person child, String relation) {
        this.parent = parent;
        this.child = child;
        this.relation = relation;
    }
}

创建对应的Dao持久层

@Repository
public interface PersonRelationRepository extends Neo4jRepository<PersonRelation,Long> {

}

然后测试

	/**
     * 节点关系
     */
    @Test
    void nodeRelation(){
        Person p1 = new Person("唐僧",6666);
        Person p2 = new Person("孙悟空",5555);
        Person p3 = new Person("猪八戒",3333);
        Person p4 = new Person("沙僧",2222);
        Person p5 = new Person("白龙马",1111);

        // 维护 关系
        PersonRelation pr1 = new PersonRelation(p1,p2,"徒弟");
        PersonRelation pr2 = new PersonRelation(p1,p3,"徒弟");
        PersonRelation pr3 = new PersonRelation(p1,p4,"徒弟");
        PersonRelation pr4 = new PersonRelation(p1,p5,"徒弟");

        personRelationRepository.save(pr1);
        personRelationRepository.save(pr2);
        personRelationRepository.save(pr3);
        personRelationRepository.save(pr4);

    }
	

在这里插入图片描述

	@Test
    public void queryById(){
        Optional<Person> byId = personRepository.findById(1L);
        Person person = byId.get();
        System.out.println("person = " + person);
    }

在这里插入图片描述

neo4j-admin使用

数据库备份

对Neo4j数据进行备份、还原、迁移的操作时,要关闭neo4j

cd %NEO4J_HOME%/bin
#关闭neo4j
neo4j stop
#备份
neo4j-admin dump --database=graph.db --to=/neo4j/backup/graph_backup.dump

数据库恢复

还原、迁移之前 ,要关闭neo4j服务。

#数据导入
neo4j-admin load --from=/neo4j/backup/graph_backup.dump --database=graph.db --force
#重启服务
neo4j start

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到