4

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

干杯阿克塞尔

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

更新:似乎与惰性评估有关。以下代码不会引发异常:

Relationship r = rels.next();

Transaction tx = graphDb.beginTx();

try {

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

    [...]
4

0 回答 0