这是 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)
如果您将密码查询移动到事务中,它会像以前一样工作,并且符合预期:
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();
}
顺便说一句,与节点相同。
如果你不使用 cypher 来获取关系,比如 fe 使用 node.getRelationship() 或者在 tx 之外进行索引查找,你可以删除 rel。
我已经为 structr 编写了一些测试 [1],这些测试都通过 Neo4j 1.8.2 通过,但是两个注释掉了 1.9.M02-1.9.M05 失败(由于依赖问题无法测试 M01)。
干杯阿克塞尔
更新:似乎与惰性评估有关。以下代码不会引发异常:
Relationship r = rels.next();
Transaction tx = graphDb.beginTx();
try {
r.delete();
tx.success();
[...]