Java操作Neo4j(非常详细)
Java 操作 Neo4j 主要分为两个部分:
在工程中创建类名为 HelloWorldExample 的类文件,并实现 AutoCloseable接口。在 HelloWorldExample 类文件中添加需要的 pom 依赖,代码如下:
定义自动释放资源的方法,实例会自动调用 close() 方法来关闭带资源的 try 语句,代码如下:
定义向 Neo4j 中插入数据的 printGreeting() 方法,代码如下:
其余的代码段的作用是:执行一条插入语句,创建一个 Greeting 类型的节点,并将该节点的 message 属性值设置为printGreeting 方法传入的参数;插入结束后返回该节点的 message 属性值及 ID 值,并输出到控制台。
定义 main() 方法,代码如下:
在 main() 方法上单击鼠标右键,在弹出的菜单界面上选择“执行程序”,得到的返回结果如下:
定义一个 getGreeting() 方法,该方法用于读取已插入的 Greeting 类型的节点,并返回该节点的 message 属性值,代码如下:
在 main() 方法中,添加如下代码:
并将下面的代码注释掉:
在 main() 方法上单击鼠标右键,在弹出的菜单界面上选择“执行程序”,得到的返回结果如下:
本部分完整代码如下:
- 创建 Java 开发环境;
- 对 Neo4j 进行操作。
创建Java开发环境
基于 Eclipse 创建一个 Maven 工程,添加 Neo4j 的 Java 驱动和 pom 依赖代码如下:<dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> <version>4.0.1</version> </dependency>
在工程中创建类名为 HelloWorldExample 的类文件,并实现 AutoCloseable接口。在 HelloWorldExample 类文件中添加需要的 pom 依赖,代码如下:
import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; import org.neo4j.driver.Result; import org.neo4j.driver.Session; import org.neo4j.driver.Transaction; import org.neo4j.driver.TransactionWork; // 导入依赖 import static org.neo4j.driver.Values.parameters; public class HelloWorldExample implements AutoCloseable{ }运行上述代码,如果系统没有报错,则表示 pom 依赖导入成功。下面我们在 HelloWorldExample 类中连接 Neo4j,并对 Neo4j 进行操作。
Java操作Neo4j
定义构造方法,在初始化对象时获得 Driver 实例,代码如下:private final Driver driver; public HelloWorldExample( String uri, String user, String password ) { driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ) ); }Driver 类通过 import org.neo4j.driver.Driver 语句导入,HelloWorldExample 是构造方法,表示在创建 HelloWorldExample 对象时,可以通过传入 uri、user、password 等参数来初始化 Driver 对象,并赋值给 driver 变量。
定义自动释放资源的方法,实例会自动调用 close() 方法来关闭带资源的 try 语句,代码如下:
@Override public void close() throws Exception { driver.close(); }
定义向 Neo4j 中插入数据的 printGreeting() 方法,代码如下:
public void printGreeting( final String message ) { try ( Session session = driver.session() ) { String greeting = session.writeTransaction( new TransactionWork< String>() { @Override public String execute( Transaction tx ) { Result result = tx.run( "CREATE (a:Greeting) " + "SET a.message = $message " + "RETURN a.message + ', from node ' + id(a)", parameters( "message", message ) ); return result.single().get( 0 ).asString(); } } ); System.out.println( greeting ); } }在上述代码中,session(会话)为 Cypher 的执行提供了一个经典的阻塞 API,session 中的 API 调用是严格按顺序执行的。session.writeTransaction() 方法用于启动一个写事务。当事务失败时,该方法将调用驱动程序重试逻辑。
其余的代码段的作用是:执行一条插入语句,创建一个 Greeting 类型的节点,并将该节点的 message 属性值设置为printGreeting 方法传入的参数;插入结束后返回该节点的 message 属性值及 ID 值,并输出到控制台。
定义 main() 方法,代码如下:
public static void main( String... args ) throws Exception { try ( HelloWorldExample greeter = new HelloWorldExample( "bolt://localhost:7687", "neo4j", "111111" ) ) { greeter.printGreeting( "hello, world" ); } }在上述代码中,实现 AutoCloseable 接口的 HelloWorldExample 类实例位于 try 语句中,这种语句称为带资源的 try 语句。
在 main() 方法上单击鼠标右键,在弹出的菜单界面上选择“执行程序”,得到的返回结果如下:
八月 06, 2023 8:07:32 下午 org.neo4j.driver.internal.logging.JULogger info 信息: Direct driver instance 905654280 created for server address localhost:7687 hello, world, from node 0 八月 06, 2023 8:07:34 下午 org.neo4j.driver.internal.logging.JULogger info 信息: Closing driver instance 905654280 八月 06, 2023 8:07:34 下午 org.neo4j.driver.internal.logging.JULogger info 信息: Closing connection pool towards localhost:7687在返回结果中可以看到 hello、world、from node 0 等信息,其中,hello 和 world 均表示节点属性,0 表示节点 ID。这时打开 Neo4j 的 Web 界面,在其中输入以下内容:
MATCH (n:Greeting) RETURN n,id(n) LIMIT 25得到的返回值如下:
│"n" │"id(n)"│ │{"message":"hello, world"}│0 │
定义一个 getGreeting() 方法,该方法用于读取已插入的 Greeting 类型的节点,并返回该节点的 message 属性值,代码如下:
public String getGreeting() { try ( Session session = driver.session() ) { return session.readTransaction( tx -> { Result result = tx.run( "MATCH (a:Greeting) RETURN a.message" ); return result.next().get( 0 ).asString(); } ); } }
在 main() 方法中,添加如下代码:
System.out.println(greeter.getGreeting());
并将下面的代码注释掉:
// greeter.printGreeting( "hello, world" );
在 main() 方法上单击鼠标右键,在弹出的菜单界面上选择“执行程序”,得到的返回结果如下:
八月 06, 2023 9:06:26 下午 org.neo4j.driver.internal.logging.JULogger info 信息: Direct driver instance 905654280 created for server address localhost:7687 hello, world 八月 06, 2023 9:06:27 下午 org.neo4j.driver.internal.logging.JULogger info 信息: Closing driver instance 905654280 八月 06, 2023 9:06:27 下午 org.neo4j.driver.internal.logging.JULogger info 信息: Closing connection pool towards localhost:7687可以看到,返回的节点属性为“hello,world”,与预期一致。其他类似的操作还有很多,我们无法一一讲述,读者可查看官网或相关教程。
本部分完整代码如下:
import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; import org.neo4j.driver.GraphDatabase; import org.neo4j.driver.Result; import org.neo4j.driver.Session; import org.neo4j.driver.Transaction; import org.neo4j.driver.TransactionWork; import static org.neo4j.driver.Values.parameters; public class HelloWorldExample implements AutoCloseable{ private final Driver driver; public HelloWorldExample( String uri, String user, String password ) { driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ) ); } @Override public void close() throws Exception { driver.close(); } public void printGreeting( final String message ) { try ( Session session = driver.session() ) { String greeting = session.writeTransaction( new TransactionWork< String>() { @Override public String execute( Transaction tx ) { Result result = tx.run( "CREATE (a:Greeting) " + "SET a.message = $message " + "RETURN a.message + ', from node ' + id(a)", parameters( "message", message ) ); return result.single().get( 0 ).asString(); } } ); System.out.println( greeting ); } } public String getGreeting() { try ( Session session = driver.session() ) { return session.readTransaction( tx -> { Result result = tx.run( "MATCH (a:Greeting) RETURN a.message" ); return result.next().get( 0 ).asString(); } ); } } public static void main( String... args ) throws Exception { try ( HelloWorldExample greeter = new HelloWorldExample( "bolt://localhost: 7687", "neo4j", "111111" ) ) { // greeter.printGreeting( "hello, world" ); System.out.println(greeter.getGreeting()); } } }