这是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) .

干杯阿克塞尔

[1] https://github.com/structr/structr/blob/develop/structr-core/src/test/java/org/structr/common/CypherNotInTransactionTest.java

Update: 似乎与懒惰评估有关 . 以下代码不会抛出异常:

Relationship r = rels.next();

Transaction tx = graphDb.beginTx();

try {

    r.delete();
    tx.success();

    [...]