本文へスキップ
BecomeCoder

Neo4jコース · 第5章 データを更新する · レッスン26

消す ― DELETE と DETACH DELETE

ブラウザで完結

導入

ノードやリレーションシップそのものを消したいときは DELETE を使います。ただし、ノードを削除するときには少し注意が必要です。

説明

リレーションシップだけを消す場合は、そのまま DELETE できます。

MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
DELETE r

ところが、リレーションシップを持ったままのノードを DELETE しようとするとエラーになります。

MATCH (p:Person {name: 'Alice'})
DELETE p

このクエリは、もし Alice に何らかのリレーションシップ(KNOWSACTED_IN など)が1本でもつながっていると失敗します。これは、線でつながったノードだけを消してしまうと、リレーションシップが宙に浮いてしまう(つながり先を失う)ことを防ぐための安全策です。

graph LR
    subgraph before["削除前"]
        a1["Alice"] -- KNOWS --> b1["Bob"]
    end

ノードとそれにつながるリレーションシップをまとめて消したいときは DETACH DELETE を使います。

MATCH (p:Person {name: 'Alice'})
DETACH DELETE p

DETACH DELETE は「まずそのノードにつながるすべてのリレーションシップを切り離し(デタッチ)、それからノード自体を削除する」という動きをします。「関係ごと消してよいか」を意識させるために、あえて DELETEDETACH DELETE を分けているのがCypherの設計思想です。うっかり全部消してしまう事故を防ぐため、まずは影響範囲を MATCH ... RETURN で確認してから削除する習慣をつけましょう。

実際に動かしてみよう

下のエディタに Cypher を書いて「実行」を押すと、ブラウザ内の学習用グラフDBで結果が表示されます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです)。最初から「映画と俳優+小さなソーシャルグラフ」が入っているので、MATCH 系の例はそのまま結果が返ります。CREATE / MERGE / SET などで書き換えた状態は積み重なり、「グラフを初期状態に戻す」でいつでもサンプルに戻せます。

Cypher — ブラウザ内で実行(学習用グラフDB)

Cypherクエリを書いて実行できる学習用グラフDBを読み込みます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです。映画と俳優の小さなサンプルグラフが最初から入っています)。
スクロールして表示された時点でも自動で読み込まれます。