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();
}

ノードと同じです。

fe が node.getRelationship() を使用するか、tx の外部でインデックス ルックアップを実行するなど、関係を取得するために cypher を使用しない場合は、rel を削除できます。

私は、Neo4j 1.8.2 ですべて合格する structr のいくつかのテスト [1] を作成しましたが、コメントアウトされた 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