굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#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) — 레이블이나 그래프 전체를 지우기