온톨로지와 시맨틱 웹 세미나를 진행할 때마다 반복해서 마주치는 장면이 있습니다. SPARQL 문법을 처음 보여주면, 개발 경험이 있는 분들 대부분이 반가워하십니다. SELECT, WHERE, ORDER BY가 그대로 등장하니 “조인 많은 SQL이네요”라는 반응이 바로 나오죠. 문제는 그 익숙함이 얼마 가지 않아 오해로 돌아온다는 점입니다.

SPARQL이 SQL과 같지 않은 지점

가장 큰 차이는 문법이 아니라 전제입니다.

SQL은 닫힌 세계 가설(closed world assumption)을 깔고 있습니다. 테이블에 명시되지 않은 정보는 거짓으로 간주합니다. 수강생 목록에 ‘홍길동’이 없다면, 시스템은 “홍길동은 수강생이 아니다”라고 단정합니다.

SPARQL과 RDF 세계관은 반대로 열린 세계 가설(open world assumption)을 따릅니다. 데이터에 정보가 없다는 사실이 그 정보가 거짓이라는 뜻은 아닙니다. “홍길동이 수강생이라는 트리플이 없다”는 것은 “홍길동은 수강생이 아니다”가 아니라 “아직 모른다”에 가깝습니다. 어딘가 다른 데이터셋에 그 트리플이 있을 수도 있고, 아직 기록되지 않았을 수도 있으니까요.

테이블이냐 그래프냐 하는 구조의 차이보다, 이 전제의 차이가 쿼리 결과와 추론의 방향을 훨씬 더 본질적으로 결정합니다. 그런데 SQL과 닮은 구문이 눈앞에 있으면, 학습자는 자신도 모르게 RDB의 멘탈 모델을 그대로 SPARQL에 끌어옵니다. OPTIONAL의 동작이나 추론 규칙(entailment regime)이 섞이기 시작하면 “왜 SQL대로 결과가 안 나오지?”라는 질문이 반복되고, 익숙한 문법이 오히려 학습을 가로막는 장벽이 됩니다.

차라리 완전히 다른 문법이라면

이 지점에서 드는 생각은 이렇습니다. 온톨로지를 다루는 언어는 SQL과 아예 다르게 생겼다고 처음부터 못 박아두는 편이 낫지 않을까. RDB와 다른 사고방식이 필요하다는 걸 가르치려면, 문법 자체가 달라야 “이건 SQL이 아니구나”라는 스위치가 켜집니다.

그래서 한 번쯤 강연에서 앞에 놓아보고 싶은 것이 Datalog입니다.

Datalog: 사실과 규칙으로 추론하기

Datalog는 Prolog의 부분집합에서 출발한 선언형 논리 질의 언어입니다. 이름 그대로 데이터와 논리를 엮는 데 특화되어 있습니다.

SPARQL이 저장된 트리플을 조회하는 데 초점을 두는 반면, Datalog는 사실(facts)과 규칙(rules)에서 새로운 사실을 끌어내는 쪽에 무게가 있습니다. 온톨로지의 핵심이 결국 “명시된 지식으로부터 추론을 수행하는 것”이라면, Datalog의 동작 방식은 그 요구와 그대로 맞물립니다.

맛보기: 조상 관계

“조상의 조상은 조상이다” 같은 재귀 관계를 SPARQL로 풀어내려면 SPARQL 1.1의 property path를 써야 하고, 경로 표현에 제약도 적지 않습니다. Datalog에서는 두 줄로 끝납니다.

ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y).
  • 첫 줄: X가 Y의 부모라면, X는 Y의 조상이다.
  • 둘째 줄: X가 Z의 부모이고, Z가 Y의 조상이라면, X도 Y의 조상이다.

문법에 SELECTWHERE도 없습니다. RDB 사고방식을 내려놓아야 읽히는 문법이라, 학습자가 “사실과 규칙으로부터 새 사실을 도출한다”는 다른 축으로 생각을 옮기게 됩니다.

세 언어를 나란히 놓고 보면

  SQL SPARQL Datalog
데이터 모델 관계형 테이블 RDF 그래프 사실 + 규칙
기본 전제 닫힌 세계 열린 세계 논리적 귀결
핵심 연산 관계 대수 그래프 패턴 매칭 재귀적 추론
주된 쓰임 데이터 관리와 조회 웹 데이터 연결과 탐색 지식 표현과 새 사실 도출

현실의 시맨틱 웹 표준이 SPARQL이라는 사실은 바뀌지 않습니다. 다만 입문 단계에서 SPARQL부터 보여주면 SQL과의 문법적 유사성이 너무 강해서, 온톨로지가 원래 품고 있는 “추론 엔진”으로서의 성격이 잘 드러나지 않는 경우가 많습니다. 그 유사성을 먼저 걷어내는 용도로, 또는 이미 SPARQL 문법에 한 번 헤맨 분들에게는 접근 각도를 바꾸는 도구로, Datalog를 앞에 꺼내보는 시도는 해볼 만하다고 생각합니다.


관련 글