{#catalogs-graph-catalogs} # 그래프 카탈로그 AgensGraph는 `pg_catalog`에 테이블 일곱 개를 더합니다. 그중 넷이 그래프 구조를 설명하며, 조회하게 될 것은 그 넷입니다. 셋은 모든 레이블이 상속하는 공용 부모 릴레이션입니다. PostgreSQL 자신의 카탈로그는 바뀌지 않았고 [그 카탈로그 장](https://www.postgresql.org/docs/18/catalogs.html)에 문서화돼 있습니다. | 카탈로그 | 담는 것 | | --- | --- | | [`ag_graph`](#catalogs-ag_graph) | 그래프마다 한 행입니다. | | [`ag_label`](#catalogs-ag_label) | 레이블마다 한 행이며 정점과 간선을 가리지 않습니다. | | [`ag_label_property`](#catalogs-ag_label_property) | 타입 컬럼으로 승격된 속성마다 한 행입니다. | | [`ag_graphmeta`](#catalogs-ag_graphmeta) | (시작 레이블, 간선 레이블, 끝 레이블) 삼중마다의 간선 수입니다. | | `ag_vertex`, `ag_edge` | 그래프 안 모든 정점·간선 레이블의 부모 릴레이션입니다. 각 그래프의 스키마 안에 한 쌍씩 있으며 `pg_catalog`에 있지 않습니다. | | `ag_graphpath` | `graphpath` 타입을 떠받치는 복합 타입입니다. | 같은 정보를 읽기 좋은 형태로 보여 주는 뷰가 둘 있습니다. [그래프 뷰](views.md)를 참고하십시오. {#catalogs-ag_graph} ## ag_graph 그래프마다 한 행입니다. 그래프는 스키마이므로 `nspid`가 그 레이블들을 담은 스키마를 가리킵니다. | 컬럼 | 타입 | 설명 | | --- | --- | --- | | `oid` | `oid` | 행 식별자입니다. | | `graphname` | `name` | 그래프의 이름이며 데이터베이스 안에서 고유합니다. | | `nspid` | `oid` | 그래프 스키마에 해당하는 `pg_namespace` 행입니다. | | `graphmeta_valid` | `boolean` | 이 그래프에 대해 `ag_graphmeta`가 최신인지 여부입니다. 거짓이면 플래너가 그것을 스캔 쳐내기에 쓸 수 없습니다. | ```sql SELECT oid, graphname, nspid, graphmeta_valid FROM pg_catalog.ag_graph; ``` ``` oid | graphname | nspid | graphmeta_valid -------+-----------+-------+----------------- 16386 | g | 16385 | t 16434 | moviekb | 16433 | f ``` 메타데이터가 낡았음이 분명할 때, 이를테면 바이너리 업그레이드 뒤에 `graphmeta_valid`가 거짓으로 설정됩니다. `SELECT regather_graphmeta();` 가 그것을 다시 만들고 플래그를 세웁니다. [그래프 메타데이터](graph-metadata.md)를 참고하십시오. {#catalogs-ag_label} ## ag_label 레이블마다 한 행입니다. 정점 레이블과 간선 레이블이 함께 있으며 `labkind`로 구분합니다. | 컬럼 | 타입 | 설명 | | --- | --- | --- | | `oid` | `oid` | 행 식별자입니다. | | `labname` | `name` | 레이블의 이름이며 그래프 안에서 고유합니다. | | `graphid` | `oid` | 이 레이블이 속한 `ag_graph` 행입니다. | | `labid` | `integer` | 그래프 안에서의 레이블 id이며, 그 안 모든 `graphid`의 상위 16비트입니다. | | `relid` | `oid` | 레이블 테이블에 해당하는 `pg_class` 행입니다. | | `labkind` | `"char"` | 정점 레이블이면 `v`, 간선 레이블이면 `e`입니다. | ```sql SELECT labname, labid, labkind FROM pg_catalog.ag_label WHERE graphid = (SELECT oid FROM pg_catalog.ag_graph WHERE graphname = 'moviekb') ORDER BY labid; ``` ``` labname | labid | labkind ------------+-------+--------- ag_vertex | 1 | v ag_edge | 2 | e movie | 3 | v person | 4 | v acted_in | 5 | e directed | 6 | e related_to | 7 | e ``` `labid` 1과 2는 언제나 그래프와 함께 만들어지는 그 그래프의 `ag_vertex`와 `ag_edge`입니다. `labid`가 16비트이고 0은 유효하지 않으므로, 그래프 하나는 최대 65,535개의 레이블을 담습니다. [제한](../appendix/limits.md)을 참고하십시오. `relid`를 `pg_class`에 조인하면 레이블에서 그 테이블로 갈 수 있습니다. 평범한 PostgreSQL 인트로스펙션이 그래프에서도 통하게 하는 것이 그 조인입니다: ```sql SELECT l.labname, pg_size_pretty(pg_total_relation_size(l.relid)) AS size FROM pg_catalog.ag_label l JOIN pg_catalog.ag_graph g ON g.oid = l.graphid WHERE g.graphname = 'moviekb' AND l.labkind = 'v' ORDER BY 1; ``` {#catalogs-ag_label_property} ## ag_label_property [타입 컬럼으로 승격된](../querying/typed-columns.md) 속성마다 한 행입니다. 이 카탈로그는 2.18에서 새로 생겼습니다. | 컬럼 | 타입 | 설명 | | --- | --- | --- | | `laboid` | `oid` | 승격된 컬럼이 속한 `ag_label` 행입니다. | | `propname` | `name` | 그 컬럼이 담는 속성 키입니다. | | `attnum` | `smallint` | 레이블 테이블에서 그 컬럼의 속성 번호입니다. | | `semantics` | `"char"` | 그 컬럼이 속성과 어떤 관계인지입니다. | 기본 키가 `(laboid, propname)`이므로, 레이블 하나는 같은 키를 많아야 한 번 승격합니다. 속성 읽기가 승격된 컬럼으로 해석되는 것은 여기에 행이 있을 때뿐입니다. 사람들을 놀라게 하는 승격 형태의 뒤에 이 장치가 있습니다. `GENERATED ALWAYS AS (expr) STORED`는 컬럼을 만들지만 이 카탈로그에 행을 등록하지 않습니다. 그래서 그 컬럼은 SQL에서는 읽히고 Cypher의 속성 읽기에는 보이지 않습니다. {#catalogs-ag_graphmeta} ## ag_graphmeta 그래프에 실제로 나타나는 (시작 레이블, 간선 레이블, 끝 레이블) 삼중마다 한 행이며, 그것을 이루는 간선이 몇 개인지가 함께 있습니다. 플래너는 이것을 두 가지로 씁니다. 순회를 추정하는 데, 그리고 패턴에 참여할 수 없는 레이블의 스캔을 쳐내는 데 씁니다. | 컬럼 | 타입 | 설명 | | --- | --- | --- | | `graph` | `oid` | `ag_graph` 행입니다. | | `edge` | `smallint` | 간선 레이블의 `labid`입니다. | | `start` | `smallint` | 시작 정점 레이블의 `labid`입니다. | | `end` | `smallint` | 끝 정점 레이블의 `labid`입니다. | | `edgecount` | `bigint` | 그 모양의 간선이 몇 개인지입니다. | 레이블 id를 이름으로 풀어 주는 [`ag_graphmeta_view`](#views-ag_graphmeta_view)로 읽으십시오. 이 테이블은 `auto_gather_graphmeta`가 켜져 있을 때만 유지되며, `regather_graphmeta()`가 그것을 처음부터 다시 만듭니다. 둘 다 [그래프 메타데이터](graph-metadata.md)가 다룹니다. {#catalogs-ag_vertex-and-ag_edge} ## ag_vertex와 ag_edge 이 둘은 `pg_catalog`에 없습니다. 모든 그래프의 스키마가 자기 것 한 쌍을 담고 있고, 사용자가 만드는 모든 레이블이 그중 하나를 상속합니다. 레이블 없는 패턴에 뜻을 주는 것이 그 상속입니다. [그래프가 어떻게 저장되는가](../concepts/graph-on-postgresql.md)를 참고하십시오. `.ag_vertex`는 정점의 컬럼 쌍 `(id graphid, properties jsonb)`를 가집니다. `.ag_edge`는 거기에 양 끝점을 더해 `(id, start, end, properties)`를 가집니다. {#catalogs-ag_graphpath} ## ag_graphpath [`graphpath`](../reference/types.md) 뒤에 있는 복합 타입입니다. 구현 세부입니다. 이것을 직접 건드리지 말고 패턴 구문과 경로 함수로 경로를 만들고 읽으십시오.