图数据库 Neo4j 搭建与使用
1. 图数据库介绍
1.1 什么是图数据库
图数据库是一种基于图论实现的 NoSQL 数据库,以图数据结构的形式存储和查询数据。它主要用于存储大量连接数据,具有以下特点:
- 开源
- 无 Schema
- 使用 Cypher 查询语言(类似 SQL)
- 基于 Java 开发,运行于 JVM 之上
1.2 图形数据结构
图数据库包含两种基本数据类型:
- 节点(Nodes):表示实体记录,可以包含多个属性(键值对)和标签。
- 关系(Relationships):连接两个节点,表示节点之间的关系,也可以包含属性。
1.3 Neo4j 的构建元素
Neo4j 的主要构建元素包括:
- 节点:图数据库的基本元素,可以有多个属性和标签。
- 属性:用于描述节点和关系的键值对。
- 关系:连接两个节点,具有方向性,可以有多个属性。
- 标签:用于将节点或关系分组,加速查找。
2. 环境搭建
2.1 使用 Docker 安装 Neo4j
通过 Docker 安装 Neo4j 的命令如下:
bash
docker pull neo4j
docker run --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/data:/data --rm -d neo4j浏览器访问 http://localhost:7474/browser,默认账号密码为 neo4j。
2.2 使用 Neo4j Desktop 安装
从官网 Neo4j.com 下载并安装 Neo4j Desktop。
3. Neo4j - CQL 使用
3.1 CQL 简介
CQL(Cypher Query Language)是 Neo4j 的查询语言,具有以下特点:
- 声明性模式匹配语言
- 语法简单,类似 SQL
- 支持创建、查询、更新和删除操作
3.2 常用命令
创建节点
cypher
CREATE (m:Member {name:'周一', level:3}) RETURN m;创建关系
cypher
MATCH (a:Member {name:'周一'}), (b:Member {name:'周二'}) MERGE (a)-[:Fans {binding_time:'2022-08-16 17:34:51'}]->(b);修改节点属性
cypher
MATCH (m:Member {name:'王一'}) SET m.level=3;查询节点
- 查询所有下级节点(包含当前节点):cypher
MATCH (m:Member {name:'周一'})-[*0..]->(result) RETURN result; - 查询所有下级节点(不包含当前节点):cypher
MATCH (m:Member {name:'周一'})-[*1..]->(result) RETURN result;
删除节点或关系
- 根据 ID 删除节点:cypher
MATCH (m) WHERE id(m) = 4 DELETE m; - 删除两个节点的关系:cypher
MATCH (m:Member {name:'周四'}) -[r:Fans]-> (me:Member {name:'周三'}) DELETE r;
4. Spring Boot 整合 Neo4j
添加依赖
在 Spring Boot 项目中添加以下依赖:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>修改配置
在 application.yml 文件中添加以下配置:
yaml
spring:
neo4j:
uri: bolt://localhost:7687
username: neo4j
password: youpik创建实体类
- 节点实体类:java
@Data @NodeEntity("user") public class User { @Id @GeneratedValue private Long id; @Property(name = "memberId") private Long memberId; private Long recommendId; @Property(name = "name") private String name; @Property(name = "level") private Integer level; } - 关系实体类:java
@RelationshipEntity(type = "fans") @Data public class UserRelationShip { @Id @GeneratedValue private Long id; @StartNode private User parent; @EndNode private User child; @Property(name = "bindingTime") private Long bindingTime; }
创建接口
继承 Neo4jRepository,定义自定义查询方法:
java
@Repository
public interface UserRepository extends Neo4jRepository<User, Long> {
@Query("MATCH (u:user)-[*1..]->(u2:user) WHERE u.memberId = $memberId RETURN count(*)")
Integer getTotalCount(@Param("memberId") Long memberId);
}涵盖了图数据库 Neo4j 的基本概念、搭建方法、CQL 使用以及与 Spring Boot 的整合。