최근 지식그래프를 다루면서 어떤 데이터베이스에 담는 것이 효율적일지 알아보게 되었다.
탐색 중 지인 분을 통해 한 서베이 논문에서 지식그래프 스토리지에 대해 상세하게 분석해 놓은 것을 알게 되었다.
따라서 이번 글에서는 논문 A Survey of RDF Stores & SPARQL Engines for Querying Knowledge Graphs (2021) 을 기반으로
각 RDF와 SPARQL 개념과 기술은 어떤 것인지, 그리고 이를 기반으로 한 데이터베이스에는 어떤 종류가 있는지 살펴보고자 한다.
RDF란?
Resource Description Framework (RDF) 는 웹 상의 데이터를 시맨틱하게 표현하기 위한 W3C 표준이다.
(정의 자체가 좀 어렵게 느껴질 수도 있지만..) 데이터를 구조적으로 표현하고, 데이터 간의 관계를 명확히 정의하며 연결된 정보를 나타낼 때 사용하는 형식으로, 지식 그래프의 "트리플" 데이터 모델을 기반으로 한다.
주로 데이터의 통합, 상호 연결, 그리고 의미 추론을 위한 기반 기술로 사용된다.
기본 구조는 주어-서술어-목적어(Subject-Predicate-Object) 형태이며, 이를 RDF 트리플이라고 한다.
- 주어(Subject): 설명하려는 대상 (ex: "어린왕자")
- 서술어(Predicate): 대상의 속성 또는 관계 (ex: "저자")
- 목적어(Object): 속성값 또는 관계의 대상 (ex: "생텍쥐페리")
이러한 RDF는 아래와 같은 특징을 가지고 있다.
- 링크 데이터: URI를 사용하여 데이터를 연결한다. 각 데이터를 링크처럼 표시를 해서 네트워크 상에서 참조 가능하게 만들어준다.
(ex: 어린왕자 -> http://kg/db/어린왕자) - 확장성: 새로운 데이터를 추가하거나 데이터 모델을 확장하더라도 기존 데이터 구조에 영향을 주지 않는다.
- 표준화된 형식: 여러 표현 방식(XML, Turtle, N-Triples 등)을 지원하며, 표준화를 통해 데이터 교환 및 처리의 일관성을 보장한다.
SPARQL 프로토콜에 따른 RDF store 기준
이러한 RDF 데이터를 저장하고 질의하기 위해서는 SPARQL이라는 표준 질의 언어가 사용된다.
SPARQL은 RDF 데이터를 효율적으로 다루기 위해 다양한 기술을 필요로 하며,
크게이 과정은 스토리지(Storage), 인덱싱(Indexing), 조인 처리(Join Processing) 그리고 쿼리 처리(Query Processing)로 나눠 살펴볼 수 있다.
1. Storage (저장 기술)
우선 RDF 데이터를 어디에, 어떻게 저장하느냐는 성능, 확장성, 유지 관리에 큰 영향을 미친다. 대표적으로 두 가지 접근 방식이 있다.
- 네이티브 RDF 스토어
RDF 데이터를 네이티브 포맷으로 저장하는 방식으로, RDF 트리플의 구조(SPO)를 직접 다루기 때문에 성능이 좋다.
(ex: Blazegraph, Virtuoso) - 비네이티브 스토어
기존 데이터베이스(예: 관계형 DB, 키-값 저장소)를 확장해서 RDF를 지원하는 방식으로, 기존 시스템과 호환이 가능하다는 장점이 있다.
(ex: PostgreSQL, Cassandra)
또한 위 2가지 기법을 조합해 성능과 유연성을 모두 챙기는 하이브리드 방식도 있다.
2. Indexing (인덱싱)
RDF 트리플이 많아지면 특정 데이터를 빠르게 찾는 게 중요해지는데, 이 때 인덱싱을 어떻게 하는지 그 방식도 여러가지가 존재한다.
- SPO 인덱스
RDF 트리플의 각 요소(주어, 서술어, 목적어)를 빠르게 검색할 수 있도록 만드는 기본적인 인덱스이다. - 멀티 인덱스
다양한 쿼리 패턴(예: P(Predicate)-O(Object) 인덱스, S(Subject)-O(Object) 인덱스)을 지원하기 위해 여러 종류의 인덱스를 사용하는 방식이다. - 압축 인덱스
데이터를 압축해서 저장 공간을 아끼고 메모리 및 캐시 효율성을 높이는 기술로, 대규모 RDF 데이터에서 필수적인 인덱스이다.
3. Join Processing (조인 처리)
SPARQL 쿼리는 보통 여러 조건을 조합해서 데이터를 찾는데
이 과정에서 join이 많이 발생하며, 이를 얼마나 잘 처리하느냐가 쿼리 성능을 좌우한다.
- Nested Loop Join
간단하게 두 집합을 반복적으로 비교하는 방식으로, 작은 데이터셋에 유리하다. (대규모 데이터셋에서는 성능이 떨어진다.) - Hash Join
한쪽 데이터를 해시 테이블로 만들어 빠르게 매칭하는 방식으로, 큰 데이터셋에서도 효율적이다. - Merge Join
정렬된 데이터를 병합하면서 조인을 수행하는 방식으로, 정렬 비용이 추가되지만 큰 데이터셋에선 효율적이다.
4. Query Processing (쿼리 처리)
쿼리를 실행하려면 몇 가지 단계를 거치는데, 이 중에서도 중요한 쿼리 최적화 방식은 아래와 같다.
- 쿼리 플래너
SPARQL 쿼리를 분석하며 어떤 순서로 조인을 수행할지 등을 결정하는 최적의 실행 계획을 세우는 역할을 한다. - 분산 처리
대규모 RDF 데이터셋은 한 대의 서버로 처리하기 어려워서 분산 프레임워크(예: Apache Spark, Hadoop)를 활용해서 데이터를 여러 서버에서 병렬 처리한다. - SPARQL 1.1 지원
SPARQL 1.1은 집계 함수(SUM, AVG), 서브쿼리, Property Path 등 고급 기능을 제공하며, 이런 기능을 효율적으로 처리하는 것도 중요하다.
지식그래프 Storage 종류
위에서 언급한 지식그래프의 표현 형식인 RDF 데이터를 효율적으로 저장하고 관리하기 위해서는 다양한 기술과 아키텍처가 사용되는데,
여기에서는 RDF 스토리지 종류별로 어떤 방식으로 작동하는지와 각각의 장단점과 활용 방안을 살펴보고자 한다.
우선 스토리지를 고를 때 아래와 같은 기준에 따라 선정하는 것이 좋다.
- 데이터 크기
대규모 데이터셋을 처리하려면 분산 저장소와 효율적인 인덱싱이 필수 - 질의 패턴
SPARQL 쿼리의 유형(속성 기반, 관계 중심)에 따라 적합한 저장 방식을 선택 - 성능 요구사항
실시간 응답 속도 중요 여부에 따라 결정
(아래에서 언급하겠지만, 응답 속도가 중요하다면 그래프 기반 스토리지나 Vertical Partitioning이 유리하다.) - 확장성
데이터가 지속적으로 증가할 경우, 하이브리드 방식이나 분산 처리 아키텍처 고려
그럼 위 기준에 따라 선택할 수 있는 RDF 스토리지 종류에 대해 알아보자.
Triple Table
가장 기본적인 저장 방식으로, RDF의 구조(S-P-O)를 그대로 데이터베이스 테이블에 저장한다.
하나의 테이블에 Subject, Predicate, Object 세 개의 컬럼으로 구성되며, 단순하고 직관적이라 SPARQL 쿼리와의 매핑이 쉽다.
다만 RDF 데이터가 많아질수록 테이블 크기가 기하급수적으로 커지며, 조인 연산이 증가해 성능 저하를 초래한다.
따라서 소규모 데이터셋에서 빠르게 RDF를 다루고자 할 때 적합하다.
Property Table
Predicate를 중심으로 데이터를 저장하는 방식으로,
비슷한 속성(Predicate)을 가진 주어(Subject)를 하나의 테이블로 묶어 저장한다. (ex: "저자" 속성만 따로 테이블로 구성)
이렇게 저장하면 join 연산 횟수를 줄이고, 특정 속성 기반의 쿼리 성능을 높일 수 있다.
하지만 속성이 다양하거나 동적으로 변화하는 데이터에서는 테이블 설계 및 관리가 어려워진다는 단점이 있다.
Vertical Partitioning
Predicate마다 별도의 테이블을 생성하는 방식으로, 각 테이블은 "Subject-Object"의 두 컬럼으로 구성된다.
각 Predicate의 데이터가 독립적으로 관리되어, 속성 기반 검색 성능이 높아진다.
그렇지만 테이블 개수가 많아지고, 여러 Predicate를 조합한 쿼리는 join 연산이 필요해지기 때문에 속성별 쿼리 빈도가 높은 시스템에서 효율적이다.
Graph-based Storage
지식그래프가 서로 연결되어 있는 만큼, 그래프 데이터베이스를 활용하여 RDF 데이터를 저장하는 방식으로,
RDF 데이터를 노드와 엣지로 표현하여 그래프 구조로 저장한다.
그래프 탐색이나 관계 중심 쿼리에 최적화되어 있으며, RDF의 연결성과 자연스럽게 매칭된다.
하지만 전통적인 관계형 데이터베이스보다 학습 곡선이 높고, 특정 쿼리에서 성능이 떨어질 수 있다.
대표적으로는 Neo4j, Ontotext GraphDB와 같은 그래프 DBMS가 있다.
'COMPUTER SCIENCE > DATABASE' 카테고리의 다른 글
[SQL] 4. SQL (0) | 2019.04.25 |
---|---|
[SQL] 1. 데이터베이스 시스템 (0) | 2019.04.24 |
[SQL] 3. 관계 대수 (0) | 2019.03.30 |
[SQL] 2. 관계 데이터 모델과 제약조건 (0) | 2019.03.30 |