{#create-graph-create-graph} # CREATE GRAPH 그래프를 만듭니다. 스키마 하나, 모든 레이블이 상속하는 기반 레이블 두 개, 그리고 레이블 id를 배정하는 시퀀스입니다. {#create-graph-synopsis} ## 개요
CREATE GRAPH [ IF NOT EXISTS ] graph_name [ AUTHORIZATION role_specification ]
CREATE GRAPH ONLY graph_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)