【初识Graph Database】01-Neo4j的环境搭建和基本使用

562 阅读10分钟

背景与介绍

Neo4j是一个高性能的开源的图数据库。它是世界上第一个并且也是最受欢迎的图形数据库之一。Neo4j还支持多种语言的客户端应用开发,如Java、Python、JavaScript、Golang等。

图数据库

图数据库是一种专门用于处理图数据结构的数据库。在图数据库中,数据以图的形式存储,图由节点(vertices)和连接节点的边(edges)组成。节点可以表示实体或对象,而边则表示节点之间的关系。这种表示方式非常适合表示复杂的、高度互联的数据模型。

Neo4j的特点

  1. 图结构:Neo4j数据库以图的形式存储数据,每个节点和边都有属性,这使得它非常适合表示复杂的实体和关系。
  2. Cypher查询语言:Neo4j使用Cypher查询语言来进行数据查询和操作。Cypher是一种声明式的图形查询语言,类似于SQL,但是针对图数据库而设计。
  3. 高性能:由于Neo4j专注于图结构,它在处理复杂查询和大规模连接时表现出色。这使得Neo4j成为处理实时查询和高度关联数据的理想选择。
  4. 灵活性:Neo4j的模式是动态的,允许您随时更改图的结构和属性,而无需先定义严格的表结构。
  5. ACID事务:Neo4j支持ACID(原子性、一致性、隔离性和持久性)事务,确保数据的完整性和一致性。
  6. 社区支持和插件:Neo4j有一个活跃的社区,提供了许多有用的插件和扩展,以满足各种需求

图数据库的应用场景

  • 社交网络分析:用于分析和探索社交网络中的关系和社区结构。
  • 推荐系统:用于构建个性化的推荐引擎,推荐相关的内容或产品。
  • 实时推荐:用于实时推送相关信息,例如即时新闻或社交媒体更新。
  • 知识图谱:用于构建和查询知识图谱,连接不同领域的知识点。

环境搭建

Neo4j的环境搭建非常简单,我们可以选择多种方式进行环境搭建,下面演示两种:

二进制文件部署

  1. 安装JDK环境, 这里采用17。JDK的安装不再赘述,读者可自行查找教程。

  2. 下载Neo4j的官方Community版本发布包。[Neo4j下载地址](Neo4j Download Center - Graph Database & Analytics),读者这里使用Window进行演示,故下载Windows版本,如果有其他平台需要可以自行选择对应版本下载。这里我们选择最新版本版本即可。

    注意:5.10.0需要JDK17、4.4.23需要JDK11 image.png

  3. 解压下载的应用包,其中包含内容如下: image.png

  4. 执行命令

# 替换到自己的解压路径
cd D:\Develop\neo4j-community-5.10.0\bin
./neo4j.bat console

当出现以下内容表示成功,通过http://localhost:7474/访问Neo4j控制台。

image.png 6. 登录控制台与修改默认密码

image.png 控制台默认用户名:neo4j/neo4j,第一次登录后需要重置密码 image.png

Docker镜像部署

Docker部署相对简单

  1. 通过Docker命令拉取进行并启动
docker run --name=neo4j --publish=7474:7474 --publish=7687:7687 --volume=D:/Develop/neo4j/data:/data neo4j
  1. 登录操作同二进制文件部署

基本使用

CQL介绍

Neo4j CQL -

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言
  • 它遵循SQL语法。
  • 它的语法是非常简单且人性化、可读的格式。

Neo4j CQL命令

命令用法
CREATE创建节点,关系和属性
MATCH检索有关节点,关系和属性数据
RETURN返回查询结果
WHERE提供条件过滤检索数据
DELETE排序检索数据
REMOVE排序检索数据
ORDER BY排序检索数据
SET添加或更新标签

Neo4j CQL数据类型

Neo4j CQL支持以下数据类型:

数据类型说明
boolean用于表示布尔文字:true,false。
byte用于表示8位整数
short用于表示16位整数
int用于表示32位整数
long用于表示64位整数
float用于表示16位整数
double用于表示32位整数
char用于表示16位字符
String用于表示字符串

Neo4j CQL 函数

以下是常用的Neo4j CQL函数:

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

增删改查命令

CREATE命令

Neo4j使用CQL CREATE命令

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

命令格式:

CREATE (<node-name>:<label-name> {
    <Property1-name>:<Property1-Value>,
    ......
     <Property1-name>:<Property1-Value>
})

ep:CREATE (p:Person {name:"zhangsan",age:10})
  1. CREATE:Neo4j CQL命令。
  2. node-name:要创建的节点名称。
  3. label-name:节点标签名称
  4. Property1-name:创建带有属性的节点

image.png

MATCH命令

Neo4j CQL MATCH 命令用于

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

命令格式:

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

ep:MATCH (n:Person) RETURN n
  1. MATCH:Neo4j CQL命令。
  2. node-name:要查询的节点名称。
  3. label-name:节点标签名称
  4. MATCH需要配合RETURNDELETE等其他命令一起使用

MATCH RETURN命令

Neo4j CQL RETURN子句用于

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性 命令格式:
RETURN <node-name>.<property1-name>, 
    ........ 
    <node-name>.<propertyn-name>,
ep: MATCH (p:Person) RETURN p.name
  1. node-name:查询的节点名称
  2. property1-name:查询的节点属性

image.png

创建关系

Neo4j图数据库遵循属性图模型来存储和管理其数据。根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。

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

  • 单向关系
  • 双向关系

命令格式:

CREATE (<node1-name>:<label1-name>)- [<relationship-name>:<relationship-label-name>] ->(<node2-name>:<label2-name>)
ep: 
CREATE(u:User {name:"zhangsan"})-[r:like]->(c:Content {type:"moive"})
  1. node1-name:label1-name:是from node的节点名称和标签
  2. node2-name:label2-name:是to node的节点名称和标签
  3. relationship-name:relationship-label-name:是关系名称和关系标签

image.png

WHERE子句

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

命令格式:

WHERE <condition> <boolean-operator> <condition>
ep: MATCH (u:User) WHERE u.name="zhangsan" RETURN u
  1. WHERE:Neo4j CQL关键字。
  2. property-name:节点或关系的属性名称。
  3. comparison-operator:Neo4j CQL比较运算符
  4. value:一个字面值,如数字文字,字符串文字等。

image.png

运算符

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

布尔运算符描述
AND它是一个支持AND操作的Neo4j CQL关键字。
OR它是一个Neo4j CQL关键字来支持OR操作。
NOT它是一个Neo4j CQL关键字支持NOT操作。 
XOR它是一个支持XOR操作的Neo4j CQL关键字。 

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

布尔运算符描述
=它是Neo4j CQL“等于”运算符。
<>它是一个Neo4j CQL“不等于”运算符。
<它是一个Neo4j CQL“小于”运算符。
它是一个Neo4j CQL“大于”运算符。
<=它是一个Neo4j CQL“小于或等于”运算符。
>=它是一个Neo4j CQL“大于或等于”运算符。

MATCH + WHERE + CREATE创建关系

在前面的的内容中我们通过CREATE命令创建了一个关系,我们可以还可以通过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>) 

ep:MATCH (u:User), (c:Content) 
WHERE u.name="lisi" and c.type="music" 
CREATE (u)-[r:like]->(c)

DELETE命令

Neo4j使用CQL DELETE子句

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

删除节点

DELETE <node1-name>,<node2-name>
ep: MATCH (a:anime)  delete a

image.png

删除节点关系

通过使用此命令,我们可以从数据库永久删除节点及其关联的属性。 命令语法:

DELETE <node1-name>,<node2-name>,<relationship-name>
ep: match (u:User),(c:Content),(u:User)-[r:like]->(c:Content) where c.type="music" delete r
  1. DELETE:Neo4j CQL关键字。
  2. node-name-list:要从数据库中删除的节点名称列表,使用逗号(,)运算符来分隔节点名。
  3. relationship-name: 关系名

image.png 执行命令后效果:

image.png

SET子句

Neo4j CQL 已提供 SET 子句来向现有节点或关系添加新属性。

  • 向现有节点或关系添加新属性
  • 添加或更新属性值 命令语法:
SET <node-label-name>.<property1-name>, 
    <node-label-name>.<property2-name>, 
    .... 
    <node-label-name>.<propertyn-name>
ep: match (u:User) where u.name="wangwu" set u.age=20
  1. node-label-name:节点的标签名称。
  2. property-name:节点的属性名。

image.png

REMOVE命令

Neo4j CQL REMOVE命令用于

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

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

  • DELETE操作用于删除节点和关联关系。
  • REMOVE操作用于删除标签和属性。 命令语法:
REMOVE <node-label-name>.<property1-name>, 
    <node-label-name>.<property2-name>, 
    .... 
    <node-label-name>.<propertyn-name>
ep:  match (u:User) where u.name="wangwu" REMOVE u.age
  1. node-label-name:节点的标签名称。
  2. property-name:节点的属性名。

ORDER BY排序

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

ORDER BY <node-label-name>.<property1-name>, 
    <node-label-name>.<property2-name>, 
    .... 
    <node-label-name>.<propertyn-name>
ep:  match (u:User) return u.name ORDER BY u.name DESC
  1. ORDER:Neo4j CQL关键字。
  2. node-label-name:节点的标签名称。
  3. property-name:节点的属性名。

image.png

LIMIT SKIP子句

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

SKIP <number1> LIMIT <number2>
ep: match (u:User) return u.name ORDER BY u.name DESC skip 1 limit 1 
  1. number1:跳过的行数
  2. number2:返回的条数

image.png

NULL值和IN操作

NULL值操作

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

image.png 对于NULL值的查询可以使用IS NULLIS NOT NULL进行查询 image.png

IN条件

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

命令语法:

IN[<Collection-of-values>]
ep: match (u:User) where u.name in ["zhangsan","wangwu"] return u.name
  1. Collection-of-values:逗号隔开的值的集合

image.png

UNION合并操作

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

  • UNION
  • UNION ALL

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

命令语法:

<MATCH Command1> 
UNION 
<MATCH Command2>
ep:match(u:User) where u.name="zhangsan" return u union match(u:User) where u.name="wangwu" return u
  1. MATCH Command1:CQL MATCH命令,由UNION子句使用。
  2. UNION:Neo4j CQL关键字
  3. MATCH Command2:CQL MATCH命令,由UNION子句使用。

image.png

MERGE操作

Neo4j CQL MERGE命令在图中搜索给定模式,如果存在,则返回结果,如果它不存在于图中,则它创建新的节点/关系并返回结果。 命令语法:

MERGE (<node-name>:<label-name> { 
    <Property1-name>:<Property1-Value> 
    ..... 
    <Propertyn-name>:<Propertyn-Value> 
})
ep:merge(ct:city{name:"nanjing"})
  1. MERGE:Neo4j CQL关键字。
  2. node-name:节点或关系的名称。
  3. label-name:节点或关系的标签名称。
  4. Propertyn-name:节点或关系的属性名称。
  5. Propertyn-Value:节点或关系的属性值。
  6. ::运算符来分隔节点或关系的属性名称和值。

image.png

image.png

总结

在本文章中,我们尝试进行了Neo4j的Windows环境安装以及了解了Neo4j的基本操作命令。下一章我们将了解如何通过Java对Neo4j数据库进行操作, 以及如何整合Springboot使用Neo4j数据库。