그래프 쿼리

그래프 쿼리 (Graph Queries)

DuckDB는 SQL:2023 표준의 SQL/PGQ 문법을 구현한 DuckPGQ 커뮤니티 확장을 통해 그래프 쿼리를 지원합니다. 그래프 쿼리를 쓰면 소셜 네트워크, 금융 거래, 지식 그래프 같은 연결된 데이터에서 직관적인 시각적 문법으로 패턴과 경로를 찾을 수 있어요.

⚠️ DuckPGQ는 커뮤니티 확장이며 아직 활발히 개발 중입니다. 최신 DuckDB 릴리스(1.5.x)에서는 사용할 수 없어요. DuckPGQ를 쓰려면 DuckDB v1.4.4를 사용하세요. 또 일부 기능이 완전하지 않을 수 있으니 최신 상태는 DuckPGQ 웹사이트를 확인해 주세요.

출처: 공식문서

DuckPGQ 설치하기

INSTALL duckpgq FROM community;
LOAD duckpgq;

속성 그래프 만들기 (Creating a Property Graph)

속성 그래프는 정점(vertex, 노드)과 간선(edge, 관계)으로 이루어집니다. 기존 테이블 위에 레이어로 만들어요:

CREATE TABLE Person (id BIGINT, name VARCHAR);
CREATE TABLE Knows (person1_id BIGINT, person2_id BIGINT, since DATE);

INSERT INTO Person VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
INSERT INTO Knows VALUES (1, 2, '2020-01-01'), (2, 3, '2021-06-15');

CREATE PROPERTY GRAPH social_network
VERTEX TABLES (
    Person
)
EDGE TABLES (
    Knows
        SOURCE KEY (person1_id) REFERENCES Person (id)
        DESTINATION KEY (person2_id) REFERENCES Person (id)
);

패턴 매칭 (Pattern Matching)

GRAPH_TABLE 함수와 MATCH로 패턴을 찾습니다. 문법은 노드에 (), 간선에 []를 사용해요:

FROM GRAPH_TABLE (social_network
    MATCH (a:Person)-[k:Knows]->(b:Person)
    COLUMNS (a.name AS person1, b.name AS person2, k.since)
);
person1 person2 since
Alice Bob 2020-01-01
Bob Charlie 2021-06-15

경로 찾기 (Path Finding)

{1,5}(1~5홉)나 +(하나 이상) 같은 수량자(quantifier)로 가변 길이 경로를 찾습니다:

FROM GRAPH_TABLE (social_network
    MATCH p = ANY SHORTEST (a:Person)-[k:Knows]->{1,3}(b:Person)
    WHERE a.name = 'Alice' AND b.name = 'Charlie'
    COLUMNS (a.name AS start_person, b.name AS end_person, path_length(p) AS hops)
);
start_person end_person hops
Alice Charlie 2

그래프 알고리즘 (Graph Algorithms)

⚠️ 그래프 알고리즘 함수는 현재 알려진 문제로 실패할 수 있으며 csr_cte does not exist 오류를 반환합니다.

DuckPGQ에는 내장 그래프 알고리즘이 포함되어 있습니다:

함수 설명
pagerank(graph, vertex_label, edge_label) PageRank 중심성(centrality) 점수 계산
local_clustering_coefficient(graph, vertex_label, edge_label) 노드의 이웃들이 얼마나 연결돼 있는지 측정
weakly_connected_component(graph, vertex_label, edge_label) 연결 컴포넌트(connected components) 식별

예시:

FROM pagerank(social_network, Person, Knows);

사용 사례: 금융 사기 탐지 (Use Case: Financial Fraud Detection)

그래프 쿼리는 금융 데이터에서 의심스러운 패턴을 찾는 데 뛰어납니다. 자금 세탁 패턴을 감지하는 자세한 예시는 "Uncovering Financial Crime with DuckDB and Graph Queries" 블로그 포스트를 참고하세요.

정리 (Cleanup)

속성 그래프를 제거하려면:

DROP PROPERTY GRAPH social_network;

더 알아보기 (Learn more)