共计 3426 个字符,预计需要花费 9 分钟才能阅读完成。
Neo4j 简介
Neo4j 是基于 java 语言实现的世界领先的图形数据库,是一个高性能的图形存储,具有成熟和强大的数据库所需的所有功能,如友好的查询语言(Cypher)和 ACID 事务。对于许多应用程序,与关系数据库相比,Neo4j 提供了数量级的性能优势。主要应用于图检索和关系计算。其优点在于:
节点没上线(3.0 以后去掉了限制)
扩展性很好,支持集群和企业版
数据 ETL 有丰富的工具支持,自带 GUI
良好的 WebUI
更加详细的介绍参考:https://neo4j.com/docs/gettin…
Neo4j 安装
Neo4j 在不同部署环境中的安装,例如 Linux,Mac OS,Windows,Debian,Docker 或 CAPI Flash, 以下介绍在 windows 系统中的安装方法:
1. 下载最新安装包点击以下地址:https://neo4j.com/download-ce…,选择社区服务器下相应版本下载即可。2. 安装 Neo4j 解压安装包到相应目录后在 bin 目录下打开命令提示符或者任意地方打开命令提示符进入 bin 目录下如图的四个命令:(1)进入 bin 目录下(2)neo4j 查询相应命令(3)install-service 安装 Neo4j 服务(4)start 启动服务服务安装成功之后浏览器输入 http://localhost:7474/browser/ 即可访问登录页面,其中用户名密码都为 neo4j, 登陆后可修改密码,登录页面如下图其余环境的服务安装方法可参考:https://neo4j.com/docs/operat…
Neo4j 与 springBoot 简单整合
大概了解了 Neo4j 和进行安装之后,接下来就对 Neo4j 和 springBoot 进行一个简单的整合,如图实例我们依据图中人物与电影的关系建立一个简单的 demo(图片源自官方文档)
建立一个 springBoot 项目
2. 引入 neo4j 的 pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
</dependencies>
3. 建立一个 Person 和 Movie 的实体类
@NodeEntity
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private String born;
public Person() {// 从 Neo4j API 2.0.5 开始需要无参构造函数
}
public Person(String name, String born) {
this.name = name;
this.born = born;
}
// 省略 getter and setter
@NodeEntity
public class Movie {
@Id
@GeneratedValue
private Long id;
private String title;
private String released;
public Movie() {
}
public Movie(String title, String released) {
this.title = title;
this.released = released;
}
// 省略 getter and setter
需要注意的是类上 @NodeEntity, 标识这是一个节点,实体类中还需要一个无参构造方法,从 Neo4j API 2.0.5 开始需要的。
4. 建立 MovieRepository 和 PersonRepository
public interface MovieRepository extends CrudRepository<Movie, Long> {
Movie findByTitle(String title);
}
public interface PersonRepository extends CrudRepository<Person, Long> {
Person findByName(String name);
}
其中继承 CrudRepository 已经可以实现简单的 CRUD 了
5. 在 Person 中建立 movie 与演员、导演的指向关系
@Relationship(type = “ACTED_IN”, direction = Relationship.OUTGOING)
public Set<Movie> actors;
public void addActor(Movie movie) {
if (actors == null) {
actors = new HashSet<>();
}
actors.add(movie);
}
@Relationship(type = “DIRECTED”, direction = Relationship.OUTGOING)
public Set<Movie> directors;
public void addDirector(Movie movie) {
if (directors == null) {
directors = new HashSet<>();
}
directors.add(movie);
}
@Relationship 这个注解表示关系,type 是关系名称,direction 是方向,例子中的是 person——>movie
6.application.properties 配置文件中建立数据库连接
#本地连接可以省略该行,非本地配置改对应 ip
#spring.data.neo4j.uri=bolt://localhost
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123456
7. 单元测试(1)创建 movie
@Test
public void testSaveMovie() {
Movie m1 = new Movie(“ 无问西东 ”, “2018”);
Movie m2 = new Movie(“ 罗曼蒂克消亡史 ”, “2016”);
movieRepo.save(m1);
movieRepo.save(m2);
}
可以看到数据库已经建立两部电影的相关节点(2)创建 person 及其与 movie 的关系
@Test
public void testSavePerson() {
Person p1 = new Person(“ 章子怡 ”, “1979”);
Person p2 = new Person(“ 李芳芳 ”, “1976”);
Person p3 = new Person(“ 程耳 ”, “1970”);
Movie m1 = movieRepo.findByTitle(“ 罗曼蒂克消亡史 ”);
Movie m2 = movieRepo.findByTitle(“ 无问西东 ”);
if (m1!=null) {
p1.addActor(m1);
p3.addDirector(m1);
}
if (m2!=null) {
p1.addActor(m2);
p2.addDirector(m2);
}
personRepo.save(p1);
personRepo.save(p2);
personRepo.save(p3);
}
如图,测试用例已经建立起了电影与导演、演员之间的联系(3)findMovieByTitle
@Test
public void testfindByTitle() {
Movie movie = movieRepo.findByTitle(“ 罗曼蒂克消亡史 ”);
}
查询出相应的结果符合预期
{
“id”:26,
“title”:” 罗曼蒂克消亡史 ”,
“released”:”2016″
}
(4)findPersonByName
@Test
public void testfindByName() {
Person person = personRepo.findByName(“ 章子怡 ”);
}
这里需注意的是,该演员对应了两部电影,查询个人信息的同时应该包含两部电影
{
“id”:27,
“name”:” 章子怡 ”,
“born”:”1979″,
“actors”:[
{
“id”:25,
“title”:” 无问西东 ”,
“released”:”2018″
},
{
“id”:26,
“title”:” 罗曼蒂克消亡史 ”,
“released”:”2016″
}
]
}
查询结果也符合预期还有很多 findAll、delete 就不在一一列举了,至此 springBoot 与 neo4j 的简单整合就完成了