无法理解 Neo4j JDBC 事务

Trouble understanding Neo4j JDBC Transaction

我很确定这是一个愚蠢的问题,但我在这里完全困惑。我习惯使用 neo4j-embedded-api 进行编码,对 neo4j-jdbc 非常陌生。我想使用 Neo4j-JDBC。我的 Neo4J 2.1.7 实例托管在另一台计算机上,可通过 192.168.1.16:7474

访问

我可以创建简单的程序并编写密码查询并执行它们。但是,我想将它们全部包装在一个事务块中。像这样:

    try(Transaction tx = this.graphDatabaseService.beginTx())
    {
        ResultSet resultSet = connect.createStatement().executeQuery(cypherQuery);
        tx.success();
    }

我的问题是我不知道如何从中获取 GraphDatabaseService 的对象:

Neo4jConnection connect = new Driver().connect("jdbc:neo4j://192.168.1.16:7474", new Properties());

一旦我有了 GraphDatabaseObject,我假设我可以使用像 neo4j-embedded-api.

这样的事务块

[我的Objective] 我在这里尝试的是在嵌套事务块中通过网络发送多个查询,如果其中任何一个失败,则回滚所有查询。

到目前为止我失败的尝试:

我试图阅读托管在 github 上的 neo4j-jdbc 项目以及他们的测试用例 (link here) 我假设要将代码放入事务块中,您必须 connect.setAutoCommit(false); 然后分别使用 commit()rollback() 函数。

如果您不知道 JDBC 那么请仔细阅读它,它是一个远程 API,它通过对远程 API 执行语句(在本例中为 Cypher)来工作.

没有 GraphDatabaseService 对象。只有语句和参数。

对于 tx 处理,您要么每个语句有一个 tx,要么如果您设置 connection.setAutoCommit(false);,那么交易将一直运行,直到您调用 connection.commit()

为了补充 Michael Hunger 的回答,我制作了这个程序,它执行多个事务并回滚它们。这是一个非常简单的程序。希望对像我一样的小白有所帮助

package rash.experiments.neo4j.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import org.neo4j.jdbc.Driver;
import org.neo4j.jdbc.Neo4jConnection;

public class JdbcTest
{
    public Neo4jConnection connect;

    public JdbcTest() throws SQLException
    {
        this.connect = new Driver().connect("jdbc:neo4j://192.168.1.16:7474", new Properties());
    }

    public static void main(String args[])
    {
        JdbcTest test = null;

        try
        {
            test = new JdbcTest();
            test.connect.setAutoCommit(false);

            long user1 = test.createUser("rash");
            long user2 = test.createUser("honey");
            test.createRelationship(user1, user2);

            test.connect.commit();
        }
        catch(SQLException sqlException)
        {
            try
            {
                test.connect.rollback();
            }
            catch (SQLException e){}
        }
    }

    private long createUser(String userId) throws SQLException
    {
        ResultSet resultSet = this.connect.createStatement().executeQuery("create (user:User {userId: '" + userId + "'}) return id(user) as id");
        resultSet.next();
        return resultSet.getLong("id");
    }

    private void createRelationship(long node1, long node2) throws SQLException
    {
        this.connect.createStatement().executeQuery("start user1 = node(" + node1 + "), user2 = node(" + node2 + ") create (user1) -[:KNOWS]-> (user2)");
        throw new SQLException();
    }
}

此程序永远不会提交,因为方法 createRelationship() 会抛出一个错误,程序永远不会有机会提交。相反,它会回滚。