Neo4j
简介
Neo4j是一个世界领先的开源图形数据库。 它是由Neo技术使用Java语言完全开发的。本教程将教你Neo4j的基础知识,Java与Neo4j和Spring DATA与Neo4j。 Neo4j是一个高性能的,NOSQL数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事物特性的java持久化引擎。Neo4j也可以看作是一个高性能的图引擎,该引擎具有成熟数据库所有特性。
在属性图中,图由顶点(节点),边(关系),属性组成,每个顶点和边都可以有一个或多个属性,Neo4j创建的图是用顶点和边构建的有向图。
官方网站:http://www.neo4j.org
示例图如下:
下载安装
去官方网站下载对应的版本,本人使用centos7
[root@zookeeper neo4j]# wget https://neo4j.com/artifact.php?name=neo4j-community-3.4.9-unix.tar.gz
--2020-06-27 09:30:30-- https://neo4j.com/artifact.php?name=neo4j-community-3.4.9-unix.tar.gz
正在解析主机 neo4j.com (neo4j.com)... 54.156.129.200, 3.222.79.195
正在连接 neo4j.com (neo4j.com)|54.156.129.200|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:91186069 (87M) [application/x-gzip]
正在保存至: “artifact.php?name=neo4j-community-3.4.9-unix.tar.gz”
100%[=======================================================================================>] 91,186,069 575KB/s 用时 2m 37s
2020-06-27 09:33:24 (569 KB/s) - 已保存 “artifact.php?name=neo4j-community-3.4.9-unix.tar.gz” [91186069/91186069])
下载成功后进行解压操作,解压后修改安装目录下的neo4j.conf文件:
因为需要远程登录,所以只是调整了里面的一行,将注释放开:
dbms.connectors.default_listen_address=0.0.0.0
修改防火墙设置,开放端口并重启防火墙服务:
验证
在浏览器中输入:http://ip:7474/browser/,如果出现下图则证明安装成功,按照提示修改新密码,进行一些必要操作,也可以参照菜鸟教程进行简单练习:
Spring Boot整合Neo4j
导入依赖修改配置
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
application.properties
# 配置neo4j相关信息
spring.data.neo4j.uri=bolt://192.168.1.106:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=wangfeng
开发配置类
Neo4jConfig.java用以加载驱动以及配置连接到neo4j的各种信息,以及指定repository。
@Configuration
@EnableTransactionManagement
@EnableNeo4jRepositories(basePackages = "com.neo4jdemo.springbootneo4j.repository")
public class Neo4jConfig {
@Value("${spring.data.neo4j.uri}")
private String url;
@Value("${spring.data.neo4j.username}")
private String username;
@Value("${spring.data.neo4j.password}")
private String password;
@Bean(name = "session")
public Session neo4jSession() {
Driver driver = GraphDatabase.driver(url, AuthTokens.basic(username, password));
return driver.session();
}
}
开发实体以及关系类
ParentNode.java 需要在类中指定对应的Node,以及关系
@NodeEntity("ParentNode")
public class ParentNode {
@Id
@GeneratedValue
private Long id;
private @Property(name = "name") String name;
private @Relationship(type = "Relations")
Set<RelationNode> sets = new HashSet<>();
//get set toString 构造器等
//添加关系
public void addRelation(SonNode sonNode, String name) {
RelationNode relationNode = new RelationNode(this, name, sonNode);
sets.add(relationNode);
sonNode.getSets().add(relationNode);
}
}
SonNode.java
@NodeEntity("SonNode")
public class SonNode {
@Id
@GeneratedValue
private Long id;
@Property(name = "name")
private String name;
private @Relationship(type = "RelationEdge", direction = "INCOMING")
Set<RelationNode> sets = new HashSet<>();
//get set toString 构造器等
}
RelationNode.java 需要指定关系名,关系箭头指向
@RelationshipEntity(type = "Relations")
public class RelationNode {
@Id
@GeneratedValue
private Long id;
// 关系名
private String name;
private @StartNode
ParentNode parentNode;
private @EndNode
SonNode sonNode;
//get set toString 构造器等
}
Neo4jParentRepository
Neo4jParentRepository.java继承自Neo4jRepository,实现简单的crud操作
public interface Neo4jParentRepository extends Neo4jRepository<ParentNode,Long> {
}
测试验证接口开发
Neo4jController.java
@RestController
@RequestMapping("/neo4j")
public class Neo4jController {
@Autowired
private Neo4jParentRepository neo4jParentRepository;
@GetMapping("/create")
public void create(){
SonNode sonNode1 = new SonNode("儿子小峰");
SonNode sonNode2 = new SonNode("女儿小丽");
ParentNode parentNode = new ParentNode("爸爸");
parentNode.addRelation(sonNode2, "女儿");
parentNode.addRelation(sonNode1, "儿子");
neo4jParentRepository.save(parentNode);
}
@GetMapping(value = "/query")
public void findNodes() {
Iterable<ParentNode> parentNodes = neo4jParentRepository.findAll();
for (ParentNode parentNode : parentNodes) {
Set<RelationNode> relationNodeSet = parentNode.getSets();
for (RelationNode relationNode : relationNodeSet) {
System.out.println("id:" + parentNode.getId() + " name:" + parentNode.getName() + " 关系:" + relationNode.getName() + "子节点:" + relationNode.getSonNode().getName());
}
}
}
}
使用启动类开启项目,然后使用postman对接口create和query分别进行访问,项目没有报错的情况下,可以直接登录图数据库的可视化界面去查看,能看到关系已经生成。