Skip to content

图数据库 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 的整合。

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer