Neo4j 系列
1、图数据库 Neo4j 学习随笔之基础认识
2、图数据库 Neo4j 学习随笔之核心内容
3、图数据库 Neo4j 学习随笔之基础操作
4、图数据库 Neo4j 学习随笔之高级操作
5、图数据库 Neo4j 学习之JAVA-API操作
6、图数据库 Neo4j 学习之SpringBoot整合
文章目录
- Neo4j 系列
- 前言
- 一、JAVA Driver版本选择
- 二、获取链接
- 三、增删改查操作
- 3.1、新增节点和关系
- 3.1.1 新增节点
- 3.1.2 新增关系
- 3.2、删除节点和关系
- 3.2.1 删除关系
- 3.2.2 删除节点
- 3.3、修改节点和关系
- 3.3.1 修改关系
- 3.3.2 修改节点
- 3.4、查询节点和关系
- 3.4.1 查询节点
- 3.4.2 查询关系
- 4、总结
前言
前面讲了Neo4j和核心概念以及基本的增删改查以及高级操作,但项目里面主要还是要靠后端来获取数据提供到前端展示,那就避免不了通过开发语言来连接Neo4j来操作,本人一个纯纯的JAVA攻城狮,则用JAVA来进行操作。
一、JAVA Driver版本选择
随着Neo4j不断的版本迭代,目前官网公布最新的已经是 5.X 了,那么相应的 JAVA Driver 的版本也要随着变化,具体版本对于看下面截图。
最新的版本是 5.x 的,不过相对应的 Java 的版本也要 17 的,一般不用最新的,所以本文以 4.4 为准,这样 Java 8 或者 11 就可以了。
码云地址快速通道
项目中依旧是用 Maven 来管理项目,引入 java driver 驱动包。
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>4.0.0</version>
</dependency>
二、获取链接
和 MySQL 、SQL Server 数据库类似,JAVA 驱动提供了获取链接的方法。
/**
* @param uri
* @param username
* @param password
* @return 获取Neo4j链接
*/
private static Session getSession(String uri, String username, String password){
Driver driver = GraphDatabase.driver(uri, AuthTokens.basic(username, password));
Session session = driver.session();
if(session.isOpen()){
System.out.println("连接Neo4j成功!" + session);
return session;
}else{
System.out.println("连接Neo4j失败!");
}
return null;
}
执行结果:
三、增删改查操作
3.1、新增节点和关系
3.1.1 新增节点
主要还是用原生的方式,构建一个 Query 对象,发送 Create Node 语句。
private static void createNode(String... values){
Driver driver = getDriver(URI, USERANME, PASSWORD);
if(Objects.nonNull(driver)){
Session session = driver.session();
for (String value : values) {
Query query = new Query("create (n:loveperson) set n.name = $name return id(n)", Values.parameters("name", value));
Result result = session.run(query);
int id = result.single().get(0).asInt();
System.out.println(id);
}
session.close();
}
driver.close();
}
使用main() 方法创建节点,成功输出 152,153 两个id,说明创建节点成功,下面查询来验证一下有没有 id = 153 的节点。
3.1.2 新增关系
还是发送创建关系语句。
private static void createLink(int id1, int id2){
Driver driver = getDriver(URI, USERANME, PASSWORD);
if(Objects.nonNull(driver)) {
Session session = driver.session();
Query query = new Query("match (n:loveperson),(m:loveperson) where id(n)=$id1 and id(m)=$id2\n" +
"create (n)-[rel:`夫妻`]->(m) return rel", Values.parameters("id1", id1, "id2", id2));
Result result = session.run(query);
String s = result.single().get(0).asRelationship().toString();
System.out.println(s);
session.close();
}
driver.close();
}
3.2、删除节点和关系
3.2.1 删除关系
删除关系,为啥要先删除关系呢,因为如果先不删除关系,节点是无法删除的,就行 MySQL 关联了外键,那么这条记录也是不能删除的。
private static void deleteLink(int id){
Driver driver = getDriver(URI, USERANME, PASSWORD);
if(Objects.nonNull(driver)) {
Session session = driver.session();
Query query = new Query("match (n:loveperson)-[rel]->(m:loveperson) where id(rel)=$id delete rel", Values.parameters("id", id));
session.run(query);
session.close();
}
driver.close();
}
3.2.2 删除节点
private static void deleteNode(int id){
Driver driver = getDriver(URI, USERANME, PASSWORD);
if(Objects.nonNull(driver)) {
Session session = driver.session();
Query query = new Query("match (n:loveperson) where id(n)=$id delete n", Values.parameters("id", id));
session.run(query);
session.close();
}
driver.close();
}
3.3、修改节点和关系
3.3.1 修改关系
修改关系是删除掉原来的关系,刘大脑袋碰到一个知己,动心了,所以背叛大脸盘子王云了,他们断了原来的夫妻关系,建立了背叛关系。
private static void updateLink(int id){
Driver driver = getDriver(URI, USERANME, PASSWORD);
if(Objects.nonNull(driver)) {
Session session = driver.session();
Query query = new Query("match (n:loveperson)-[rel]->(m:loveperson) where id(rel)=$id\n" +
"create (n)-[r:背叛]->(m)\n" +
"delete rel\n" +
"return type(r)", Values.parameters("id", id));
Result result = session.run(query);
String s = result.single().get(0).toString();
System.out.println(s);
session.close();
}
driver.close();
}
3.3.2 修改节点
自从刘大脑袋背叛了王云以后,王云的爱好就是对人心已死。
private static void updateNode(int id){
Driver driver = getDriver(URI, USERANME, PASSWORD);
if(Objects.nonNull(driver)) {
Session session = driver.session();
Query query = new Query("match (n:loveperson) where id(n)=$id set n.hobby = '心已死' return n", Values.parameters("id", id));
Result result = session.run(query);
String s = result.single().get(0).asNode().get("name").asString();
System.out.println(s);
session.close();
}
driver.close();
}
3.4、查询节点和关系
3.4.1 查询节点
private static void createNode(String... values){
Driver driver = getDriver(URI, USERANME, PASSWORD);
if(Objects.nonNull(driver)){
Session session = driver.session();
for (String value : values) {
Query query = new Query("create (n:loveperson) set n.name = $name return id(n)", Values.parameters("name", value));
Result result = session.run(query);
int id = result.single().get(0).asInt();
System.out.println(id);
}
session.close();
}
driver.close();
}
3.4.2 查询关系
private static void queryLink(){
Driver driver = getDriver(URI, USERANME, PASSWORD);
Session session = driver.session();
if(Objects.nonNull(session)){
Query query = new Query("match (n:loveperson)-[rel]->(m:loveperson) return rel");
List<String> list = session.beginTransaction().run(query).list(record -> {
return record.get(0).asRelationship().type();
});
list.forEach(System.out::println);
session.close();
driver.close();
}
}
4、总结
其实还要学会了基本的操作,那么Java连接也就很简单了,Java Driver只是一个辅助的操作工具而已,也没有什么技术含量了感觉,就是简单的增删改查,不过看着例子倒是写起来块了很多。
不过使用简单的Java API 还是比较容易的,真正的开发中没人愿意这样写,因为 Spring Data 还是整合了 Neo4j 的操作的。