图数据库Neo4j介绍与使用

由于最近项目需要使用Neo4j数据库但是鉴于并没有相对来说较为完善的使用教程,本人在哔哩哔哩学习相关课程后将其整理以供学习,课程链接附于文末。

1.图数据库Neo4j介绍

1.1图数据库的概念

随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长, 急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生。在各个领域都具有重要的作用。图数据库是基于图论实现的一种**NoSQL**数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。

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

例如我们使用圆圈来表示某个应用程序中的个人资料(家庭圈和朋友圈)
image.png
类似于上述的具有多种连接关系的复杂关系圈,这些应用程序包含大量的结构化半结构化非结构化连接数据。 在 RDBMS数据库中表示这种非结构化连接数据并不容易。如果我们在RDBMS数据库中存储这种更多连接的数据,那么检索或遍历是非常困难和缓慢的。所以要表示或存储这种多连接的数据,我们应该选择一个流行的图数据库。
图数据库非常容易地存储这种更多连接的数据。 它将每个配置文件数据作为节点存储在内部,它与相邻节点连接的节点,它们通过关系相互连接。他们存储这种连接的数据与上面的图表中的相同,这样检索或遍历是非常容易和更快的。
其在概念上与传统的RDBMS的对应关系如表所示:

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

如下图所示,:Persion:Department都是节点的标签,:BELONGS_TO则是节点和节点之间的关系,而Alice P0815 A42 4FUTURE则是节点的属性,其中节点的标签节点的属性共同组成了一个节点的要素,节点之间通过关系形成,这就是图数据库的形成概念。
image.png

1.2 Neo4j的概念

Neo4j是一个开源的NoSQL图形数据库,2003 年开始开发,使用 ScalaJava 语言,2007年开始发布,其具备的基本信息如下:

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

和其他的数据库一样Neo4j也具备很多通用的特性:

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

Neo4j数据库的常见使用场景和相对的优势:

  • 易于表示连接的数据因此检索/遍历/导航更多的连接数据是非常容易和快速的
  • 易于表示半结构化数据
  • Neo4j CQL查询语言易于学习
  • 数据模型简单而强大

1.3 Neo4j的数据模型

前文已经提到了Neo4j图论基础,因此该部分主要介绍其属性图模型,该模型的一般规则为:

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

在属性图数据模型中,关系应该是定向的。如果我们尝试创建没有方向的关系,那么它将抛出一个错误消息。在Neo4j中,关系也应该是有方向性的。如果我们尝试创建没有方向的关系,那么Neo4j会抛出一个错误消息“关系应该是方向性的”。
Neo4j图数据库将其所有数据存储在节点关系中,我们不需要任何额外的RDBMS数据库或NoSQL数据库来存储Neo4j数据库数据,它以图的形式存储数据。Neo4j使用本机GPE(图形处理引擎)来使用它的本机图存储格式。
图数据库数据模型的主要构建块是:节点、关系和属性

1.4 Neo4j的构建元素

image.png
**Neo4j**数据模型的主要构建块是:节点、关系属性、标签数据浏览器

  1. 节点:节点Node是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性Property和多个标签Label。节点是主要的数据元素;节点通过关系连接到其他节点;节点可以具有一个或多个属性(即,存储为键/值对的属性);节点有一个或多个标签,用于描述其在图表中的作用。
  2. 关系:关系Relationship同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边Edge ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型Type 。关系连接两个节点;关系是方向性的;节点可以有多个甚至递归的关系 ;关系可以有一个或多个属性(即存储为键/值对的属性)。基于方向性,关系一般被分为单向关系双向关系
  3. 标签:标签Label将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。标签用于将节点分组;一个节点可以具有多个标签;对标签进行索引以加速在图中查找节点;本机标签索引针对速度进行了优化。
  4. 数据浏览器:一旦我们安装了Neo4j就可以通过指定的端口访问其数据浏览器

image.png

2. 环境搭建:Neo4j的下载与安装

Neo4j的安装方式一般来说有四种即:

  1. 基于 Neo4j Enterprise Server
  2. 基于 Neo4j Community Server
  3. 基于 Neo4j Desktop
  4. 基于 Docker 安装

本文主要介绍的是通过第二种方式来安装Neo4j因为相对而言较为简单且免费。
下载地址:https://neo4j.com/download-center/
在下载对应的版本之前需要特别注意的问题是:首先需要确保本计算机中拥有JavaJDK因为在运行其服务的时候需要使用,其次需要注意的是版本对应问题,Neo4j 3.X的版本对应的是JDK 8Neo4j 4.X的版本对应的是JDK 11。因此需要确保在计算机的环境变量中存在JDK
image.png
当下载了对应的压缩包后即可简单地将其解压缩在对应的目录下即可(注意路径不含中文),此后即可在对应的\bin目录下执行相应的命令即可:

# 将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 输出更多信息

通过在浏览器中输入http://localhost:7474/browser/来访问数据浏览器即可,使用用户名neo4j和默认密码neo4j进行连接,然后会提示更改密码。Neo4j Browser是开发人员用来探索Neo4j数据库、执行Cypher查询并以表格或图形形式查看结果的工具。这里更推荐使用服务的方式,因为这样可以避免让控制台一直开着,对于不喜欢底栏一直挂着终端的用户来说简直不要太好。
image.png
如果想要直接在默认控制台中直接执行命令,那么需要将Neo4j的安装路径放到系统的环境变量中,即在高级系统设置中定义变量值为D:\develop\Neo4j\neo4j-community-3.5.35(安装路径)的名为NEO4J_HOME系统变量,并在Path系统变量中添加%NEO4J_HOME%\bin;即可不需要进入到其目录也可以直接执行命令。
image.png

3. Neo4j的基本使用

在介绍其具体的使用方法前先简单介绍一个Neo4j数据浏览器的使用方法:
首先是红色箭头所指向的界面,其代表的就是当前图数据库中的所有数据,Node Labels表示数据库中所有代表节点的标签类型,Relationship Types表示数据库中所有节点之间的关系的标签类型。当点击某个标签类型后会将该标签的节点显示出来,比如此时我点击的是Disease类型那么会将该类型的节点显示在界面上。
image.png
一般来说我们是需要在下图框起来的地方写CQL语句的,比如通过图示的语句查询出标签为Disease的节点并返回25条数据。
image.png
其次介绍蓝色箭头所指向的界面。其代表的是本地收藏的一些脚本,比如点击了右侧黄色箭头所指向的按钮那么就会将该条语句收藏在左边的界面中,方便下次再调用。
1668944760088.png
当点击某个节点的时候会出现如图所示的三个按钮,其中红色箭头所指向的按钮点击后会将该节点隐藏,绿色的则会将其锁定,蓝色的比较特殊,单独再放一张图表示。
image.png
当点击蓝色箭头所指向的按钮时会将与该节点有关的所有节点和关系展开,如下所示:
image.png

3.1 Neo4j - CQL 简介

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

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

3.2 CQL的常用语句

3.2.1 CREATE

  1. 创建节点
#创建简单节点
create (n)
#创建多个节点
create (n),(m)
#创建带标签和属性的节点并返回节点
create (n:person {name:'xzh'}) return n
  1. 创建关系:Neo4j图数据库遵循属性图模型来存储和管理其数据。 根据属性图模型,关系应该是定向的,否则Neo4j将抛出一个错误消息。 基于方向性,Neo4j关系被分为两种主要类型:单向关系和双向关系
#使用新节点创建关系
CREATE (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return
type(r)
#使用已知节点创建带属性的关系
match (n:person {name:'沙僧'}),(m:person{name:'唐僧'})
create (n)-[r:`师傅`{relation:'师傅'}]->(m) return r
#检索关系节点的详细信息
match (n:person)-[r]-(m:person) return n,m
  1. 创建全路径
create p=(:person{name:'蛟魔王'})-[:义兄]->(:person{name:'牛魔王'})<-[:义兄]-
(:person {name:'鹏魔王'}) return p

3.2.2 MATCH

Neo4j CQL MATCH命令用于:

  • 从数据库获取有关节点和属性的数据
  • 从数据库获取有关节点,关系和属性的数据
MATCH (n:`西游`) RETURN n LIMIT 25

3.2.3 RETURN

Neo4j CQL RETURN子句用于

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

需要注意的是id属性的获取不能使用.运算符,Neo4j为我们提供了id(n)函数

MATCH (n:`西游`) RETURN id(n),n.name,n.tail,n.relation

3.2.4 WHRER

类似SQLNeo4j CQLCQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。

MATCH (n:person) where n.name='孙悟空' or n.name='猪八戒' RETURN n
#创建关系
match (n:person),(m:person) where n.name='孙悟空' and m.name='猪八戒'
create (n)-[r:师弟]->(m) return n.name,type(r),m.name

3.2.5 DELETE

Neo4j使用CQL DELETE子句

  • 删除节点。
  • 删除节点及相关节点和关系。
# 删除节点 (前提:节点不存在关系)
MATCH (n:person{name:"白龙马"}) delete n
# 删除关系
MATCH (n:person{name:"沙僧"})<-[r]-(m) delete r return type(r)

3.2.6 REMOVE

有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。

  • 删除节点或关系的标签
  • 删除节点或关系的属性
#删除属性
MATCH (n:role {name:"fox"}) remove n.age return n
#创建节点
CREATE (m:role:person {name:"fox666"})
#删除标签
match (m:role:person {name:"fox666"}) remove m:person return m

3.2.7 SET

有时根据我们的客户端要求,我们需要向现有节点或关系添加新属性。要做到这一点,Neo4j CQL提供了一个SET子句。

  • 向现有节点或关系添加新属性
  • 添加或更新属性值
MATCH (n:role {name:"fox"}) set n.age=32 return n

3.2.8 ORDER BY

Neo4j CQLMATCH命令中提供了ORDER BY子句,对MATCH查询返回的结果进行排序。 我们可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。一般来说ORDER BY语句都是写在RETURN子句内的。

MATCH (n:`西游`) RETURN id(n),n.name order by id(n) desc

3.2.9 UNIQUE

SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
UNION :它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。 但是限制就是结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION ALL :它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。但是限制就是结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

MATCH (n:role) RETURN n.name as name
UNION
MATCH (m:person) RETURN m.name as name
MATCH (n:role) RETURN n.name as name
UNION all
MATCH (m:person) RETURN m.name as name

3.2.10 LIMIT & SKIP

Neo4j CQL已提供 LIMIT子句和 SKIP来过滤或限制查询返回的行数。LIMIT返回前几行,SKIP忽略前几行。

# 前两行
MATCH (n:`西游`) RETURN n LIMIT 2
# 忽略前两行
MATCH (n:person) RETURN n SKIP 2

3.2.11 NULL

Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。

match (n:`西游`) where n.label is null return id(n),n.name,n.tail,n.label

3.2.12 IN

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

match (n:`西游`) where n.name in['孙悟空','唐僧'] return
id(n),n.name,n.tail,n.label

3.2.13 INDEX索引操作

Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。 我们可以为具有相同标签名称的所有节点的属性创建索引。我们可以在MATCHWHEREIN运算符上使用这些索引列来改进CQL Command的执行。

# 创建索引
create index on :`西游` (name)
# 删除索引
drop index on :`西游` (name)

3.2.14 UNIQUE约束

Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。像SQL一样,Neo4j数据库也支持对NODERelationship的属性的UNIQUE约束。
UNIQUE约束的优点:

  1. 避免重复记录。
  2. 强制执行数据完整性规则
#创建唯一约束
create constraint on (n:xiyou) assert n.name is unique
#删除唯一约束
drop constraint on (n:xiyou) assert n.name is unique

3.2.15 DISTINCT

这个函数的用法就像SQL中的distinct关键字,返回的是所有不同值。

match (n:`西游`) return distinct(n.name)

3.3 CQL常用函数

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

3.3.1 String 字符串

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

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

3.3.2 Aggregation 聚合

聚集功能描述
COUNT它返回由MATCH命令返回的行数
MAX它从MATCH命令返回的一组行返回最大值
MIN它返回由MATCH命令返回的一组行的最小值
SUM它返回由MATCH命令返回的所有行的求和值
AVG它返回由MATCH命令返回的所有行的平均值
#使用的例子
MATCH (e) RETURN count(e)

3.3.3 Relationship 关系

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

3.4数据库的备份和恢复

3.4.1 数据库备份

Neo4j数据进行备份操作时,要关闭Neo4j服务

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

3.4.2 数据库恢复

Neo4j数据进行还原、迁移操作时,要关闭Neo4j服务

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

哔哩哔哩相关教程的链接:https://www.bilibili.com/video/BV1HQ4y1h78j?share_source=copy_web对于本课程的本人的客观评价(不代表其他舆论)为:老师讲课水平一般,会翻车,但是PPT相对而言还算不错,对于Neo4j来说市面上的入门教程并不多,官方文档不宜入门,该课程也还算勉勉强强了。对于不想听课的人来说本文章完全能够满足使用的需求。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值