当前位置: 代码迷 >> 综合 >> 数据库-Neo4j
  详细解决方案

数据库-Neo4j

热度:75   发布时间:2023-11-24 21:14:46.0

文章目录

  • 数据库-Neo4j
    • 起步安装
    • CQL命令
      • 1.节点操作
      • 2.关系操作
      • 3.标签操作
      • 4.属性操作
      • 5.排序、联合查询、局部查询、筛选查询
    • CQL函数
    • 索引 index
    • 约束 constraint
    • 与Spring结合
      • 1.Spring整合
      • 2.SpringBoot整合

数据库汇总: https://blog.csdn.net/qq_52681418/article/details/113881001

数据库-Neo4j

Neo4J是一个图形数据库,官网:http://www.neo4j.org

图形是一组节点和连接这些节点的关系。 节点和关系包含表示数据的属性。 属性是用于表示数据的键值对。

假设abcd分别代表一个人,A的视角,他们的关系如下:
在这里插入图片描述
B的视角,他们的关系如下:
在这里插入图片描述

这些应用程序包含大量的结构化,半结构化和非结构化的连接数据。 在 RDBMS 数据库中表示这种非结构化连接数据并不容易。

下图展示了2个节点及他们的关系:
在这里插入图片描述


起步安装

下载最新的Neo4j Server安装文件: https://neo4j.com/download-center/#community

注意:neo4j需要jdk环境,neo4j3.5以内可以使用jdk1.8,neo4.0以上用jdk11
在这里插入图片描述
下载完后解压,通过cmd进入解压后的bin目录,执行如下命令启动:

neo4j.bat console

在这里插入图片描述
浏览器访问地址:http://localhost:7474/ 即可进入管理面板。
在这里插入图片描述
默认用户名、密码为neo4j,第一次登录会让你修改密码,当然在实际使用中也确实不应该使用默认密码。

更多详细内容:https://www.w3cschool.cn/neo4j/neo4j_exe_environment_setup.html


CQL命令

neo4j通过CQL命令来操作节点,CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。

一个节点可以理解为一条记录,也可理解为一个对象:

  • 标签:每个节点都设置有一个或多个标签,通过标签查询拥有该标签的节点。

  • 关系:节点与节点之间的关系,比如节点A和节点B是兄弟关系。

  • 属性:每个节点、关系都有自身的属性,就和关系型数据库中每条记录都有字段一样。

标签标记一组节点,属性描述节点,关系关联多个节点。

# 节点格式: 属性为json格式
(别名:标签{
     属性})
# 关系格式
-[别名:标签{
     属性}]->

1.节点操作

节点的格式为:

# 格式:别名的作用是为节点取个临时名字,可以忽略不写
(别名:标签名1:标签名2...{属性值:属性名...})# 有时会出现的情况:
()							# 所有节点
(:标签名)					# 所有带此标签的节点
(:标签名{属性名:属性值})		# 更具体的节点# 上面3种情况均未考虑使用别名的情况,那么什么是别名呢,别名类似于临时变量,临时代表当前节点:
# 举例:两种结果都是一样的
match (p1) return p1		# 使用临时别名p1
match p2=() return p2		# 使用临时变量p2

1.创建节点: create

创建节点时需要为节点设置标签 ( 标签可以有多个 ),通过标签可以找到有这个标签的所有节点。

# 创一个节点
create 节点
# 同时创建多个节点
create 节点1,节点2# 节点不存在时才创建节点,create可以重复创建
merge 节点

每次添加节点、关系时,内部会自动添加一个自增的id属性,值最大为35亿。

2.查询节点: match

下面的别名可以理解为存储结果的对象,可以像mysql表别名一样使用,并且使用return可以返回操作的结果

在查询时,节点内容越详细,查询的结果范围越精确。

# 查询全部节点
match (p) return p# 查询标签tag下所有节点
match (p:tag) return p# 以属性作为条件查询节点:
match (p:tag{属性名:属性值}) return p		# 节点内指定属性
match (p:tag) where p.属性名=属性值 return p	# where条件: (AND、OR、NOT、XOR、>、<、=、<>、>=、<=)

3.修改节点: set

修改节点需要找到需要修改的节点,因此往往与查询组合

# 修改节点:修改多个值或者多个条件均用,号隔开
match (p:标签) where p.id=1 set p.属性名=新值

4.删除节点: delete

如果要删除的节点和其他节点存在关系,删除时需要删除关系

# 按条件删除节点
match (p:标签) where p.id=1 delete p# 删除某个标签下的全部节点
match (p:标签) delete p

2.关系操作

添加关系: →、←、

关系也有临时别名、标签及属性。

# 创建节点时添加关系:r为关系别名
create (p1:`程序员`{name:"刘一"})-[r:哥哥]->(p2:`程序员`{name:"陈二"}) return p1,r,p2# 为已有节点添加关系:这里*可以取代所有别名
match (p1:`程序员`{name:"王五"}) match(p2:`程序员`{name:"张三"}) create (p1)<-[r:朋友]-(p2) return *

查询关系:

# 查询所有存在关系的节点
match p=()-[]->() return p# 查询拥有指定关系的节点
match p=()-[r:`哥哥`]->() return p# 查询一个节点的所有关系
match p=(:`程序员`{name:"张三"})<-[]->() return p# 查询2个节点之间的关系
match p=(:`程序员`{name:"张三"})<-[]->(:`程序员`{name:"王五"}) return p

修改关系: 暂无。

删除关系:

# 删除关系
match (p1:`程序员`{name:"张三"})-[r:`朋友`]->(p2) delete r
# 删除关系与节点
match (p1:`程序员`{name:"张三"})-[r:`朋友`]->(p2) delete r,p2

3.标签操作

无论是节点还是关系都可以设置标签,标签在创建节点、关系时可直接指定

# 移除全部标签
match (p:tag) remove p return p
# 移除指定标签
match (p:tag) remove p:标签 return p

4.属性操作

无论是节点还是关系都可以设置属性,属性在创建节点、关系时可直接声明

# 查看属性:不存在的属性值为null
match (p:`程序员`) return p.name,p.age,p.height,p.year
# 删除属性
match (p:`程序员`{name:"张三"}) remove p.age return p
# 添加、修改属性
match (p:`程序员`{name:"张三"}) set p.age=50 return p

5.排序、联合查询、局部查询、筛选查询

#排序:order by [desc] (默认为升序,添加desc为降序)
match (p:`程序员`) return p order by p.age desc# 联合查询
(match...) union (match...)		# 会去重
(match...) union all (match...) # 不去重# 局部查询:在return末尾使用limit即可
match (p) return p limit n	# 查询前n条
match (p) return p skip n	# 查询后n条# 筛选查询(查看id为1,20,7的记录)
match (p) where p.id in [1,20,7] return p

CQL函数

1.字符串函数 :

函数 用途
UPPER 到大写
LOWER 到小写
SUBSTRING 取子字符串
REPLACE 替换子字符串

2.聚合函数:

函数 用途
COUNT 获取查询行数
MAX 获取查询结果最大值
MIN 获取查询结果最小值
SUM 查询结果求和
AVG 查询结果求平均值

3.关系函数 :

函数 用途
STARTNODE 获取关系起始节点
ENDNODE 获取关系结束节点
ID 获取关系ID
TYPE 获取字符串表示的关系类型

索引 index

使用索引可以加快查询速度、提升查询性能。

# 为一个节点、关系的属性添加索引
create index on :标签名 (属性名)
# 为一个节点、关系的属性删除索引
drop index on :标签名 (属性名)

约束 constraint

创建节点时,会重复添加,可以通过添加约束来避免。

# 创建唯一约束:unique (如果属性已有重复,则无法添加此约束)
create constraint on 节点 assert <属性名> is unique
# 删除唯一越束:drop...unique
drop constraint on 节点 assert <属性名> is unique

与Spring结合

1.Spring整合

1.pom.xml依赖

<!--Spring DATA Neo4j模块Jar-->
<dependency><groupId> org.springframework.data </groupId><artifactId> spring-data-neo4j </artifactId><version> 3.1.2.RELEASE </version>
</dependency>
<!--Neo4j Jar-->
<dependency><groupId> org.neo4j </groupId><artifactId> neo4j-kernel </artifactId><version> 2.1.3 </version>
</dependency>
<!--Java事务API jar-->
<dependency><groupId> javax.transaction </groupId><artifactId> jta </artifactId><version> 1.1 </version>
</dependency>
<!--Java验证API jar-->
<dependency><groupId> javax.validation </groupId><artifactId> validation-api </artifactId><version> 1.0.0.GA </version>
</dependency>

Spring Framework 相关注释:

注释 用法
@GraphEntity 定义域类?Neo4j Entity
@GraphID 定义节点或关系?id?
@GraphProperty 定义节点或关系属性

实现 Spring DATA Neo4j 应用程序的简要步骤 -

  • 开发图表实体或域或 ?POJO? 类

  • 开发 ?DAO? 或存储库

  • 开发服务层(如果需要)

  • ?Spring DATA Neo4j XML? 配置

2.实体类

@NodeEntity//get、set方法默认创建
public class User{
    @GraphId Long id;			private String name;private String address;private String sex;private String dob;/**默认已创建public boolean equals(Object other) {if (this == other)return true;if (id == null) return false;if (! (other instanceof User)) return false;return id.equals(((User) other).id);}public int hashCode() {return id == null ? System.identityHashCode(this) : id.hashCode();}**/
}

3.DAO层接口

public interface UserRepository extends GraphRepository<User>{
     
}

4.Service接口

public interface UserService{
    User create(User user);void delete(User user);		User findById(long id);		Result<User> findAll();
}

5.Service接口实现类

@Service
public class UserServiceImpl implements UserService {
    @Autowiredprivate UserRepository userRepository;	public User create(User user) {
    return userRepository.save(user);}public void delete(User user) {
    		userRepository.delete(user);}public User findById(long id) {
    		return userRepository.findOne(id);}public Result<User> findAll() {
    		return userRepository.findAll();}
}

6.XML配置

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/data/neo4jhttp://www.springframework.org/schema/data/neo4j/spring-neo4j.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><context:component-scan base-package="service包路径" /><neo4j:config storeDirectory="C:TPNeo4jDB" base-package="domain包路径"/><neo4j:repositories base-package="dao包路径"/><tx:annotation-driven /></beans>

2.SpringBoot整合

  相关解决方案