首页 > 编程笔记 > Java笔记 阅读:17

Java操作Neo4j(非常详细)

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());
      }
  }
}

相关文章