图数据库 Neo4j 学习之JAVA-API操作

Neo4j 系列

1、图数据库 Neo4j 学习随笔之基础认识
2、图数据库 Neo4j 学习随笔之核心内容
3、图数据库 Neo4j 学习随笔之基础操作
4、图数据库 Neo4j 学习随笔之高级操作
5、图数据库 Neo4j 学习之JAVA-API操作
6、图数据库 Neo4j 学习之SpringBoot整合



前言

前面讲了Neo4j和核心概念以及基本的增删改查以及高级操作,但项目里面主要还是要靠后端来获取数据提供到前端展示,那就避免不了通过开发语言来连接Neo4j来操作,本人一个纯纯的JAVA攻城狮,则用JAVA来进行操作。

一、JAVA Driver版本选择

随着Neo4j不断的版本迭代,目前官网公布最新的已经是 5.X 了,那么相应的 JAVA Driver 的版本也要随着变化,具体版本对于看下面截图。
最新的版本是 5.x 的,不过相对应的 Java 的版本也要 17 的,一般不用最新的,所以本文以 4.4 为准,这样 Java 8 或者 11 就可以了。

Driver对应关系
码云地址快速通道

项目中依旧是用 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;
}

执行结果:
连接Neo4j测试

三、增删改查操作

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 的操作的。

猜你喜欢

转载自blog.csdn.net/qq_19283249/article/details/128263747