我很确定这是一个愚蠢的问题,但我在这里完全糊涂了。我习惯用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()
函数。
答案 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()
会抛出错误,程序永远不会有机会提交。相反,它会回滚。