背景与介绍
Neo4j是一个高性能的开源的图数据库。它是世界上第一个并且也是最受欢迎的图形数据库之一。Neo4j还支持多种语言的客户端应用开发,如Java、Python、JavaScript、Golang等。
图数据库
图数据库是一种专门用于处理图数据结构的数据库。在图数据库中,数据以图的形式存储,图由节点(vertices)和连接节点的边(edges)组成。节点可以表示实体或对象,而边则表示节点之间的关系。这种表示方式非常适合表示复杂的、高度互联的数据模型。
Neo4j的特点
- 图结构:Neo4j数据库以图的形式存储数据,每个节点和边都有属性,这使得它非常适合表示复杂的实体和关系。
- Cypher查询语言:Neo4j使用Cypher查询语言来进行数据查询和操作。Cypher是一种声明式的图形查询语言,类似于SQL,但是针对图数据库而设计。
- 高性能:由于Neo4j专注于图结构,它在处理复杂查询和大规模连接时表现出色。这使得Neo4j成为处理实时查询和高度关联数据的理想选择。
- 灵活性:Neo4j的模式是动态的,允许您随时更改图的结构和属性,而无需先定义严格的表结构。
- ACID事务:Neo4j支持ACID(原子性、一致性、隔离性和持久性)事务,确保数据的完整性和一致性。
- 社区支持和插件:Neo4j有一个活跃的社区,提供了许多有用的插件和扩展,以满足各种需求
图数据库的应用场景
- 社交网络分析:用于分析和探索社交网络中的关系和社区结构。
- 推荐系统:用于构建个性化的推荐引擎,推荐相关的内容或产品。
- 实时推荐:用于实时推送相关信息,例如即时新闻或社交媒体更新。
- 知识图谱:用于构建和查询知识图谱,连接不同领域的知识点。
环境搭建
Neo4j的环境搭建非常简单,我们可以选择多种方式进行环境搭建,下面演示两种:
二进制文件部署
-
安装JDK环境, 这里采用17。JDK的安装不再赘述,读者可自行查找教程。
-
下载Neo4j的官方Community版本发布包。[Neo4j下载地址](Neo4j Download Center - Graph Database & Analytics),读者这里使用Window进行演示,故下载Windows版本,如果有其他平台需要可以自行选择对应版本下载。这里我们选择最新版本版本即可。
注意:5.10.0需要JDK17、4.4.23需要JDK11
-
解压下载的应用包,其中包含内容如下:
-
执行命令
# 替换到自己的解压路径
cd D:\Develop\neo4j-community-5.10.0\bin
./neo4j.bat console
当出现以下内容表示成功,通过http://localhost:7474/访问Neo4j控制台。
6. 登录控制台与修改默认密码
控制台默认用户名:neo4j/neo4j,第一次登录后需要重置密码
Docker镜像部署
Docker部署相对简单
- 通过Docker命令拉取进行并启动
docker run --name=neo4j --publish=7474:7474 --publish=7687:7687 --volume=D:/Develop/neo4j/data:/data neo4j
- 登录操作同二进制文件部署
基本使用
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})
- CREATE:Neo4j CQL命令。
- node-name:要创建的节点名称。
- label-name:节点标签名称
- Property1-name:创建带有属性的节点
MATCH命令
Neo4j CQL MATCH 命令用于
- 从数据库获取有关节点和属性的数据
- 从数据库获取有关节点,关系和属性的数据
命令格式:
MATCH (<node-name>:<label-name>)
ep:MATCH (n:Person) RETURN n
- MATCH:Neo4j CQL命令。
- node-name:要查询的节点名称。
- label-name:节点标签名称
MATCH需要配合RETURN、DELETE等其他命令一起使用
MATCH RETURN命令
Neo4j CQL RETURN子句用于
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性 命令格式:
RETURN <node-name>.<property1-name>,
........
<node-name>.<propertyn-name>,
ep: MATCH (p:Person) RETURN p.name
- node-name:查询的节点名称
- property1-name:查询的节点属性
创建关系
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"})
- node1-name:label1-name:是from node的节点名称和标签
- node2-name:label2-name:是to node的节点名称和标签
- relationship-name:relationship-label-name:是关系名称和关系标签
WHERE子句
Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
命令格式:
WHERE <condition> <boolean-operator> <condition>
ep: MATCH (u:User) WHERE u.name="zhangsan" RETURN u
- WHERE:Neo4j CQL关键字。
- property-name:节点或关系的属性名称。
- comparison-operator:Neo4j CQL比较运算符
- value:一个字面值,如数字文字,字符串文字等。
运算符
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
删除节点关系
通过使用此命令,我们可以从数据库永久删除节点及其关联的属性。 命令语法:
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
- DELETE:Neo4j CQL关键字。
- node-name-list:要从数据库中删除的节点名称列表,使用逗号(,)运算符来分隔节点名。
- relationship-name: 关系名
执行命令后效果:
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
- node-label-name:节点的标签名称。
- property-name:节点的属性名。
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
- node-label-name:节点的标签名称。
- 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
- ORDER:Neo4j CQL关键字。
- node-label-name:节点的标签名称。
- property-name:节点的属性名。
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
- number1:跳过的行数
- number2:返回的条数
NULL值和IN操作
NULL值操作
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
对于NULL值的查询可以使用
IS NULL和IS NOT NULL进行查询
IN条件
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
命令语法:
IN[<Collection-of-values>]
ep: match (u:User) where u.name in ["zhangsan","wangwu"] return u.name
- Collection-of-values:逗号隔开的值的集合
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
- MATCH Command1:CQL MATCH命令,由UNION子句使用。
- UNION:Neo4j CQL关键字
- MATCH Command2:CQL MATCH命令,由UNION子句使用。
MERGE操作
Neo4j CQL MERGE命令在图中搜索给定模式,如果存在,则返回结果,如果它不存在于图中,则它创建新的节点/关系并返回结果。 命令语法:
MERGE (<node-name>:<label-name> {
<Property1-name>:<Property1-Value>
.....
<Propertyn-name>:<Propertyn-Value>
})
ep:merge(ct:city{name:"nanjing"})
- MERGE:Neo4j CQL关键字。
- node-name:节点或关系的名称。
- label-name:节点或关系的标签名称。
- Propertyn-name:节点或关系的属性名称。
- Propertyn-Value:节点或关系的属性值。
::运算符来分隔节点或关系的属性名称和值。
总结
在本文章中,我们尝试进行了Neo4j的Windows环境安装以及了解了Neo4j的基本操作命令。下一章我们将了解如何通过Java对Neo4j数据库进行操作, 以及如何整合Springboot使用Neo4j数据库。