一、Neo4j 安装
1、Windows 安装
(1)准备环境
最新版需要 JDK 17 环境。
(2)下载
下载地址:https://neo4j.com/deployment-center/ 社区版免费,支持 Windows、Linux、Mac 等操作系统。此处以 Windows 为例。
(3)解压
解压下载的压缩包。
(4)运行
直接执行 . eo4j.bat console,会有命令提示。
访问 http://localhost:7474/。
第一次进入页面,默认用户名密码为 neo4j/neo4j,需设置新密码。
(5)基本使用
登录后可在浏览器界面进行基本操作。
2、Docker 安装
docker pull neo4j:3.5.22-community
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
二、Cypher 语句
1、Cypher 简介
Cypher 是 Neo4j 的查询语言,用于创建、查询和更新图数据。
2、CREATE 命令,创建节点、关系、属性
-- 创建带有属性的节点
CREATE (zhangsan:Student {id: 1, name: 'zhangsan', age: 13})
-- 创建 Student 和 Teacher 的图
CREATE (stu:Student)
CREATE (tea:Teacher)
3、MATCH 命令,查询
MATCH 需要配合 RETURN 使用。
MATCH (stu:Student)
RETURN stu
不配合 RETURN 或 UPDATE 语句会报错。
4、RETURN 语句
-- 示例
MATCH (s:Student)
RETURN s
-- 或者直接返回属性
MATCH (s:Student)
RETURN s.id, s.name, s.age
5、WHERE 子句
-- 条件查询
MATCH (emp:Employee)
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp
-- 查询多个,但是没有条件,可以查询后做关系
MATCH (d:Dog), (c:Cat)
WHERE d.name = 'dog1' OR c.name = 'cat1'
RETURN d, c
6、创建关系
-- 创建数据
CREATE (d:Dog {id: 1, name: 'dog1', age: 1})
CREATE (c:Cat {id: 2, name: 'cat1', age: 2})
-- 使用新节点创建关系
CREATE (d:Dog)-[r:Like]->(c:Cat)
-- 已知节点 创建带属性的关系 使用 WHERE
MATCH (d:Dog), (c:Cat)
WHERE d.name = 'dog1' AND c.name = 'cat1'
CREATE (d)-[r:love {info: 'loveit'}]->(c)
RETURN r
-- 检索关系详情
MATCH (d)-[r:love]->(c)
RETURN d, r, c
7、DELETE 删除节点和关系
-- 删除节点,如果有关系需要先删除
MATCH (stu:Student)
DELETE stu
-- 删除关系
MATCH (d)-[r:love]->(c)
DELETE r
8、REMOVE 删除标签和属性
-- 创建多个标签多个属性
CREATE (m:Movie:Pic {id: '1', name: 'test'})
-- 删除标签
MATCH (m:Movie:Pic)
REMOVE m:Pic
-- 删除属性并返回
MATCH (m:Movie:Pic)
REMOVE m.name
RETURN m
9、SET 添加、更新属性
-- 添加属性
MATCH (book:Book)
SET book.title = 'superstar'
RETURN book
10、ORDER BY 排序
-- 默认升序
MATCH (emp:Employee)
RETURN emp.empid, emp.name, emp.salary, emp.deptno
ORDER BY emp.name
11、UNION 合并
UNION 子句将两组结果中的公共行组合并返回到一组结果中,不返回重复行。
-- UNION 合并
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 结合并返回两个结果集的所有行,包括重复行。
12、LIMIT 和 SKIP 子句
-- 返回前两行
MATCH (emp:Employee)
RETURN emp LIMIT 2
-- 跳过两行
MATCH (emp:Employee)
RETURN emp SKIP 2
-- 实现分页,跳过 1 行然后返回 2 行
MATCH (emp:Employee)
RETURN emp SKIP 1 LIMIT 2
13、MERGE 合并
MERGE 命令是 CREATE 和 MATCH 的组合。如果模式存在则返回,不存在则创建。
-- 语法
MERGE (n:Label {Property1: Value1})
14、NULL 值
-- 过滤 null
MATCH (e:Employee)
WHERE e.id IS NOT NULL
RETURN e.id, e.name, e.sal, e.deptno
MATCH (e:Employee)
WHERE e.id IS NULL
RETURN e.id, e.name, e.sal, e.deptno
15、IN 操作符
-- 示例
MATCH (e:Employee)
WHERE e.id IN [123, 124]
RETURN e.id, e.name, e.sal, e.deptno
16、INDEX 索引
-- 创建索引
CREATE INDEX ON :Customer(name)
-- 删除索引
DROP INDEX ON :Customer(name)
17、UNIQUE 唯一约束
-- 语法
CREATE CONSTRAINT ON (n:Label) ASSERT n.property IS UNIQUE
DROP CONSTRAINT ON (n:Label) ASSERT n.property IS UNIQUE
-- 示例
CREATE CONSTRAINT ON (cc:CreditCard) ASSERT cc.number IS UNIQUE
DROP CONSTRAINT ON (cc:CreditCard) ASSERT cc.number IS UNIQUE
18、DISTINCT 去重
-- 示例
MATCH (n)
RETURN DISTINCT n.name LIMIT 25
三、函数
1、字符串函数
-- 字符串转大写
MATCH (e:Employee)
RETURN e.id, UPPER(e.name), e.sal, e.deptno
-- 字符串转小写
MATCH (e:Employee)
RETURN e.id, LOWER(e.name), e.sal, e.deptno
-- 分隔字符串
MATCH (e:Employee)
RETURN e.id, SUBSTRING(e.name, 0, 2), e.sal, e.deptno
-- 替换字符
MATCH (e:Employee)
RETURN e.id, REPLACE(e.name, 'a', 'z'), e.sal, e.deptno
2、AGGREGATION 聚合
类似于 SQL 中的 GROUP BY 子句。
3、关系函数
获取开始节点、结束节点等关系细节。
四、数据备份与恢复
1、备份
# 备份前需要关闭数据库
./neo4j stop
# 导出到文件
./neo4j-admin dump --database=graph.db --to=/home/2024.dump
# 启动数据库
./neo4j start
2、数据恢复
# 备份前需要关闭数据库
./neo4j stop
# 从文件导入
./neo4j-admin load --from=/home/2024-10-02.dump --database=graph.db --force
# 启动数据库
./neo4j start
五、复杂查询
1、查询指定深度的间接关系
MATCH (p1:Person {name: 'Alice'})-[*..3]-(p2:Person)
WHERE p1 <> p2
RETURN p1, p2
2、查询最短路径的间接关系
MATCH (p1:Person {name: 'Alice'}), (p2:Person {name: 'Bob'})
MATCH path = shortestPath((p1)-[*]-(p2))
RETURN path
3、查询特定关系类型的间接关系
MATCH (p1:Person {name: 'Alice'})-[r:FRIEND_OF*..3]-(p2:Person)
WHERE p1 <> p2
RETURN p1, p2, r
4、限制关系路径中的节点类型
MATCH (p1:Person {name: 'Alice'})-[(*..3)]-(p2:Person)
WHERE p1 <> p2 AND ALL(n IN nodes(path) WHERE n:Person)
RETURN p1, p2
5、使用变量长度路径和过滤条件
MATCH (p1:Person {name: 'Alice'})-[(*..3)]-(p2:Person)
WHERE p1 <> p2 AND ANY(n IN nodes(path) WHERE n.age > 30)
RETURN p1, p2
六、Spring Boot 使用 Neo4j
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
2、配置文件
# Neo4j 配置
spring.neo4j.uri=bolt://localhost:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=cxf123!!
附录:neo4j.conf 汉化版
# 自定义数据存储路径
#dbms.active_database=graph.db
#dbms.directories.data=data
# 允许非本地连接
dbms.connectors.default_listen_address=0.0.0.0
# Bolt 连接器
dbms.connector.bolt.enabled=true
dbms.connector.bolt.listen_address=:7687
# HTTP Connector
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=:7474
# JVM 参数
dbms.jvm.additional=-XX:+UseG1GC
dbms.jvm.additional=-XX:-OmitStackTraceInFastThrow
dbms.jvm.additional=-XX:+AlwaysPreTouch
dbms.jvm.additional=-XX:+UnlockExperimentalVMOptions
dbms.jvm.additional=-XX:+TrustFinalNonStaticFields
dbms.jvm.additional=-XX:+DisableExplicitGC
dbms.jvm.additional=-Djdk.tls.ephemeralDHKeySize=2048


