{#agens-the-agens-client} # agens 클라이언트 `agens`는 대화형 터미널 클라이언트입니다. PostgreSQL의 `psql`을 AgensGraph 이름으로 부르는 것이며, 여기에 그래프를 설명하는 메타 명령 다섯 개가 더해져 있습니다. `psql`이므로 모든 옵션과 모든 변수와 그 밖의 모든 메타 명령은 [PostgreSQL의 `psql` 레퍼런스](https://www.postgresql.org/docs/18/app-psql.html)가 문서화합니다. 그것을 여기서 되풀이하지 않습니다. 이 페이지가 다루는 것은 둘입니다. 다른 어디에도 없는 그래프 메타 명령, 그리고 AgensGraph의 것인 환경 세부 두 가지입니다. {#agens-the-same-program-under-two-names} ## 이름 둘을 가진 같은 프로그램 빌드는 같은 소스에서 바이너리 두 개를 만들어 둘 다 설치합니다. 차이는 브랜딩뿐입니다. 각자가 출력하는 이름, 그리고 도움말의 버그 신고 줄과 홈페이지 줄입니다. ```shell agens --version psql --version ``` ``` agens (AgensGraph) 2.18.6.0 psql (PostgreSQL) 18.6 ``` 두 도움말을 diff 하면 차이 전부가 드러납니다: ```shell diff <(agens --help) <(psql --help) ``` ``` 62,63c62,63 < Report bugs to . < AgensGraph home page: --- > Report bugs to . > PostgreSQL home page: ``` 여기서 결론 둘이 따라오고, 둘 다 일을 덜어 줍니다. **`psql`에 대해 아는 것이 그대로 적용됩니다.** 같은 옵션, 같은 `~/.psqlrc`, 같은 `PG*` 환경 변수, 같은 `\copy`, `\watch`, `\gexec`, `\timing`, `\x`, `\pset`, 같은 탭 완성과 변수 치환입니다. ```shell agens -d docs -c "SHOW agversion;" ``` ``` agversion ------------ 2.18.6.0 ``` **그래프 메타 명령은 두 바이너리에 다 있습니다.** 둘은 같은 오브젝트로 빌드되므로, 이 설치본의 `psql`도 `agens`와 똑같이 그래프를 나열합니다. 이미 `psql`이 경로에 있다면 그래프를 설명하려고 클라이언트를 바꿀 필요가 없습니다. 서버 도구도 같은 방식을 따르며, 이름이 바뀐 쌍이 하나 있습니다: | AgensGraph 이름 | PostgreSQL 이름 | 차이 | | --- | --- | --- | | `agens` | `psql` | 브랜딩뿐입니다. 둘 다 설치됩니다. | | `ag_ctl` | `pg_ctl` | 브랜딩뿐입니다. 둘 다 설치됩니다. | 그 밖의 모든 도구는 PostgreSQL 이름을 그대로 지니며 그 이름뿐입니다. `initdb`, `postgres`, `pg_dump`, `pg_dumpall`, `pg_restore`, `pg_basebackup`, `pg_upgrade`, `pg_controldata`, `pg_checksums`, `pg_rewind`, `pg_waldump`, `createdb`, `dropdb`, `createuser`, `dropuser`, `vacuumdb`, `reindexdb`, `clusterdb`, `pgbench`, `ecpg`와 나머지가 그렇습니다. `ag_dump`도 `ag_basebackup`도 없습니다. 이 도구들이 그래프를 어떻게 다루는지는 [서버 측 도구](../operations/tools.md)가 다룹니다. {#agens-graph-meta-commands} ## 그래프 메타 명령 메타 명령 다섯 개가 그래프를 설명합니다. `+`는 각각에 컬럼을 더하고, 패턴은 나열 대상을 좁힙니다. | 명령 | 나열하는 것 | | --- | --- | | `\dG[+] [PATTERN]` | 그래프입니다. | | `\dGl[+] [PATTERN]` | 레이블 두 종류 모두입니다. | | `\dGv[+] [PATTERN]` | 정점 레이블, 그리고 각각의 설명입니다. | | `\dGe[+] [PATTERN]` | 간선 레이블, 그리고 각각의 설명입니다. | | `\dGi[+] [PATTERN]` | 속성 인덱스입니다. | 대소문자가 중요합니다. `\dG`는 그래프를 나열합니다. `\dg`는 PostgreSQL 자신의 명령이며 롤을 나열합니다. 이 다섯이 전부이고, 그중 어느 것도 `\?`에 나오지 않습니다. 다른 `\d` 명령이 받는 `x`와 `S` 수식자는 `\dG` 바로 뒤에서는 받아들여지지 않습니다: ```psql \dGx moviekb ``` ``` invalid command \dGx ``` `x`는 하위 명령 네 개에서는 동작하므로, `\dGvx`는 목록을 확장 모드로 출력합니다. 아래 예제는 모두 [예제 데이터셋](../get_started/example-dataset.md)을 상대로 실행합니다. {#agens-list-the-graphs-in-a-database} ### 데이터베이스의 그래프 나열하기 ```psql \dG moviekb ``` ``` List of graphs Name | Owner ---------+------- moviekb | agens ``` `+`는 그래프의 접근 권한과 주석을 더합니다. 그래프는 스키마이므로 그 권한은 스키마 권한입니다. 무엇인가 부여하기 전에는 비어 있으므로, 컬럼이 채워진 것을 보려면 하나를 부여하십시오: ```sql GRANT USAGE ON SCHEMA moviekb TO PUBLIC; ``` ```psql \dG+ moviekb ``` ``` List of graphs Name | Owner | Access privileges | Description ---------+-------+-------------------+------------- moviekb | agens | agens=UC/agens +| | | =U/agens | ``` 예제 데이터셋을 원래대로 두기 위해 다시 회수합니다: ```sql REVOKE USAGE ON SCHEMA moviekb FROM PUBLIC; ``` 패턴을 주지 않으면 `\dG`는 데이터베이스의 모든 그래프를 나열합니다. {#agens-list-a-graphs-labels} ### 그래프의 레이블 나열하기 `\dGl`은 두 종류를 함께 나열하며, 그래프·종류·이름 순으로 정렬합니다: ```psql \dGl moviekb.* ``` ``` List of labels Graph | Name | Type | Owner ---------+------------+--------+------- moviekb | acted_in | edge | agens moviekb | ag_edge | edge | agens moviekb | directed | edge | agens moviekb | related_to | edge | agens moviekb | ag_vertex | vertex | agens moviekb | movie | vertex | agens moviekb | person | vertex | agens ``` 모든 그래프가 `ag_vertex`와 `ag_edge`를 가지므로 그 둘이 함께 나옵니다. [레이블 상속](../concepts/label-inheritance.md)을 참고하십시오. `+`는 레이블의 디스크 크기와 주석을 더합니다. 크기는 레이블 테이블의 `pg_table_size`이므로, 적재한 만큼을 반영합니다: ```psql \dGl+ moviekb.* ``` ``` List of labels Graph | Name | Type | Owner | Size | Description ---------+------------+--------+-------+------------+------------------------------------ moviekb | acted_in | edge | agens | 16 kB | moviekb | ag_edge | edge | agens | 8192 bytes | base edge label of graph moviekb moviekb | directed | edge | agens | 16 kB | moviekb | related_to | edge | agens | 16 kB | moviekb | ag_vertex | vertex | agens | 8192 bytes | base vertex label of graph moviekb moviekb | movie | vertex | agens | 16 kB | moviekb | person | vertex | agens | 16 kB | ``` {#agens-describe-the-vertex-labels} ### 정점 레이블 설명 보기 `\dGv`는 목록을 정점 레이블로 좁힌 다음, `\d`가 테이블의 꼬리말을 출력하듯 각각에 대한 블록을 출력합니다. 블록에는 그 레이블의 속성 인덱스와 제약, 그 레이블이 상속하는 레이블과 그 레이블을 상속하는 레이블이 담깁니다: ```psql \dGv moviekb.* ``` ``` List of labels Graph | Name | Type | Owner ---------+-----------+--------+------- moviekb | ag_vertex | vertex | agens moviekb | movie | vertex | agens moviekb | person | vertex | agens Vertex label "moviekb.ag_vertex" -- Child labels: moviekb.movie, moviekb.person Vertex label "moviekb.movie" -- Inherits: moviekb.ag_vertex Vertex label "moviekb.person" -- Inherits: moviekb.ag_vertex ``` 인덱스와 제약이 있는 레이블은 둘 다 보여 줍니다: ```cypher CREATE GRAPH demo; SET graph_path = demo; CREATE VLABEL book; CREATE PROPERTY INDEX ON book (title); CREATE CONSTRAINT book_isbn_uq ON book ASSERT isbn IS UNIQUE; ``` ```psql \dGv demo.book ``` ``` List of labels Graph | Name | Type | Owner -------+------+--------+------- demo | book | vertex | agens Vertex label "demo.book" -- Property Indexes: "book_title_idx" btree (title) Constraints: "book_isbn_uq" ASSERT (isbn) IS UNIQUE Inherits: demo.ag_vertex ``` 블록이 보여 주지 **않는** 것에 유의하십시오. 레이블의 컬럼입니다. `id`와 `properties`, 그리고 승격된 컬럼을 보려면 레이블이 테이블이므로 그 테이블에 `\d`를 쓰십시오: ```psql \d moviekb.movie ``` ``` Table "moviekb.movie" Column | Type | Collation | Nullable | Default ------------+---------+-----------+----------+------------------------------------------------------------------------------------------- id | graphid | | not null | graphid(graph_labid('moviekb.movie'::cstring), nextval('moviekb.movie_id_seq'::regclass)) properties | jsonb | | not null | jsonb_build_object() Indexes: "movie_pkey" PRIMARY KEY, btree (id) Inherits: moviekb.ag_vertex ``` {#agens-describe-the-edge-labels} ### 간선 레이블 설명 보기 `\dGe`는 간선에 대한 `\dGv`이며, 블록의 모양도 같습니다: ```psql \dGe moviekb.acted_in ``` ``` List of labels Graph | Name | Type | Owner ---------+----------+------+------- moviekb | acted_in | edge | agens Edge label "moviekb.acted_in" -- Inherits: moviekb.ag_edge ``` 이 블록을 출력하지 않는 것이 `\dGl`입니다. 그것은 두 종류의 요약일 뿐, 그 이상이 아닙니다. {#agens-list-the-property-indexes} ### 속성 인덱스 나열하기 `\dGi`는 `ag_property_indexes`를 읽어 각 인덱스의 Cypher 정의, 즉 다시 만들 때 입력할 그 문장을 보여 줍니다. 속성 인덱스가 없는 그래프는 아무것도 나열하지 않습니다: ```psql \dGi moviekb.* ``` ``` No matching property indexes found. ``` ```psql \dGi demo.* ``` ``` List of property indexes Graph | LabelName | IndexName | Unique | Owner | Indexdef -------+-----------+----------------+--------+-------+------------------------------------------------------------------ demo | book | book_title_idx | f | agens | CREATE PROPERTY INDEX book_title_idx ON book USING btree (title) ``` `+`는 인덱스의 크기와 주석을 더합니다: ```psql \dGi+ demo.* ``` ``` List of property indexes Graph | LabelName | IndexName | Unique | Owner | Indexdef | Size | Description -------+-----------+----------------+--------+-------+------------------------------------------------------------------+------------+------------- demo | book | book_title_idx | f | agens | CREATE PROPERTY INDEX book_title_idx ON book USING btree (title) | 8192 bytes | ``` 고유성 제약은 속성 인덱스가 아니므로 여기에 나오지 않습니다. 그것은 자기 레이블의 `\dGv`나 `\dGe` 블록에, 그리고 `\d`에서는 제외 제약으로 나타납니다. ```psql DROP GRAPH demo CASCADE; ``` ``` NOTICE: drop cascades to 4 other objects DETAIL: drop cascades to sequence demo.ag_label_seq drop cascades to vlabel ag_vertex drop cascades to elabel ag_edge drop cascades to vlabel book DROP GRAPH ``` {#agens-narrow-a-listing-with-a-pattern} ### 패턴으로 목록 좁히기 패턴은 PostgreSQL의 `\d` 패턴 언어이며, 점으로 구분한 이름 두 부분에 적용됩니다. 그 언어에는 `*`와 `?` 와일드카드, 문자 클래스, 그리고 대소문자 접기를 막는 큰따옴표가 있습니다. 그 두 부분이 무엇인지는 명령마다 다르고, 그 차이에서 자주 헷갈립니다: | 명령 | *첫째*`.`*둘째*의 뜻 | | --- | --- | | `\dG` | 그래프 이름입니다. 둘째 부분은 없습니다. | | `\dGl`, `\dGv`, `\dGe` | 그래프, 그다음 **레이블** 이름입니다. | | `\dGi` | 그래프, 그다음 **인덱스** 이름입니다. | 그래서 `\dGi moviekb.movie`는 아무것도 찾지 못합니다. `movie`가 인덱스 이름과 대조되기 때문입니다: ```psql \dGi moviekb.movie ``` ``` No matching property indexes found. ``` 대신 인덱스 이름을 대거나, `moviekb.*`를 쓰고 `LabelName` 컬럼을 읽으십시오. 아무것도 일치하지 않는 패턴은 그렇다고 말하며, 오류가 아닙니다: ```psql \dGv nosuchgraph.* ``` ``` No matching labels found. ``` {#agens-agdata} ## AGDATA `AGDATA`는 `PGDATA`가 그러하듯 데이터 디렉터리를 가리킵니다. 이것을 읽는 프로그램은 정확히 셋입니다. `initdb`와 `pg_ctl`과 `ag_ctl`입니다. 다른 도구는 읽지 않습니다. `agens`도, `psql`도, `pg_dump`도, `pg_basebackup`도 읽지 않습니다. 그러므로 모든 것이 존중하는 변수를 설정하고 싶다면 여전히 `PGDATA`를 설정해야 합니다. 한 번 export 해 두면 그 셋은 `-D`가 필요 없어집니다: ```shell export AGDATA=/tmp/agensdata ag_ctl status ``` ``` ag_ctl: no server running ``` 둘 다 읽는 두 프로그램 사이에서 우선순위가 다르므로, 둘 다 설정하기 전에 확인하십시오: | 프로그램 | 순서 | | --- | --- | | `initdb` | `-D`, 그다음 `AGDATA`, 그다음 `PGDATA`입니다. | | `pg_ctl`과 `ag_ctl` | `-D`, 그다음 `PGDATA`, 그다음 `AGDATA`입니다. | `initdb`는 결정을 내린 뒤 자기 환경에도 `AGDATA`를 설정하며, 마지막 힌트는 `ag_ctl`을 가리킵니다: ```shell env -u PGDATA AGDATA=/tmp/agensdata initdb -U agens --no-sync ``` ``` Success. You can now start the database server using: ag_ctl -D /tmp/agensdata -l logfile start ``` 두 변수 모두 설정하지 않고 `-D`도 주지 않으면 메시지는 `PGDATA`만 가리킵니다. `AGDATA`도 똑같이 동작했을 것입니다: ```shell ag_ctl status ``` ``` ag_ctl: no database directory specified and environment variable PGDATA unset Try "ag_ctl --help" for more information. ``` 데이터 디렉터리를 어디에 두고 init 시스템에서 서버를 어떻게 기동하는지는 [배포](../operations/deployment.md)가 다룹니다. {#agens-see-also} ## 관련 항목 - [서버 측 도구](../operations/tools.md) — `ag_ctl`·`pg_dump`·`pg_upgrade`와 그래프 - [예제 데이터셋](../get_started/example-dataset.md) — 위의 모든 목록이 설명하는 그래프 - [시스템 카탈로그](../system_catalogs/catalogs.md) — 이 명령들이 조회하는 `ag_graph`·`ag_label`· `ag_property_indexes` - [서버 설정](guc.md) — 세션이 Cypher를 실행하기 전에 필요한 `graph_path` - [PostgreSQL: psql](https://www.postgresql.org/docs/18/app-psql.html) — 모든 옵션과 그 밖의 모든 메타 명령 - [PostgreSQL: pg_ctl](https://www.postgresql.org/docs/18/app-pg-ctl.html) — `ag_ctl`이 무엇인가