DROP VLABEL과 DROP ELABEL#

정점 레이블이나 간선 레이블을 지우며, CASCADE를 쓰면 그 안의 행까지 지웁니다.

개요#

DROP VLABEL [ IF EXISTS ] label_name [, ... ] [ CASCADE | RESTRICT ]
DROP ELABEL [ IF EXISTS ] label_name [, ... ] [ CASCADE | RESTRICT ]

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

설명#

DROP VLABEL은 정점 레이블을, DROP ELABEL은 간선 레이블을 지우며, 각각 다른 종류는 거부합니다. 레이블을 지우면 그 뒤의 테이블이 지워지고, 그 id 시퀀스·인덱스·제약도 함께 지워집니다.

기본값인 RESTRICT가 문제 삼는 것이 두 가지 있습니다:

  • 행. 정점이나 간선을 아직 담고 있는 레이블은 cannot drop <label> because it is not empty. 로 거부됩니다. PostgreSQL이 테이블에 적용하는 의존성 검사보다 엄격하고, 사람들이 여기에 걸립니다.

  • 자식. 자식 레이블이 있는 레이블은 거부되고, 메시지가 그 자식을 이름으로 부릅니다.

CASCADE는 그 둘을 모두 무릅씁니다. 무엇을 담고 있든 레이블을 지우며, 다음과 같습니다:

  • 정점 레이블을 지우면 그 정점에 붙어 있던 간선이 지워지며, 그 간선의 레이블이 무엇이든 그렇습니다. 간선 레이블 자체는 남습니다.

  • 간선 레이블을 지우면 그 레이블의 간선만 지워집니다. 그것이 잇고 있던 정점은 남습니다.

레이블은 graph_path가 지정한 그래프에서 찾습니다. 그 이름은 수식할 수 없습니다.

  • 기반 레이블인 ag_vertex와 ag_edge는 지울 수 없습니다.

  • 레이블 뒤의 테이블만 따로 지울 수는 없습니다. 그것에 DROP TABLE을 쓰면 거부되고 이 문장을 가리킵니다.

  • 레이블을 지우지 않고 그래프를 비우려면 MATCH (n) DETACH DELETE n을 쓰십시오.

매개변수#

IF EXISTS

존재하지 않는 레이블에 대해 오류가 아니라 알림을 냅니다. 같은 문장의 다른 이름은 그대로 지워집니다.

label_name

지울 레이블의 이름입니다. 쉼표로 구분해 여러 개를 줄 수 있습니다.

CASCADE

그 레이블을 행과 자식 레이블과 함께 지웁니다. 정점 레이블이라면 그 정점에 붙어 있는 간선도 지웁니다.

RESTRICT

그 레이블이 행을 담고 있거나 자식 레이블이 있으면 거부합니다. 이것이 기본값입니다.

예제#

예제는 예제 데이터셋을 쓰지 않고 자체 그래프인 tidygraph를 만들고, 끝에서 그것을 지웁니다.

CREATE GRAPH tidygraph;
SET graph_path = tidygraph;
CREATE VLABEL film;
CREATE VLABEL person;
CREATE ELABEL directed;
CREATE (:person {name: 'Denis Villeneuve'})-[:directed]->(:film {title: 'Arrival'});
CREATE VLABEL draft;

빈 레이블 지우기#

DROP VLABEL draft;
DROP VLABEL

그 밖에 보고되는 것이 없습니다. 그 밖에 영향을 받은 것이 없기 때문입니다.

정점이 아직 남은 레이블 지우기#

film에는 정점이 있으므로 기본 동작은 거부합니다:

DROP VLABEL film;
ERROR:  cannot drop film because it is not empty.

CASCADE는 그 레이블과 그 정점, 그리고 그것을 가리키던 directed 간선까지 가져갑니다:

DROP VLABEL film CASCADE;
DROP VLABEL
MATCH ()-[e:directed]->() RETURN count(e) AS directed_edges;
 directed_edges 
----------------
 0
(1 row)

간선은 사라졌지만 그 레이블은 아닙니다. directed는 비어 있는 채로 여전히 있습니다:

\dGl tidygraph.dir*
           List of labels
   Graph   |   Name   | Type | Owner
-----------+----------+------+-------
 tidygraph | directed | edge | agens
(1 row)

부모 레이블 지우기#

CREATE VLABEL work;
CREATE VLABEL documentary INHERITS (work);
DROP VLABEL work;
ERROR:  cannot drop vlabel work because other objects depend on it
DETAIL:  vlabel documentary depends on vlabel work
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

CASCADE는 함께 가져가는 자식을 이름으로 알려 줍니다:

DROP VLABEL work CASCADE;
NOTICE:  drop cascades to vlabel documentary
DROP VLABEL

여러 레이블 지우기, 이미 없는 것은 건너뛰기#

CREATE VLABEL a;
CREATE VLABEL b;
DROP VLABEL IF EXISTS a, b, c;
NOTICE:  vlabel "c" does not exist, skipping
DROP VLABEL

알아 둘 만한 거부 사례#

각 문장은 한 종류의 레이블만 지웁니다:

DROP ELABEL person;
ERROR:  DROP ELABEL cannot DROP vertex label

기반 레이블은 남습니다:

DROP VLABEL ag_vertex;
ERROR:  DROP base vertex label is prohibited

그리고 레이블 아래에서 테이블만 빼내 지울 수는 없습니다:

DROP TABLE tidygraph.person;
ERROR:  cannot drop table tidygraph.person because vlabel person requires it
HINT:  You can drop vlabel person instead.

마지막으로 예제가 만든 그래프를 지웁니다:

DROP GRAPH tidygraph CASCADE;

참고#

끝점 정점이 지워진 간선은 그것과 함께 지워지며, 여기서도 DETACH DELETE에서도 그렇습니다. start와 end는 외래 키가 아니라 평범한 graphid 컬럼입니다. 이 일을 하는 것은 테이블에 걸린 참조 동작이 아니라 그래프 쓰기 경로입니다.

참고

cypher_allow_unsafe_ddl은 종류 검사와 기반 레이블 검사를 끄므로, 그것을 켜면 DROP ELABEL이 정점 레이블을 지우고 ag_vertex도 지울 수 있게 됩니다. 카탈로그가 이미 잘못된 그래프를 수리하기 위해 있는 것입니다. 그 밖의 경우에는 꺼 두십시오.

호환성#

ISO/IEC 39075 (GQL)#

GQL에는 레이블을 지우는 문장이 없습니다. 요소 타입은 그래프 타입에 속하고, 그래프 타입은 <drop graph type statement>(§12.7)로 통째로 지워지며, 그것을 지워도 데이터는 지워지지 않습니다. 그래프 타입은 GQL 적합성 표에 계획으로 기록돼 있습니다.

PostgreSQL#

DROP VLABEL과 DROP ELABEL은 DROP TABLE에 대응하고, IF EXISTS와 이름 목록, CASCADE/RESTRICT도 거기서와 같이 동작합니다. DROP TABLE에 대응물이 없는 추가가 하나 있습니다. DROP TABLE은 테이블에 행이 몇 개든 상관하지 않지만, 이 문장들은 CASCADE를 쓰지 않으면 비어 있지 않은 레이블을 거부합니다. 그리고 정점 레이블에서는 CASCADE가 다른 레이블의 간선까지 지웁니다. 여기서 CASCADE는 “그리고 그것에 의존하는 카탈로그 객체”만이 아니라 “그리고 그것에 의존하는 그래프 데이터”로 읽으십시오.

관련 항목#