本次我们讲述使用Springboot来操作 NEO4J增加和查找消息。图形数据库在实际开发中经常用到,可以用来金融行业反欺诈多维关联分析场景;社交网络图谱,获得人与人之间的关系;企业关系图谱。Neo4j是一个高性能的NOSQL图形数据库,是当今最流行的图数据库,基于 节点+关系 的架构,保存了图形数据的基本元素。同时,数据库也支持通过基础数据元素和独特的CQL查询语法,快速方便的检索、构建复杂的图表关系结果。本例你可以学到NEO4J安装和使用。
我利用业余时间,翻译了Spring官网的例子,方便中文不好的同学,将陆续发到头条上,欢迎大家关注,也可以上我个人BLOG:itmanclub.com,上面有已经翻译过的。
正文:
程序结构
└── src └── main └── java └── hello
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework gs-accessing-data-neo4j 0.1.0org.springframework.boot spring-boot-starter-parent 2.1.6.RELEASE1.8org.springframework.boot spring-boot-starter-data-neo4j org.springframework.boot spring-boot-maven-plugin
Spring Boot将会你做如下的事:
- 将 classpath 里面所有用到的jar包构建成一个可执行的 JAR 文件,方便执行你的程序
- 搜索public static void main()方法并且将它当作可执行类
- 根据springboot版本,去查找相应的依赖类版本,当然你可以定义其它版本。
创建一个Neo4j服务器
在构建此应用程序之前,需要设置NEO4J服务器,NEO4J有一个开源服务器,您可以免费安装:
https://neo4j.com/download/community-edition/
安装后,采用默认配置,通过下面命令启动他:
$ neo4j start
启动后您应该看到这样的消息:
Starting Neo4j.Started neo4j (pid 96416). By default, it is available at http://localhost:7474/There may be a short delay until the server is ready.See /usr/local/Cellar/neo4j/3.0.6/libexec/logs/neo4j.log for current status.
默认情况下,NEO4J的用户名/密码为neo4j/neo4j。但是,它要求更改新的帐户密码。为此,请执行以下命令:
$ curl -v -u neo4j:neo4j -X POST localhost:7474/user/neo4j/password -H "Content-type:application/json" -d "{"password":"secret"}"
这会将密码从neo4j更改为secret(在生产中不能执行某些操作!)完成后,你就准备好基础环境了。
定义简单实体
Neo4j需要实体及其之间关系,假设您正在建模一个系统,在该系统中为每个人存储一个记录。但您还需要跟踪每一个人的同事关系(本例中的队友)。使用Neo4j,您可以通过一些简单的注释来捕获所有这些内容。
src/main/java/hello/Person.java
package hello;import java.util.Collections;import java.util.HashSet;import java.util.Optional;import java.util.Set;import java.util.stream.Collectors;import org.neo4j.ogm.annotation.GeneratedValue;import org.neo4j.ogm.annotation.Id;import org.neo4j.ogm.annotation.NodeEntity;import org.neo4j.ogm.annotation.Relationship;@NodeEntitypublic class Person { @Id @GeneratedValue private Long id; private String name; private Person() { // Empty constructor required as of Neo4j API 2.0.5 }; public Person(String name) { this.name = name; } /** * Neo4j并没有真正的双向关系,意味着当查询忽略关系的方向。 * https://dzone.com/articles/modelling-data-neo4j */ @Relationship(type = "TEAMMATE