{#delete-delete} # DELETE {bdg-primary-line}`GQL 절` 그래프에서 정점과 간선을 지웁니다. `DETACH DELETE`는 정점의 간선까지 함께 지웁니다. {#delete-synopsis} ## 개요
[ DETACH ] DELETE expression [, expression ] ...

굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.

{#delete-description} ## 설명 `DELETE`는 자기 표현식이 가리키는 그래프 요소를 지웁니다. 그 요소가 먼저 바인딩돼 있어야 하므로, 항상 그것들을 찾아낸 절 뒤에 옵니다. - **그냥 쓴 `DELETE`는 아직 간선이 남은 정점을 거부합니다.** 그것을 지우면 아무것도 가리키지 않는 간선이 남으므로, 이 절은 오류를 내고 트랜잭션이 롤백됩니다. - **`DETACH DELETE`** 는 정점의 간선을 먼저 지우고 그다음 정점을 지웁니다. 그 정점이 연결돼 있을 수 있다면 언제든 이것을 쓰십시오. - **간선**을 지우는 데는 `DETACH`가 필요하지 않고, 양 끝점에는 손대지 않습니다. - 표현식을 여러 개 나열할 수 있습니다. 적은 순서대로 지워지므로, 간선을 그 양 끝점보다 앞에 나열하면 `DETACH` 없이도 됩니다. - `DELETE`는 들어오는 행마다 한 번 실행됩니다. 앞선 행이 이미 지운 요소는 오류가 아닙니다. - 각 표현식은 정점, 간선, 또는 경로여야 합니다. 속성 참조는 받지 않습니다. 속성을 지우려면 [`REMOVE`](remove.md)를 쓰십시오. - `DELETE`는 쿼리를 끝낼 수 있습니다. 무엇이 사라졌는지 보려면 [`RETURN`](return.md)을 붙이십시오. {#delete-parameters} ## 매개변수 DETACH : 각 정점에 연결된 간선을 그 정점과 함께 지웁니다. expression : 정점, 간선, 또는 경로를 내놓는 표현식이며, 보통 [`MATCH`](match.md)가 바인딩한 변수입니다. {#delete-examples} ## 예제 모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. 첫 예제가 나머지 예제들이 지울 부분 그래프를 만들므로, 데이터셋은 시작할 때 모습으로 끝납니다. {#delete-build-something-to-delete} ### 지울 것을 만들기 ```cypher CREATE (:movie {title: 'Tenet', year: 2020, genre: 'Action'}); MATCH (d:person {name: 'Christopher Nolan'}), (m:movie {title: 'Tenet'}) CREATE (d)-[:directed]->(m); MATCH (m:movie {title: 'Tenet'}) CREATE (a:person {name: 'Elizabeth Debicki', born: 1990})-[:acted_in {role: 'Kat'}]->(m); ``` ``` UPDATE 1 UPDATE 1 UPDATE 2 ``` 이제 `Tenet`에는 간선이 두 개 있습니다: ```cypher MATCH (m:movie {title: 'Tenet'})-[r]-(x) RETURN label(r) AS edge, count(*) AS n ORDER BY edge; ``` ``` edge | n ------------+--- "acted_in" | 1 "directed" | 1 (2 rows) ``` {#delete-see-a-plain-delete-refuse-a-connected-vertex} ### 그냥 쓴 DELETE가 연결된 정점을 거부하는 것 보기 ```cypher MATCH (m:movie {title: 'Tenet'}) DELETE m; ``` ``` ERROR: Vertex with connected edges cannot be removed HINT: Use DETACH DELETE or remove connected edges before deleting the vertex. ``` 아무것도 지워지지 않습니다. 그래프는 끝점이 사라진 간선을 결코 갖지 않습니다. {#delete-delete-an-edge} ### 간선 지우기 간선에는 `DETACH`가 필요하지 않고, 그 양 끝점은 살아남습니다: ```cypher MATCH (:person {name: 'Elizabeth Debicki'})-[r:acted_in]->(:movie {title: 'Tenet'}) DELETE r; ``` ``` UPDATE 1 ``` ```cypher MATCH (p:person {name: 'Elizabeth Debicki'})-[r]-() RETURN count(*) AS edges; ``` ``` edges ------- 0 (1 row) ``` {#delete-delete-an-unconnected-vertex-and-see-what-went} ### 연결되지 않은 정점을 지우고 무엇이 사라졌는지 보기 간선이 남아 있지 않으면 그냥 쓴 `DELETE`도 성공합니다. 그 뒤의 `RETURN`이 지워진 요소를 보고합니다: ```cypher MATCH (p:person {name: 'Elizabeth Debicki'}) DELETE p RETURN properties(p) AS removed; ``` ``` removed --------------------------------------------- {"born": 1990, "name": "Elizabeth Debicki"} (1 row) ``` {#delete-delete-a-vertex-and-its-edges-together} ### 정점과 그 간선을 함께 지우기 `Tenet`에는 아직 `directed` 간선이 있습니다. `DETACH DELETE`가 둘 다 가져갑니다: ```cypher MATCH (m:movie {title: 'Tenet'}) DETACH DELETE m; ``` ``` UPDATE 2 ``` 요소 두 개, 간선과 정점입니다. Christopher Nolan은 손대지 않았고 그의 다른 간선도 그대로입니다: ```cypher MATCH (p:person {name: 'Christopher Nolan'})-[:directed]->(m:movie) RETURN m.title AS film ORDER BY film; ``` ``` film ---------------- "Inception" "Interstellar" (2 rows) ``` {#delete-delete-several-elements-in-one-clause} ### 한 절에서 여러 요소 지우기 간선을 그것이 잇는 정점들보다 앞에 나열하면 `DETACH`가 필요하지 않습니다. 정점이 지워질 시점에는 그 간선이 이미 사라져 있기 때문입니다: ```cypher CREATE (:person {name: 'Extra Two'}); MATCH (a:person {name: 'Extra Two'}) CREATE (a)-[:acted_in]->(:movie {title: 'Scratch'}); ``` ``` UPDATE 1 UPDATE 2 ``` ```cypher MATCH (a:person {name: 'Extra Two'})-[r:acted_in]->(m:movie {title: 'Scratch'}) DELETE r, a, m; ``` ``` UPDATE 3 ``` 데이터셋이 원래 크기로 돌아왔습니다: ```cypher MATCH (n) RETURN label(n) AS label, count(*) AS n ORDER BY label; ``` ``` label | n ----------+---- "movie" | 18 "person" | 28 (2 rows) ``` {#delete-notes} ## 참고 `DELETE`는 속성이 아니라 요소를 받습니다. 속성을 이름으로 부르면 조용히 무시되는 것이 아니라 거부됩니다: ```cypher MATCH (m:movie {title: 'The Matrix'}) DELETE m.title; ``` ``` ERROR: node, relationship, or path is expected LINE 1: MATCH (m:movie {title: 'The Matrix'}) DELETE m.title; ^ ``` 속성에는 [`REMOVE`](remove.md)를 쓰거나 `SET m.title = NULL`을 쓰십시오. ```{note} 연결이 많은 정점에 `DETACH DELETE`를 쓰면 한 문장에서 대단히 많은 간선이 지워질 수 있고, 그 전부가 하나의 트랜잭션입니다. 영향 범위가 얼마나 큰지 확실하지 않을 때는 먼저 세어 보십시오 — `MATCH (v)-[r]-() RETURN count(r)`. ``` {#delete-compatibility} ## 호환성 {#delete-nodetach-isoiec-39075-135} ### NODETACH (ISO/IEC 39075 §13.5) 표준의 ``는 `[ DETACH | NODETACH ] DELETE`이고, `NODETACH`가 암시적 기본값입니다. AgensGraph는 그 기본 동작은 구현했지만 키워드는 구현하지 않았습니다. `NODETACH DELETE m`은 구문 오류입니다. 같은 뜻인 그냥 `DELETE`를 쓰십시오. {#delete-see-also} ## 관련 항목 - [`REMOVE`](remove.md) — 요소가 아니라 속성을 지우기 - [`MATCH`](match.md) — 지울 요소를 바인딩하기 - [`CREATE`](create.md), [`MERGE`](merge.md) — 그것들을 만들어 넣은 절 - [데이터 정의](../ddl/index) — 레이블이나 그래프 전체를 지우기