{#create-graph-create-graph}
# CREATE GRAPH
그래프를 만듭니다. 스키마 하나, 모든 레이블이 상속하는 기반 레이블 두 개, 그리고 레이블 id를
배정하는 시퀀스입니다.
{#create-graph-synopsis}
## 개요
CREATE GRAPH[IF NOT EXISTS]graph_name[AUTHORIZATIONrole_specification] CREATE GRAPH ONLYgraph_name
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#create-graph-description}
## 설명
그래프는 스키마입니다. `CREATE GRAPH`는 그 스키마를 만들고 그 안에 객체 세 개를 넣습니다:
- 기반 정점 레이블인 `ag_vertex`,
- 기반 간선 레이블인 `ag_edge`,
- 레이블 id를 배정하는 시퀀스인 `ag_label_seq`입니다.
그 뒤에 만드는 모든 레이블은 `ag_vertex`나 `ag_edge`를 상속합니다. `MATCH (n)`처럼 레이블 없는
패턴에 뜻을 주는 것이 그 상속입니다. 그 객체들과 식별자 체계는
[그래프가 어떻게 저장되는가](../../concepts/graph-on-postgresql.md)가 온전히
설명합니다.
- 그 이름은 그래프 이름으로도, 스키마 이름으로도 비어 있어야 합니다. 그래프가 같은 이름의 스키마를
소유하기 때문입니다.
- 세션의 `graph_path`가 비어 있으면 `CREATE GRAPH`가 그것을 새 그래프로 설정합니다. 이미 설정된
`graph_path`는 그대로 둡니다.
- `CREATE GRAPH ONLY`는 스키마와 카탈로그 행만 만들고 그 밖에는 아무것도 만들지 않습니다. `pg_dump`가
내보내는 형태이며, 복원할 때 기반 레이블을 원래의 레이블 id로 직접 다시 만들 수 있게 하기
위한 것입니다. 이렇게 만든 그래프는 그 기반 레이블이 생기기 전까지 레이블을 담을 수 없습니다.
{#create-graph-parameters}
## 매개변수
IF NOT EXISTS
: 그 이름의 그래프가 이미 있을 때 오류가 아니라 알림을 냅니다. 아무것도 만들어지지 않고, 이미 있는
것도 바뀌지 않습니다.
graph_name
: 만들 그래프의 이름입니다.
AUTHORIZATION role_specification
: 그 그래프와 함께 만들어지는 객체를 소유하는 롤입니다. 롤 이름, `CURRENT_ROLE`, `CURRENT_USER`,
`SESSION_USER` 중 하나를 씁니다. 이 절이 없으면 그래프는 그 문장을 실행한 롤에 속합니다.
ONLY
: `ag_vertex`·`ag_edge`·`ag_label_seq` 없이 스키마와 카탈로그 행만 만듭니다. 그냥 쓴 형태와 달리
`graph_path`에 손대지 않습니다.
{#create-graph-examples}
## 예제
예제는 [예제 데이터셋](../../get_started/example-dataset.md)을 쓰지 않고 자체 그래프인
`boxoffice`를 만들고, 끝에서 그것을 지웁니다.
{#create-graph-create-a-graph}
### 그래프 만들기
```cypher
CREATE GRAPH boxoffice;
```
```
CREATE GRAPH
```
이 문장이 비어 있던 `graph_path`를 차지했습니다:
```sql
SHOW graph_path;
```
```
graph_path
------------
boxoffice
(1 row)
```
그 그래프가 `\dG`에 나열됩니다:
```psql
\dG boxoffice
```
```
List of graphs
Name | Owner
-----------+-------
boxoffice | agens
(1 row)
```
그리고 그것은 이미 기반 레이블 두 개를 담고 있습니다:
```psql
\dGl boxoffice.*
```
```
List of labels
Graph | Name | Type | Owner
-----------+-----------+--------+-------
boxoffice | ag_edge | edge | agens
boxoffice | ag_vertex | vertex | agens
(2 rows)
```
{#create-graph-create-a-graph-only-if-it-is-not-there}
### 없을 때만 그래프 만들기
```cypher
CREATE GRAPH IF NOT EXISTS boxoffice;
```
```
NOTICE: graph "boxoffice" already exists, skipping
CREATE GRAPH
```
이미 있는 그래프는 손대지 않습니다. 이것은 "만들거나 교체하기"가 아닙니다.
{#create-graph-create-a-graph-owned-by-another-role}
### 다른 롤이 소유하는 그래프 만들기
```sql
CREATE ROLE curator;
```
```cypher
CREATE GRAPH festival AUTHORIZATION curator;
```
```
CREATE GRAPH
```
```psql
\dG festival
```
```
List of graphs
Name | Owner
----------+---------
festival | curator
(1 row)
```
{#create-graph-create-the-schema-without-the-base-labels}
### 기반 레이블 없이 스키마만 만들기
```cypher
CREATE GRAPH ONLY skeleton;
```
```
CREATE GRAPH
```
그래프는 존재하지만 아무것도 담고 있지 않습니다:
```psql
\dGl skeleton.*
```
```
No matching labels found.
```
`ag_vertex`가 없으므로 그 안에 레이블을 만들 수 없습니다:
```cypher
SET graph_path = skeleton;
CREATE VLABEL film;
```
```
ERROR: relation "skeleton.ag_vertex" does not exist
```
그래프 세 개와 그 롤을 정리합니다:
```cypher
DROP GRAPH boxoffice CASCADE;
DROP GRAPH festival CASCADE;
DROP GRAPH skeleton;
```
```sql
DROP ROLE curator;
```
`skeleton`에는 그 안에 만들어진 것이 없으므로 `CASCADE`가 필요하지 않습니다. 그냥 쓴 형태로 만든
그래프는 항상 필요합니다. [`DROP GRAPH`](drop-graph.md)를 참고하십시오.
{#create-graph-notes}
## 참고
`graph_path`는 수식되지 않은 레이블 이름이 속하는 그래프를 지정합니다. 세션 단위 설정이므로 새
세션마다 설정하거나, 데이터베이스나 롤에 붙여 두십시오:
```sql
ALTER DATABASE SET graph_path = boxoffice;
```
그래프 전체에 작용하는 문장이 두 개 더 있습니다. 둘 다 `IF EXISTS` 형태는 없습니다:
```cypher
CREATE GRAPH receipts;
ALTER GRAPH receipts RENAME TO takings;
ALTER GRAPH takings OWNER TO CURRENT_USER;
SHOW graph_path;
```
```
graph_path
------------
takings
(1 row)
```
이름을 바꾸면 그 아래의 스키마도 그래프와 함께 옮겨지고, 세션의 `graph_path`도 그것을 따라갑니다.
그래서 위에서 `receipts`가 아니라 `takings`로 읽힙니다.
```cypher
DROP GRAPH takings CASCADE;
```
{#create-graph-compatibility}
## 호환성
{#create-graph-isoiec-39075-gql}
### ISO/IEC 39075 (GQL)
GQL은 ``(§12.4)를
`CREATE [PROPERTY] GRAPH { | }`로 정의합니다. 그래프는
어떤 내용이든 받는 `ANY`로 만들거나, 정점 타입·간선 타입·속성을 제약하는 *그래프 타입*에 맞춰
만듭니다. AgensGraph의 그래프는 언제나 열려 있으므로 그래프 타입을 적지 않고, 적을 수도 없습니다.
`PROPERTY` 표기는 받아들여지지 않습니다. `CREATE PROPERTY GRAPH boxoffice`는 구문 오류입니다.
그래프 타입은 [GQL 적합성 표](../../appendix/gql-conformance.md)에 계획으로 기록돼 있습니다.
`AUTHORIZATION`과 `ONLY`는 AgensGraph 자신의 것이며, GQL에는 둘 다 없습니다. GQL의 `OR REPLACE`
형태도 받아들여지지 않습니다.
{#create-graph-postgresql}
### PostgreSQL
`CREATE GRAPH`는 `CREATE SCHEMA`에 대응하고, `IF NOT EXISTS`와 `AUTHORIZATION`도 거기서와 같은
뜻입니다. 차이는 내용물입니다. `CREATE SCHEMA`는 빈 스키마를 만듭니다. `CREATE GRAPH`는 기반
레이블과 레이블 id 시퀀스까지 만들고, Cypher가 찾을 수 있도록 그 스키마를 `ag_graph`에 등록합니다.
`CREATE SCHEMA`만으로는 그래프가 만들어지지 않습니다.
{#create-graph-see-also}
## 관련 항목
- [`DROP GRAPH`](drop-graph.md)
- [`CREATE VLABEL`](create-vlabel.md)
- [`CREATE ELABEL`](create-elabel.md)
- [그래프가 어떻게 저장되는가](../../concepts/graph-on-postgresql.md)