06_Java访问Neo4j数据库

在这里插入图片描述

博文配套视频课程:自然语言处理与知识图谱


基本操作

Java在开发企业级web应用时占据了市场绝对主流。本篇来介绍如何采用Java来访问Neo4j数据库

通过Maven获取依赖包

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理,是一个自动化构建工具。如果不会Maven的小伙伴也可以直接通过Http方式下载neo4j的jar包

<dependencies>
    <dependency>
        <groupId>org.neo4j.driver</groupId>
        <artifactId>neo4j-java-driver</artifactId>
        <version>4.2.0</version>
    </dependency>
</dependencies>

获取Driver与Transaction

import org.neo4j.driver.*;
// Java导入方法
import static org.neo4j.driver.Values.parameters;

public class CallNeo4j {
    
    private static Driver driver = null;

    static{
        // bolt: 这个驱动程序适用于bolt协议,假设是专用二进制协议比HTTP API更有效
        driver = GraphDatabase.driver("bolt://localhost:7687/", AuthTokens.basic("neo4j","root"));
    }

    public static void main(String[] args) {
        Session session = driver.session();
        Transaction transaction = session.beginTransaction();
        transaction.commit();
        driver.close();
    }
}

插入与查询的测试

public static void main(String[] args) {
        Session session = driver.session();

        Transaction transaction = session.beginTransaction();
        transaction.run("match (n) detach delete n");
        transaction.run("merge (n:Person{name:{name},age:{age},sex:{sex}})", parameters("age",25,"name","张三","sex","男"));
        transaction.run("merge (n:Person{name:'小红',age:{age},sex:{sex}})", parameters("age",23,"sex","女"));
        transaction.run("match (p1:Person{name:{p1_name}}),(p2:Person{name:{p2_name}}) create (p1)-[r:like{time:{time}}]->(p2)",
                parameters("p1_name","张三","p2_name","小红","time",2));
//        Integer.parseInt("xxxx");   // 成功后测试异常
        Result result = transaction.run( "MATCH (p:Person) where p.name = {name} RETURN p.name AS name, p.age AS age",
                parameters( "name", "张三" ));  // return p,与此结果截然不同
        while (result.hasNext())
        {
            Record record = result.next();
            System.out.println(record);
            System.out.println( record.get( "name" ).asString() + " " + record.get( "age" ));
        }

        transaction.commit();
        driver.close();
    }

调用存储 VS 函数

函数与存储过程区别

  1. 存储过程一般完成特定的数据操作(CRUD),而函数实现非数据的业务逻辑
  2. 函数定义采用:@UserFunction,而存储过程采用:@Procedure
  3. 如果需要返回多个值和不返回值,就使用存储过程;如果只需要返回一个值,就使用函数

常见存储过程调用

#  找到存储过程,都是db开头
call dbms.procedures()

调用过程并过滤结果

call语句用于调用数据库中的存储过程,返回的结果可以采用yield引入一个where 字句来过滤结果 (with … where …)

#  调用数据库内置存储过程db.labels() 并且计算数据库中的总标签数
call db.labels() yield label return count(label) as num
# 调用过程并过滤结果,contains 可以包括子集
call db.labels() yield label where label contains 'Per' return count(label) as num
# 返回标签的所有属性
call db.propertyKeys()
# 计算数据库中保护每个属性键的节点数量
call db.propertyKeys() yield propertyKey as prop match (n) where n[prop] is not null return prop,count(n) as numNodes

自定义函数

自定义函数用Java语言编写,可部署到数据库中(存储到plugins目录,存放后需要重启neo4j服务),调用方式与其它Cypher函数相同

导入依赖的jar包

<dependencies>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>3.4.9</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j.test</groupId>
            <artifactId>neo4j-harness</artifactId>
            <version>3.4.9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
</dependencies>

自定义函数

import org.neo4j.procedure.Description;
import org.neo4j.procedure.Name;
import org.neo4j.procedure.UserFunction;

public class UserFunctions {

    @UserFunction("my.greet")  // 定义函数格式的注解
    @Description("my.greet(val) 传入要问候的姓名,返回 hello val")
    public String greet(@Name("name") String name) {
        return "Hello "+name;
    }
}

定义测试函数

import org.junit.Rule;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.harness.junit.Neo4jRule;

public class UserFunctionTest {

    @Rule
    public Neo4jRule neo4j = new Neo4jRule().withFunction(UserFunctions.class);

    @Test
    public void testGreeting() {
        GraphDatabaseService db = neo4j.getGraphDatabaseService();
        Result result = db.execute("return my.greet('neo4j') as res");
        System.out.println(result.next().get("res").toString());
    }
}

打成jar包

不熟悉mvn的小伙伴可以用自己的方式吧项目打成jar包,并且存放到neo4j的plugins文件夹中,最后重启服务即可

在这里插入图片描述

调用自定义函数

call dbms.functions()  # 可以找到自定义的函数
return my.greet('neo4j') # 调用自定义函数

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值