无法理解 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()
会抛出一个错误,程序永远不会有机会提交。相反,它会回滚。
我很确定这是一个愚蠢的问题,但我在这里完全困惑。我习惯使用 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()
会抛出一个错误,程序永远不会有机会提交。相反,它会回滚。