数据库-Neo4j


数据库汇总: 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 {

   @Autowired
   private 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.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/data/neo4j
      http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd
      http://www.springframework.org/schema/tx
      http://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整合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值