这是Neo4j 1.9.M02-M05中的已知问题和/或预期行为,您无法再从事务外的密码查询中删除节点和关系吗?
以下示例代码在1.8.2中起作用,但在1.9.M02-M05中起作用:
ExecutionEngine engine = new ExecutionEngine(graphDb);
ExecutionResult result = engine.execute("start n = node(*) match (n)<-[r:SOME_TYPE]-() return r");
final Iterator<Relationship> rels = result.columnAs("r");
assertTrue(rels.hasNext());
Transaction tx = graphDb.beginTx();
try {
rels.next().delete();
tx.success();
} finally {
tx.finish();
}
堆栈跟踪:
org.neo4j.graphdb.TransactionFailureException: Failed to mark transaction as rollback only.
at org.neo4j.kernel.TopLevelTransaction.markAsRollbackOnly(TopLevelTransaction.java:94)
at org.neo4j.kernel.PlaceboTransaction.finish(PlaceboTransaction.java:48)
Caused by: java.lang.NullPointerException
at org.neo4j.kernel.TopLevelTransaction.markAsRollbackOnly(TopLevelTransaction.java:90)
如果将cypher查询移动到事务中,它将像以前一样工作,并且符合预期:
Transaction tx = graphDb.beginTx();
try {
ExecutionResult result = engine.execute("start n = node(*) match (n)<-[r:ONE_TO_ONE]-() return r");
final Iterator<Relationship> rels = result.columnAs("r");
assertTrue(rels.hasNext());
rels.next().delete();
tx.success();
} finally {
tx.finish();
}
与btw节点相同 .
如果你不使用密码来获得关系,比如f.e.使用node.getRelationship()或在tx之外进行索引查找,可以删除rel .
我已经为structr编写了一些测试[1],它们全部通过了Neo4j 1.8.2,但两个注释失败了1.9.M02-1.9.M05(由于依赖性问题无法测试M01) .
干杯阿克塞尔
Update: 似乎与懒惰评估有关 . 以下代码不会抛出异常:
Relationship r = rels.next();
Transaction tx = graphDb.beginTx();
try {
r.delete();
tx.success();
[...]