DELETE#
GQL 절
그래프에서 정점과 간선을 지웁니다. DETACH DELETE는 정점의 간선까지 함께 지웁니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
DELETE는 자기 표현식이 가리키는 그래프 요소를 지웁니다. 그 요소가 먼저 바인딩돼 있어야 하므로,
항상 그것들을 찾아낸 절 뒤에 옵니다.
그냥 쓴
DELETE는 아직 간선이 남은 정점을 거부합니다. 그것을 지우면 아무것도 가리키지 않는 간선이 남으므로, 이 절은 오류를 내고 트랜잭션이 롤백됩니다.DETACH DELETE는 정점의 간선을 먼저 지우고 그다음 정점을 지웁니다. 그 정점이 연결돼 있을 수 있다면 언제든 이것을 쓰십시오.간선을 지우는 데는
DETACH가 필요하지 않고, 양 끝점에는 손대지 않습니다.표현식을 여러 개 나열할 수 있습니다. 적은 순서대로 지워지므로, 간선을 그 양 끝점보다 앞에 나열하면
DETACH없이도 됩니다.DELETE는 들어오는 행마다 한 번 실행됩니다. 앞선 행이 이미 지운 요소는 오류가 아닙니다.각 표현식은 정점, 간선, 또는 경로여야 합니다. 속성 참조는 받지 않습니다. 속성을 지우려면
REMOVE를 쓰십시오.DELETE는 쿼리를 끝낼 수 있습니다. 무엇이 사라졌는지 보려면RETURN을 붙이십시오.
매개변수#
- DETACH
각 정점에 연결된 간선을 그 정점과 함께 지웁니다.
- expression
정점, 간선, 또는 경로를 내놓는 표현식이며, 보통
MATCH가 바인딩한 변수입니다.
예제#
모든 예제는 예제 데이터셋에서 실행됩니다. 첫 예제가 나머지 예제들이 지울 부분 그래프를 만들므로, 데이터셋은 시작할 때 모습으로 끝납니다.
지울 것을 만들기#
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에는 간선이 두 개 있습니다:
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가 연결된 정점을 거부하는 것 보기#
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.
아무것도 지워지지 않습니다. 그래프는 끝점이 사라진 간선을 결코 갖지 않습니다.
간선 지우기#
간선에는 DETACH가 필요하지 않고, 그 양 끝점은 살아남습니다:
MATCH (:person {name: 'Elizabeth Debicki'})-[r:acted_in]->(:movie {title: 'Tenet'})
DELETE r;
UPDATE 1
MATCH (p:person {name: 'Elizabeth Debicki'})-[r]-() RETURN count(*) AS edges;
edges
-------
0
(1 row)
연결되지 않은 정점을 지우고 무엇이 사라졌는지 보기#
간선이 남아 있지 않으면 그냥 쓴 DELETE도 성공합니다. 그 뒤의 RETURN이 지워진 요소를
보고합니다:
MATCH (p:person {name: 'Elizabeth Debicki'})
DELETE p
RETURN properties(p) AS removed;
removed
---------------------------------------------
{"born": 1990, "name": "Elizabeth Debicki"}
(1 row)
정점과 그 간선을 함께 지우기#
Tenet에는 아직 directed 간선이 있습니다. DETACH DELETE가 둘 다 가져갑니다:
MATCH (m:movie {title: 'Tenet'}) DETACH DELETE m;
UPDATE 2
요소 두 개, 간선과 정점입니다. Christopher Nolan은 손대지 않았고 그의 다른 간선도 그대로입니다:
MATCH (p:person {name: 'Christopher Nolan'})-[:directed]->(m:movie)
RETURN m.title AS film
ORDER BY film;
film
----------------
"Inception"
"Interstellar"
(2 rows)
한 절에서 여러 요소 지우기#
간선을 그것이 잇는 정점들보다 앞에 나열하면 DETACH가 필요하지 않습니다. 정점이 지워질 시점에는
그 간선이 이미 사라져 있기 때문입니다:
CREATE (:person {name: 'Extra Two'});
MATCH (a:person {name: 'Extra Two'}) CREATE (a)-[:acted_in]->(:movie {title: 'Scratch'});
UPDATE 1
UPDATE 2
MATCH (a:person {name: 'Extra Two'})-[r:acted_in]->(m:movie {title: 'Scratch'})
DELETE r, a, m;
UPDATE 3
데이터셋이 원래 크기로 돌아왔습니다:
MATCH (n) RETURN label(n) AS label, count(*) AS n ORDER BY label;
label | n
----------+----
"movie" | 18
"person" | 28
(2 rows)
참고#
DELETE는 속성이 아니라 요소를 받습니다. 속성을 이름으로 부르면 조용히 무시되는 것이 아니라
거부됩니다:
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를 쓰거나 SET m.title = NULL을 쓰십시오.
참고
연결이 많은 정점에 DETACH DELETE를 쓰면 한 문장에서 대단히 많은 간선이 지워질 수 있고, 그
전부가 하나의 트랜잭션입니다. 영향 범위가 얼마나 큰지 확실하지 않을 때는 먼저 세어 보십시오 —
MATCH (v)-[r]-() RETURN count(r).
호환성#
NODETACH (ISO/IEC 39075 §13.5)#
표준의 <delete statement>는 [ DETACH | NODETACH ] DELETE이고, NODETACH가 암시적
기본값입니다. AgensGraph는 그 기본 동작은 구현했지만 키워드는 구현하지 않았습니다.
NODETACH DELETE m은 구문 오류입니다. 같은 뜻인 그냥 DELETE를 쓰십시오.