Graph Meta
소개
meta 익스텐션은 그래프 메타데이터를 다루는 작업을 단순화하는 AgensGraph용 도우미 함수 모음을 제공합니다. 그래프 구조 탐색, 레이블 검증, 크기 추정, 관계 분석, Cypher 타입 처리를 위한 유틸리티를 제공합니다.
이러한 함수를 사용하면 AgensGraph에서 그래프를 보다 쉽게 점검, 모니터링, 관리할 수 있어 반복 작업을 줄이고 전반적인 효율성을 향상시킬 수 있습니다.
설치
meta 익스텐션은 AgensGraph의 contrib 디렉터리에 포함되어 있습니다. 이를 설치하려면 먼저 contrib 모듈을 활성화한 상태로 AgensGraph를 빌드하고 설치하십시오.
설치가 완료되면 다음 명령으로 익스텐션을 임의의 데이터베이스에 추가할 수 있습니다.
CREATE EXTENSION meta;
이렇게 하면 모든 meta 함수를 해당 데이터베이스 내에서 사용할 수 있게 됩니다.
함수
meta 익스텐션에는 다음 함수들이 포함되어 있습니다.
meta.graphs
설명
사용 가능한 모든 그래프의 목록을 반환합니다.
인자
없음
반환값
그래프 이름의 집합
예제
SELECT * FROM meta.graphs();
graphname
-----------
social
company
test
meta.labels
설명
지정한 그래프의 모든 레이블을 반환합니다. 시스템 레이블인 ag_vertex와 ag_edge는 결과에 포함되지 않습니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다.
인자
graph(name, 선택): 그래프의 이름입니다. 기본값은 현재graph_path입니다.
반환값
label_name(name): 지정한 그래프 내 모든 레이블의 이름이며, 시스템 레이블인ag_vertex와ag_edge는 제외됩니다.
예제
SELECT * FROM meta.labels('social');
label_name
------------
Person
Product
Transaction
meta.vertex_labels
설명
지정한 그래프에 정의된 모든 정점 레이블을 반환합니다. 시스템 레이블인 ag_vertex는 제외됩니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용하여 그래프를 결정합니다.
인자
graph(name, 선택): 그래프의 이름입니다. 기본값은 현재graph_path입니다.
반환값
label_name(name): 지정한 그래프 내 모든 정점 레이블의 이름입니다.
예제
SELECT * FROM meta.vertex_labels('social');
label_name
------------
Person
Product
Comment
meta.edge_labels
설명 지정한 그래프에 정의된 모든 간선 레이블을 반환합니다. 시스템 레이블인 ag_edge는 제외됩니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용하여 그래프를 결정합니다.
인자
graph(name, 선택): 그래프의 이름입니다. 기본값은 현재graph_path입니다.
반환값
label_name(name): 지정한 그래프 내 모든 간선 레이블의 이름입니다.
예제
SELECT * FROM meta.edge_labels('social');
label_name
------------
Follows
Likes
Purchases
meta.label_id
설명
지정한 그래프 내 특정 레이블의 내부 id를 반환합니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다. 해당 레이블이 그래프에 존재하지 않으면 예외를 발생시킵니다.
인자
label(name, 필수): id를 조회할 레이블의 이름입니다.graph(name, 선택): 그래프의 이름입니다. 기본값은 현재graph_path입니다.
반환값
labid(int): 지정한 레이블의 내부 id입니다.
예제
SELECT meta.label_id('Person', 'social');
labid
-------
5
meta.label_kind
설명
지정한 그래프 내 레이블의 종류(정점은 v, 간선은 e)를 반환합니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다. 해당 레이블이 존재하지 않으면 NULL을 반환합니다.
인자
label(name, 필수): 종류를 조회할 레이블의 이름입니다.graph(name, 선택): 그래프의 이름입니다. 기본값은 현재graph_path입니다.
반환값
kind(char): 레이블 종류를 나타내는 단일 문자(v또는e)입니다.
예제
SELECT meta.label_kind('Person', 'social');
kind
------
v
meta.label_name
설명
특정 그래프에서 레이블의 ID(labid) 또는 OID를 기준으로 레이블의 이름을 반환합니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다. 해당 레이블이 존재하지 않으면 알림(notice)을 발생시킵니다.
인자
labelid(int, 필수): 레이블의 ID 또는 OID입니다.graph(name, 선택): 그래프의 이름입니다. 기본값은 현재graph_path입니다.
반환값
label_name(text): 레이블의 이름입니다.
예제
SELECT meta.label_name(5, 'social');
label_name
------------
Person
meta.graph_size
설명
모든 레이블을 포함한 그래프의 전체 크기를 반환합니다. graph_name 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다. 크기는 사람이 읽기 쉬운 형식 또는 원시 바이트 단위로 반환할 수 있습니다.
인자
graph_name(name, 선택): 그래프의 이름입니다. 기본값은 현재graph_path입니다.pretty(boolean, 선택):true(기본값)이면 사람이 읽기 쉬운 크기(예:42 MB)를 반환합니다.false이면 크기를 바이트 단위 텍스트로 반환합니다.
반환값
size(text): 그래프의 전체 크기입니다.
예제
SELECT meta.graph_size('social');
graph_size
------------
123 MB
SELECT meta.graph_size('social', false);
graph_size
------------
129394816
meta.label_size
설명
인덱스를 포함한 특정 레이블의 전체 크기를 반환합니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다. 크기는 사람이 읽기 쉬운 형식 또는 원시 바이트 단위로 반환할 수 있습니다.
인자
labelname(text): 레이블의 이름입니다.graph(name, 선택): 레이블이 포함된 그래프입니다. 기본값은 현재graph_path입니다.pretty(boolean, 선택):true(기본값)이면 사람이 읽기 쉬운 크기(예:42 MB)를 반환합니다.false이면 크기를 바이트 단위 텍스트로 반환합니다.
반환값
size(text): 인덱스를 포함한 레이블의 전체 크기입니다.
예제
SELECT meta.label_size('person');
label_size
------------
42 MB
SELECT meta.label_size('person', pretty => false);
label_size
------------
44040192
meta.count
설명
지정한 레이블의 노드 또는 간선의 정확한 개수를 반환합니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다.
인자
labelname(text): 요소 개수를 셀 레이블입니다.graph(name, 선택): 레이블이 포함된 그래프입니다. 기본값은 현재graph_path입니다.
반환값
count(bigint): 레이블 내 요소(노드 또는 간선)의 정확한 개수입니다.
예제
-- Count all nodes in the 'person' label
SELECT meta.count('person');
-- Count all edges in the 'friendship' label of the 'social' graph
SELECT meta.count('friendship', 'social');
meta.estimated_count
설명
PostgreSQL 통계(pg_class.reltuples)를 기반으로 지정한 레이블의 추정 요소(노드 또는 간선) 개수를 반환합니다. graph 인자가 제공되지 않으면 함수는 현재 graph_path 설정을 사용합니다. 이 함수는 meta.count보다 빠르지만 부정확할 수 있습니다.
참고: 통계를 사용할 수 없는 경우 함수가 NULL을 반환할 수 있습니다. 통계를 수집하려면
ANALYZE "graph"."label"을 실행하십시오.
인자
labelname(text): 추정 요소 개수를 반환할 레이블입니다.graph(name, 선택): 레이블이 포함된 그래프입니다. 기본값은 현재graph_path입니다.
반환값
estimated_count(bigint): 레이블 내 추정 요소 개수입니다.
예제
-- Get estimated count of nodes in the 'person' label
SELECT meta.estimated_count('person');
-- Get estimated count of edges in the 'friendship' label of the 'social' graph
SELECT meta.estimated_count('friendship', 'social');
meta.graph_exists
설명
지정한 이름의 그래프가 존재하는지 확인합니다.
인자
graph(name): 확인할 그래프의 이름입니다.
반환값
boolean: 그래프가 존재하면true, 그렇지 않으면false입니다.
예제
SELECT meta.graph_exists('social');
?column?
----------
t
meta.label_exists
설명
지정한 그래프에 레이블이 존재하는지 확인합니다. 그래프가 제공되지 않으면 현재 graph_path 설정을 사용합니다.
인자
labelname(text): 확인할 레이블의 이름입니다.graph(name, 선택): 그래프의 이름입니다. 제공되지 않으면 기본값으로graph_path를 사용합니다.
반환값
boolean: 레이블이 존재하면true, 그렇지 않으면false입니다.
예제
SELECT meta.label_exists('Person', 'social');
?column?
----------
t
meta.vertex_label_exists
설명
지정한 그래프에 정점 레이블이 존재하는지 확인합니다. 그래프가 제공되지 않으면 현재 graph_path 설정을 사용합니다.
인자
labelname(text): 확인할 정점 레이블의 이름입니다.graph(name, 선택): 그래프의 이름입니다. 제공되지 않으면 기본값으로graph_path를 사용합니다.
반환값
boolean: 정점 레이블이 존재하면true, 그렇지 않으면false입니다.
예제
SELECT meta.vertex_label_exists('Person', 'social');
?column?
----------
t
meta.edge_label_exists
설명
지정한 그래프에 간선 레이블이 존재하는지 확인합니다. 그래프가 제공되지 않으면 현재 graph_path 설정을 사용합니다.
인자
labelname(text): 확인할 간선 레이블의 이름입니다.graph(name, 선택): 그래프의 이름입니다. 제공되지 않으면 기본값으로graph_path를 사용합니다.
반환값
boolean: 간선 레이블이 존재하면true, 그렇지 않으면false입니다.
예제
SELECT meta.edge_label_exists('Follows', 'social');
?column?
----------
t
meta.get_child_labels
설명
지정한 부모 레이블로부터 상속받는 모든 자식 레이블을 반환합니다. 그래프가 제공되지 않으면 현재 graph_path 설정을 사용합니다.
인자
parent_label(text): 부모 레이블의 이름입니다.graph(name, 선택): 그래프의 이름입니다. 제공되지 않으면 기본값으로graph_path를 사용합니다.
반환값
table(labelname name): 자식 레이블 이름의 집합입니다.
예제
SELECT * FROM meta.get_child_labels('Person', 'social');
labelname
-----------
Employee
Customer
meta.get_parent_labels
설명
지정한 자식 레이블이 상속받는 모든 부모 레이블을 반환합니다. 그래프가 제공되지 않으면 현재 graph_path 설정을 사용합니다.
인자
child_label(text): 자식 레이블의 이름입니다.graph(name, 선택): 그래프의 이름입니다. 제공되지 않으면 기본값으로graph_path를 사용합니다.
반환값
table(labelname name): 부모 레이블 이름의 집합입니다.
예제
SELECT * FROM meta.get_parent_labels('Employee', 'social');
labelname
-----------
Person
meta.cypher_type
설명
지정한 값에 대응하는 Cypher 타입을 판별합니다. 표준 타입, JSON/JSONB, 숫자 구분을 지원합니다.
인자
element(anyelement): Cypher 타입을 판별할 값입니다.
반환값
text: 문자열로 표현된 Cypher 타입입니다. 가능한 값으로는INTEGER,FLOAT,STRING,BOOLEAN,MAP,LIST,NUMBER가 있습니다.
예제
SELECT meta.cypher_type(42) AS result;
result
-------
INTEGER
SELECT meta.cypher_type('{"key": "value"}'::jsonb) AS result;
result
-------
MAP
meta.cypher_types
설명
입력 JSONB 객체의 각 키를 대응하는 Cypher 타입에 매핑한 JSONB 객체를 반환합니다. 입력이 JSON 객체가 아니면 오류를 발생시킵니다.
인자
properties(jsonb): 키가 Cypher 타입에 매핑될 JSONB 객체입니다.
반환값
jsonb: 각 키가 입력 키에 대응하고 값이 감지된 Cypher 타입(INTEGER,FLOAT,STRING,BOOLEAN,MAP,LIST,NULL또는NUMBER)인 JSONB 객체입니다.
예제
SELECT meta.cypher_types('{"key": "value", "arr": [1, 2, 3], "num": 123, "float": 45.67, "bool": true, "null": null}'::jsonb);
cypher_types
---------------------------------------------------------------------------------------------------------
{"arr": "LIST", "key": "STRING", "num": "INTEGER", "bool": "BOOLEAN", "null": "NULL", "float": "FLOAT"}
meta.is_cypher_type
설명
지정한 값이 지정한 Cypher 타입과 일치하는지 확인합니다. NULL, INTEGER, FLOAT, STRING, BOOLEAN, MAP, LIST, NUMBER 타입을 지원합니다.
인자
value(anyelement): 확인할 값입니다.expected_type(text): 기대하는 Cypher 타입입니다.
반환값
boolean: 값이 기대하는 타입과 일치하면true, 그렇지 않으면false입니다.
예제
SELECT meta.is_cypher_type(123, 'INTEGER') AS result;
result
-------
t
SELECT meta.is_cypher_type('Alice', 'STRING') AS result;
result
-------
t
SELECT meta.is_cypher_type('NULL'::jsonb, 'NULL') AS result;
result
-------
t
meta.count_self_loops
설명
지정한 그래프에서 셀프 루프(시작 정점과 끝 정점이 동일한 간선)의 개수를 반환합니다.
관계가 제공되지 않으면 간선 레이블에 관계없이 모든 간선을 대상으로 합니다. 그래프가 제공되지 않으면 graph_path 설정을 사용합니다.
인자
relationship(text, 선택): 확인할 관계/간선 레이블의 이름입니다. 기본값은ag_edge입니다.graph(text, 선택): 그래프 이름입니다. 기본값은graph_path설정입니다.
반환값
bigint: 셀프 루프 간선의 개수입니다.
예제
MATCH (a:person {name: 'Bob'})
CREATE (a)-[:"KNOWS"]->(a);
MATCH (a:animal {name: 'Spot'})
CREATE (a)-[:"HAS_PET"]->(a);
SELECT meta.count_self_loops(graph=>'social');
count_self_loops
------------------
2
(1 row)
SELECT meta.count_self_loops('HAS_PET');
count_self_loops
------------------
1
(1 row)
meta.edge_density
설명
그래프의 간선 밀도를 계산합니다. 간선 밀도는 기존 간선 수를 가능한 최대 간선 수에 대한 비율로 정의됩니다.
그래프가 제공되지 않으면 graph_path 설정을 사용합니다.
인자
graph(name, 선택): 그래프 이름입니다. 기본값은graph_path설정입니다.
반환값
float: 그래프의 간선 밀도입니다.
예제
-- Calculate edge density for the current graph
SELECT meta.edge_density() AS result;
-- Calculate edge density for a specific graph
SELECT meta.edge_density('social_graph') AS result;
meta.estimated_edge_density
설명
정확한 개수 대신 PostgreSQL 통계(pg_class.reltuples)를 사용하여 그래프의 추정 간선 밀도를 제공합니다.
이 방법은 대규모 그래프에서 더 빠르지만 부정확할 수 있습니다. 그래프 이름이 제공되지 않으면 graph_path를 사용합니다.
인자
graph(name, 선택): 그래프 이름입니다. 기본값은graph_path설정입니다.
반환값
float: 그래프의 추정 간선 밀도입니다.
예제
-- Estimate edge density for the current graph
SELECT meta.estimated_edge_density() AS result;
-- Estimate edge density for a specific graph
SELECT meta.estimated_edge_density('social_graph') AS result;