我在一个groovy应用程序中的neo4j数据库中创建了几个节点,但是当我使用shell客户端连接到数据库时,它们似乎并不在那里。
我正在创建的数据库是http://neo4j.com/docs/stable/tutorials-java-embedded-hello-world.html:
中描述的数据库def graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("/tmp/foo.db");
Transaction tx = graphDb.beginTx()
def firstNode = graphDb.createNode();
firstNode.setProperty("message", "Hello, ");
def secondNode = graphDb.createNode();
secondNode.setProperty("message", "World!");
tx.success();
System.err.print(firstNode.getProperty("message"));
System.err.print(relationship.getProperty("message"));
System.err.print(secondNode.getProperty("message"));
graphDb.shutdown()
运行应用程序后,我可以看到数据库已在文件系统上创建,但是当我从shell客户端连接时,似乎数据库中没有节点:
$ ./neo4j-community-2.1.5/bin/neo4j-shell -path /tmp/foo.db/ -v
neo4j-sh (?)$ match (m) return m;
+---+
| m |
+---+
+---+
0 row
我可能做错了什么?
答案 0 :(得分:3)
您没有关闭交易。 tx.success()
只是将交易标记为成功但未获得提交。要完成交易,请使用tx.close()
。最佳做法是在执行Java时使用try-with-resources块 - 这需要自动调用close()
。
GraphDatabaseService graphDb = ...;
try (Transaction tx = graphDb.beginTx()) {
// do stuff
tx.success();
}
由于您的代码有def
,我假设您正在使用groovy,它不支持try-with-resources。因此代码看起来像:
def graphDb = ....
Transaction tx = graphDb.beginTx()
try {
// do stuff e.g. create nodes
tx.success()
} finally {
tx.close()
}