그래프 카탈로그#

AgensGraph는 pg_catalog에 테이블 일곱 개를 더합니다. 그중 넷이 그래프 구조를 설명하며, 조회하게 될 것은 그 넷입니다. 셋은 모든 레이블이 상속하는 공용 부모 릴레이션입니다. PostgreSQL 자신의 카탈로그는 바뀌지 않았고 그 카탈로그 장에 문서화돼 있습니다.

카탈로그

담는 것

ag_graph

그래프마다 한 행입니다.

ag_label

레이블마다 한 행이며 정점과 간선을 가리지 않습니다.

ag_label_property

타입 컬럼으로 승격된 속성마다 한 행입니다.

ag_graphmeta

(시작 레이블, 간선 레이블, 끝 레이블) 삼중마다의 간선 수입니다.

ag_vertex, ag_edge

그래프 안 모든 정점·간선 레이블의 부모 릴레이션입니다. 각 그래프의 스키마 안에 한 쌍씩 있으며 pg_catalog에 있지 않습니다.

ag_graphpath

graphpath 타입을 떠받치는 복합 타입입니다.

같은 정보를 읽기 좋은 형태로 보여 주는 뷰가 둘 있습니다. 그래프 뷰를 참고하십시오.

ag_graph#

그래프마다 한 행입니다. 그래프는 스키마이므로 nspid가 그 레이블들을 담은 스키마를 가리킵니다.

컬럼

타입

설명

oid

oid

행 식별자입니다.

graphname

name

그래프의 이름이며 데이터베이스 안에서 고유합니다.

nspid

oid

그래프 스키마에 해당하는 pg_namespace 행입니다.

graphmeta_valid

boolean

이 그래프에 대해 ag_graphmeta가 최신인지 여부입니다. 거짓이면 플래너가 그것을 스캔 쳐내기에 쓸 수 없습니다.

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(); 가 그것을 다시 만들고 플래그를 세웁니다. 그래프 메타데이터를 참고하십시오.

ag_label#

레이블마다 한 행입니다. 정점 레이블과 간선 레이블이 함께 있으며 labkind로 구분합니다.

컬럼

타입

설명

oid

oid

행 식별자입니다.

labname

name

레이블의 이름이며 그래프 안에서 고유합니다.

graphid

oid

이 레이블이 속한 ag_graph 행입니다.

labid

integer

그래프 안에서의 레이블 id이며, 그 안 모든 graphid의 상위 16비트입니다.

relid

oid

레이블 테이블에 해당하는 pg_class 행입니다.

labkind

"char"

정점 레이블이면 v, 간선 레이블이면 e입니다.

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개의 레이블을 담습니다. 제한을 참고하십시오.

relid를 pg_class에 조인하면 레이블에서 그 테이블로 갈 수 있습니다. 평범한 PostgreSQL 인트로스펙션이 그래프에서도 통하게 하는 것이 그 조인입니다:

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;

ag_label_property#

타입 컬럼으로 승격된 속성마다 한 행입니다. 이 카탈로그는 2.18에서 새로 생겼습니다.

컬럼

타입

설명

laboid

oid

승격된 컬럼이 속한 ag_label 행입니다.

propname

name

그 컬럼이 담는 속성 키입니다.

attnum

smallint

레이블 테이블에서 그 컬럼의 속성 번호입니다.

semantics

"char"

그 컬럼이 속성과 어떤 관계인지입니다.

기본 키가 (laboid, propname)이므로, 레이블 하나는 같은 키를 많아야 한 번 승격합니다.

속성 읽기가 승격된 컬럼으로 해석되는 것은 여기에 행이 있을 때뿐입니다. 사람들을 놀라게 하는 승격 형태의 뒤에 이 장치가 있습니다. GENERATED ALWAYS AS (expr) STORED는 컬럼을 만들지만 이 카탈로그에 행을 등록하지 않습니다. 그래서 그 컬럼은 SQL에서는 읽히고 Cypher의 속성 읽기에는 보이지 않습니다.

ag_graphmeta#

그래프에 실제로 나타나는 (시작 레이블, 간선 레이블, 끝 레이블) 삼중마다 한 행이며, 그것을 이루는 간선이 몇 개인지가 함께 있습니다. 플래너는 이것을 두 가지로 씁니다. 순회를 추정하는 데, 그리고 패턴에 참여할 수 없는 레이블의 스캔을 쳐내는 데 씁니다.

컬럼

타입

설명

graph

oid

ag_graph 행입니다.

edge

smallint

간선 레이블의 labid입니다.

start

smallint

시작 정점 레이블의 labid입니다.

end

smallint

끝 정점 레이블의 labid입니다.

edgecount

bigint

그 모양의 간선이 몇 개인지입니다.

레이블 id를 이름으로 풀어 주는 ag_graphmeta_view로 읽으십시오. 이 테이블은 auto_gather_graphmeta가 켜져 있을 때만 유지되며, regather_graphmeta()가 그것을 처음부터 다시 만듭니다. 둘 다 그래프 메타데이터가 다룹니다.

ag_vertex와 ag_edge#

이 둘은 pg_catalog에 없습니다. 모든 그래프의 스키마가 자기 것 한 쌍을 담고 있고, 사용자가 만드는 모든 레이블이 그중 하나를 상속합니다. 레이블 없는 패턴에 뜻을 주는 것이 그 상속입니다. 그래프가 어떻게 저장되는가를 참고하십시오.

<graph>.ag_vertex는 정점의 컬럼 쌍 (id graphid, properties jsonb)를 가집니다. <graph>.ag_edge는 거기에 양 끝점을 더해 (id, start, end, properties)를 가집니다.

ag_graphpath#

graphpath 뒤에 있는 복합 타입입니다. 구현 세부입니다. 이것을 직접 건드리지 말고 패턴 구문과 경로 함수로 경로를 만들고 읽으십시오.