无法理解Neo4j JDBC事务

时间:2015-03-29 23:08:15

标签: java transactions neo4j

我很确定这是一个愚蠢的问题,但我在这里完全糊涂了。我习惯用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一样使用事务块。

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

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

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

2 个答案:

答案 0 :(得分:2)

如果您不了解JDBC,请阅读它,它是一个远程API,它通过对远程API执行语句(在本例中为Cypher)来工作。

没有GraphDatabaseService对象。只有陈述和参数。

对于tx处理,您可以为每个语句设置一个tx,或者如果设置connection.setAutoCommit(false);,则事务会一直运行,直到您调用connection.commit()

答案 1 :(得分:0)

为了补充迈克尔·亨格的回答,我制作了这个程序,它执行多个事务并回滚它们。这是一个非常简单的程序。希望它能帮助像我这样的其他新手。

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()会抛出错误,程序永远不会有机会提交。相反,它会回滚。