導入
ノードやリレーションシップそのものを消したいときは DELETE を使います。ただし、ノードを削除するときには少し注意が必要です。
説明
リレーションシップだけを消す場合は、そのまま DELETE できます。
MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
DELETE r
ところが、リレーションシップを持ったままのノードを DELETE しようとするとエラーになります。
MATCH (p:Person {name: 'Alice'})
DELETE p
このクエリは、もし Alice に何らかのリレーションシップ(KNOWS や ACTED_IN など)が1本でもつながっていると失敗します。これは、線でつながったノードだけを消してしまうと、リレーションシップが宙に浮いてしまう(つながり先を失う)ことを防ぐための安全策です。
graph LR
subgraph before["削除前"]
a1["Alice"] -- KNOWS --> b1["Bob"]
end
ノードとそれにつながるリレーションシップをまとめて消したいときは DETACH DELETE を使います。
MATCH (p:Person {name: 'Alice'})
DETACH DELETE p
DETACH DELETE は「まずそのノードにつながるすべてのリレーションシップを切り離し(デタッチ)、それからノード自体を削除する」という動きをします。「関係ごと消してよいか」を意識させるために、あえて DELETE と DETACH DELETE を分けているのがCypherの設計思想です。うっかり全部消してしまう事故を防ぐため、まずは影響範囲を MATCH ... RETURN で確認してから削除する習慣をつけましょう。