Java在开发企业级web应用时占据了市场绝对主流。本篇来介绍如何采用Java来访问Neo4j数据库
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理,是一个自动化构建工具。如果不会Maven的小伙伴也可以直接通过Http方式下载neo4j的jar包
<dependencies>
<dependency>
<groupId>org.neo4j.drivergroupId>
<artifactId>neo4j-java-driverartifactId>
<version>4.2.0version>
dependency>
dependencies>
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();
}
# 找到存储过程,都是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函数相同
<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') # 调用自定义函数