CypherのDELETEがうまく動作しない?
ぬこは激怒した。
さっきの続き。
まあ、さっきの問題は些か汚い方法だが、not()で反転させれば所定のノード群を得ることはできる。
neo4j-sh (0)$ START n=node(*) WHERE not(n.delete_flag? = false) RETURN n; ==> +-----------------------------------------------------------------------+ ==> | n | ==> +-----------------------------------------------------------------------+ ==> | Node[4]{type:"doc",name:"テーブル定義書",delete_flag:true} | ==> | Node[14]{type:"simple",name:"テーブル名",delete_flag:true} | ==> | Node[15]{type:"value",name:"string",value:"table1",delete_flag:true} | ==> | Node[16]{type:"complex",name:"カラムlist",delete_flag:true} | ==> | Node[17]{type:"complex",name:"カラム",delete_flag:true} | ==> | Node[18]{type:"simple",name:"カラム名",delete_flag:true} | ==> | Node[19]{type:"value",name:"カラム名",value:"column1",delete_flag:true} | ==> | Node[20]{type:"simple",name:"データ型",delete_flag:true} | ==> | Node[21]{type:"value",name:"string",value:"integer",delete_flag:true} | ==> | Node[22]{type:"complex",name:"カラム",delete_flag:true} | ==> | Node[23]{type:"simple",name:"カラム名",delete_flag:true} | ==> | Node[24]{type:"value",name:"string",value:"column2",delete_flag:true} | ==> | Node[25]{type:"simple",name:"データ型",delete_flag:true} | ==> +-----------------------------------------------------------------------+ ==> 13 rows ==> 3 ms ==>
まあ、ここまでは良い。あとはRETURN句をDELETEに変えれば、delete_flagを持った(他ノードへの関連を持たない)ノードのみを削除できるはずだ。
ということでポチッとな。
neo4j-sh (0)$ START n=node(*) WHERE not(n.delete_flag? = false) DELETE n; ==> TransactionFailureException: Unable to commit transaction neo4j-sh (0)$
なんじゃそりゃ〜
WHERE句で選択されたノードに対してのみDELETEを発行するはずじゃないのか?
まさかとは思うが、MATCHでの絞り込み結果でしかDELETEが発行できないという酷い仕様(リファレンスには確かにMATCHを使った例しか載っていなかったが)じゃないだろうな・・・。そうではないと思いたいが。
つーか、このエラーメッセージじゃ原因が分からんよ。全く・・・。もし上記が原因なら、きちんとそう明示してほしい。