Neo4j图数据库入门笔记
一、Neo4j介绍
1、图数据库介绍
1.1 简介
随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生
图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。
1.2 对比关系型数据库
关系型数据库(RDBMS) | 图数据库 |
---|---|
表 | 图 |
行 | 节点 |
列和数据 | 属性和数据 |
约束 | 关系 |
1.3 对比其他NoSQL数据库
分类 | 数据模型 | 优势 | 劣势 | 举例 |
---|---|---|---|---|
键值数据库 | 哈希表 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 | Redis |
列存储数据库 | 列式数据存储 | 查找速度快;支持分布横向扩展;数据压缩率高 | 功能相对受限 | HBase |
文档型数据库 | 键值对扩展 | 数据结构要求不严格;表结构可变;不需要预先定义表结构 | 查询性能不高,缺乏统一的查询语法 | MongoDB |
图数据库 | 节点和关系组成的图 | 利用图结构相关算法(最短路径、节点度关系查找等) | 可能需要对整个图做计算,不利于图数据分布存储 | Neo4j、 JanusGraph |
2、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查询语言命令是人性化的可读格式,非常容易学习
-
使用简单而强大的数据模型
-
不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引
3、Neo4j构建元素
3.1 节点
节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。
-
节点是主要的数据元素
-
节点通过关系连接到其他节点
-
节点可以具有一个或多个属性(即,存储为键/值对的属性)
-
节点有一个或多个标签,用于描述其在图表中的作用
3.2 属性
属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何Neo4j数据类型来表示
-
属性是命名值,其中名称(或键)是字符串
-
属性可以被索引和约束
-
可以从多个属性创建复合索引
3.3 关系
关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。
-
关系连接两个节点
-
关系是方向性的
-
节点可以有多个甚至递归的关系
-
关系可以有一个或多个属性(即存储为键/值对的属性)
基于方向性,Neo4j关系被分为两种主要类型:
-
单向关系
-
双向关系
3.4 标签
标签(Label)将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。标签用于将节点分组
-
一个节点可以具有多个标签
-
对标签进行索引以加速在图中查找节点
-
本机标签索引针对速度进行了优化
4、使用场景
-
欺诈检测
-
实时推荐引擎
-
知识图谱
-
反洗钱
-
主数据管理
-
供应链管理
-
增强网络和IT运营管理能力
-
数据谱系
-
身份和访问管理
-
材料清单
-
社交网络
二、Neo4j环境安装
1、直接安装Neo4j Server
下载地址:https://neo4j.com/download-center/
注意最新版4.x对应的是jdk11,jdk8的可以安装3.x,这里使用社区版(free);另外推荐安装desktop版本
下载完成后解压到新目录,注意不要有中文
1 | # 将Neo4j作为控制台应用程序运行 |
浏览器中访问http://localhost:7474
。使用用户名neo4j和默认密码neo4j进行连接,然后会提示更改密码。Neo4j Browser是开发人员用来探索Neo4j数据库、执行Cypher查询并以表格或图形形式查看结果的工具。
2、docker安装Neo4j Server
首先要注意端口的暴露
-
HTTP:7474
-
HTTPS:7473
-
Bolt:7687
普通docker部署
1 | docker run -d --name container_name \ //-d表示容器后台运行 --name指定容器名字 |
docker-compose启动
1 | version: '3' |
三、Neo4j - CQL使用
1、CQL简介
Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言。像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言
-
是Neo4j图形数据库的查询语言
-
是一种声明性模式匹配语言
-
遵循SQL语法
-
语法是非常简单且人性化、可读的格式
CQL命令 | 作用 |
---|---|
CREATE | 创建节点,关系和属性 |
MATCH | 检索有关节点,关系和属性数据 |
RETURN | 返回查询结果 |
WHERE | 提供条件过滤检索数据 |
DELETE | 删除节点和关系 |
REMOVE | 删除节点和关系的属性 |
ORDER BY | 排序检索数据 |
SET | 添加或更新标签 |
2、CQL常用命令
首先初始化一个库
1 | create (老九门:teleplay {name:'老九门',author:"南派三叔",bron:2016}) |
当然也可以文件导入,
1 | #将csv拷贝到 %NEO4J_HOME%\import目录 |
2.1 CREATE创建
create语句是创建模型语句,用来创建数据模型,类似于数据库insert
创建节点
1 | #创建简单节点 |
创建关系
Neo4j关系被分为两种主要类型
-
单向关系
-
双向关系
1 | #使用新节点创建关系并展示关系 |
创建全路径
1 | CREATE p=(:person{name:'尹新月del'})-[:夫妻]->(:person{name:'张启山del'})<-[:副官]-(:person {name:'张副官del'}) RETURN p |
2.2 MATCH查询
-
从数据库获取有关节点和属性的数据
-
从数据库获取有关节点,关系和属性的数据类似于数据库
select
1 | # 分页查询25个节点 |
2.3 RETURN返回
-
检索节点的某些属性
-
检索节点的所有属性
-
检索节点和关联关系的某些属性
-
检索节点和关联关系的所有属性
1 | # 查询患难之交 |
2.4 DELETE删除
-
删除节点
-
删除节点及相关节点和关系
1 | # 删除节点 (前提:节点不存在关系) |
2.5 REMOVE删除
-
删除节点或关系的标签
-
删除节点或关系的属性
1 | #删除属性 |
2.6 SET子句
-
向现有节点或关系添加新属性
-
添加或更新属性值
1 | # 添加或改变张启山del年龄为26 |
2.7 ORDER BY排序
ORDER BY命令用于对MATCH查询返回的结果进行排序。可以按升序或降序对行进行排序。默认情况下为升序对行进行排序, 如果要按降序对结果进行排序,需要使用DESC子句
1 | # 按id降序 |
2.8 UNION子句
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
-
UNION:将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行
限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同 -
UNION ALL:它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行
限制:结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的
1 | # UNION |
2.9 LIMIT和SKIP子句
CQL提供LIMIT子句和SKIP来过滤或限制查询返回的行数
-
LIMIT:返回前几行
-
SKIP:忽略前几行
1 | # 返回前10行 |
2.10 NULL值
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值,当创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点
1 | match (n:person) where n.name is null return id(n),n.name |
2.11 IN操作符
IN用于提供值的集合,类似于SQL中的in
1 | match (n:person) where n.name in['张启山','二月红'] return id(n),n.name |
2.12 INDEX索引
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。可以为具有相同标签名称的所有节点的属性创建索引,然后在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL命令的执行
索引操作:
-
CREATE INDEX创建索引
-
DROP INDEX丢弃索引
1 | # 创建索引 |
2.13 UNIQUE约束
UNIQUE约束的作用:
-
避免重复记录(唯一约束)
-
强制执行数据完整性规则
1 | #创建唯一约束 |
2.14 DISTINCT
像SQL中的distinct关键字,返回的是所有不同值
1 | match (n:person) return distinct(n.name) |
3、常用函数
函数 | 作用 |
---|---|
String 字符串 | 用于使用String字面量 |
Aggregation 聚合 | 用于对CQL查询结果执行一些聚合操作 |
Relationship 关系 | 用于获取关系的细节,如startnode,endnode等 |
字符串函数
函数 | 作用 |
---|---|
UPPER | 用于将所有字母更改为大写字母 |
LOWER | 用于将所有字母改为小写字母 |
SUBSTRING | 用于获取给定String的子字符串 |
REPLACE | 用于替换一个字符串的子字符串 |
MATCH (n) RETURN id(n),n.name,substring(n.name,0,2)
AGGREGATION聚合
在RETURN子句中使用的聚合函数,类似于SQL中的GROUP BY子句。可以使用MATCH命令中的RETURN + 聚合函数来处理一组节点并返回一些聚合值
函数 | 作用 |
---|---|
COUNT | 返回由MATCH命令返回的行数 |
MAX | 从MATCH命令返回的一组行返回最大值 |
MIN | 返回由MATCH命令返回的一组行的最小值 |
SUM | 返回由MATCH命令返回的所有行的求和值 |
AVG | 返回由MATCH命令返回的所有行的平均值 |
MATCH (n) RETURN count(n)
关系函数
在获取开始节点,结束节点等细节时知道关系的细节
函数 | 作用 |
---|---|
STARTNODE | 用于知道关系的开始节点 |
ENDNODE | 用于知道关系的结束节点 |
ID | 用于知道关系的ID |
TYPE | 用于知道字符串表示中的一个关系的TYPE |
match (m)-[r] ->(n) return id(r),type(r)
4、neo4j-admin使用(对于直接安装server使用)
数据库备份
对Neo4j数据进行备份、还原、迁移的操作时,要关闭neo4j
1 | #关闭 neo4j |
数据库恢复
对Neo4j进行还原、迁移之前,要关闭neo4j服务
1 | #数据导入 |
5、利用CQL构建明星关系图谱
1 | #导入明星数据 |
四、SpringBoot整合Neo4j
1、环境与相关配置
首先添加依赖,这里我的springboot版本是2.6.x,Neo4j版本为6.x,不同版本之间差距很大
1 | <dependency> |
application.yml配置
1 | spring: |
2、整合Neo4j测试
首先创建Person类
1 |
|
创建PersonRepository
接口,继承Neo4jRepository接口后里面实现了很多常用方法,类似与MYSQL,这里我们也可以自定义CQL进行编写
1 |
|
创建测试类
1 |
|