그래프 메타데이터#
소개#
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이면 바이트 수를 text로 반환합니다.
반환
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이면 바이트 수를 text로 반환합니다.
반환
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;