これは、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 をテストできませんでした)。
乾杯アクセル
更新:遅延評価に関連しているようです。次のコードは例外をスローしません。
Relationship r = rels.next();
Transaction tx = graphDb.beginTx();
try {
r.delete();
tx.success();
[...]