튜토리얼
Week 2: RDF & RDFS

Week 2. 시맨틱 웹 표준 (RDF & RDFS)

SPO 트리플 구조, URI 체계, rdflib을 이용한 시맨틱 데이터 핸들링


학습 목표

이 튜토리얼을 완료하면 다음을 할 수 있습니다:

  • RDF 트리플 구조 (Subject-Predicate-Object) 이해
  • URI 체계 설계 및 명명 규칙
  • rdflib으로 시맨틱 데이터 생성 및 조회
  • SPARQL 기본 쿼리 작성

핵심 개념

1. RDF 기본

지식의 원자 단위 (Atomic Unit)

"문장을 데이터로 분해하기"

컴퓨터에게 영화에 대한 모든 것을 가르친다고 상상해보세요. 긴 문단을 줄 수도 있겠지만, 조립식으로 정보를 전달하는 것이 훨씬 효율적입니다.

RDF는 모든 지식을 가장 작고 나눌 수 없는 원자 단위인 **트리플(Triple)**로 쪼개도록 강제합니다.

  • 주어(Subject): 이야기하려는 대상 (예: "인셉션")
  • 서술어(Predicate): 관계 (예: "감독은")
  • 목적어(Object): 값 (예: "크리스토퍼 놀란")

마치 거대한 레고 성을 친구에게 보내기 위해 다시 작은 브릭 하나하나로 분해하는 것과 같습니다. 이 "지식 원자"들은 전 세계 어디서나 통용되는 표준입니다.

트리플 구조

Subject → Predicate → Object
(인셉션) → (감독) → (크리스토퍼 놀란)

RDF 직렬화 형식

# Turtle 형식 (가장 읽기 쉬움)
@prefix ex: <http://example.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
 
ex:Inception a ex:Movie ;
    ex:title "Inception" ;
    ex:releaseYear 2010 ;
    ex:directedBy ex:ChristopherNolan .
 
ex:ChristopherNolan a foaf:Person ;
    foaf:name "Christopher Nolan" .

URI 설계

http://example.org/movies/inception
└── 도메인 ────────┴── 타입 ─┴── ID

모범 사례:

  • 소문자, 하이픈 사용으로 가독성 향상
  • 필요시 버전 포함: /v1/movies/inception
  • 기존 어휘 활용 (FOAF, Schema.org)

2. rdflib 실습

기본 연산

from rdflib import Graph, Namespace, Literal, URIRef
from rdflib.namespace import RDF, RDFS, FOAF, XSD
 
# 그래프 생성
g = Graph()
 
# 네임스페이스 정의
EX = Namespace("http://example.org/")
g.bind("ex", EX)
g.bind("foaf", FOAF)
 
# 트리플 추가
g.add((EX.Inception, RDF.type, EX.Movie))
g.add((EX.Inception, EX.title, Literal("Inception")))
g.add((EX.Inception, EX.releaseYear, Literal(2010, datatype=XSD.integer)))
g.add((EX.Inception, EX.directedBy, EX.ChristopherNolan))
 
g.add((EX.ChristopherNolan, RDF.type, FOAF.Person))
g.add((EX.ChristopherNolan, FOAF.name, Literal("Christopher Nolan")))
 
# 직렬화
print(g.serialize(format="turtle"))

SPARQL 쿼리

# 모든 영화 조회
query = """
SELECT ?movie ?title WHERE {
    ?movie a ex:Movie .
    ?movie ex:title ?title .
}
"""
for row in g.query(query):
    print(f"{row.movie} - {row.title}")
 
# 특정 감독의 영화
query = """
SELECT ?title WHERE {
    ?movie ex:directedBy ex:ChristopherNolan .
    ?movie ex:title ?title .
}
"""

3. RDFS (RDF Schema)

클래스와 속성 정의

from rdflib.namespace import RDFS
 
# 클래스 정의
g.add((EX.Movie, RDF.type, RDFS.Class))
g.add((EX.Person, RDF.type, RDFS.Class))
g.add((EX.Director, RDFS.subClassOf, EX.Person))
 
# 속성 정의
g.add((EX.directedBy, RDF.type, RDF.Property))
g.add((EX.directedBy, RDFS.domain, EX.Movie))
g.add((EX.directedBy, RDFS.range, EX.Person))

추론

# Director가 Person의 하위 클래스이면,
# ChristopherNolan (Director)은 Person이기도 함
 
g.add((EX.ChristopherNolan, RDF.type, EX.Director))
 
# RDFS 추론 후:
# EX.ChristopherNolan rdf:type EX.Person  # 자동 추론!

4. 어휘 재사용

Schema.org

from rdflib import Namespace
 
SCHEMA = Namespace("https://schema.org/")
 
g.add((EX.Inception, RDF.type, SCHEMA.Movie))
g.add((EX.Inception, SCHEMA.name, Literal("Inception")))
g.add((EX.Inception, SCHEMA.datePublished, Literal("2010-07-16")))
g.add((EX.Inception, SCHEMA.director, EX.ChristopherNolan))

FOAF (Friend of a Friend)

g.add((EX.ChristopherNolan, RDF.type, FOAF.Person))
g.add((EX.ChristopherNolan, FOAF.name, Literal("Christopher Nolan")))
g.add((EX.ChristopherNolan, FOAF.knows, EX.HansZimmer))

체크리스트

단계체크 항목
RDF 기본☐ SPO 트리플 구조 이해
☐ URI 체계 설계
rdflib☐ 그래프 생성 및 트리플 추가
☐ SPARQL 쿼리 실행
RDFS☐ 클래스/속성 정의
☐ 추론 개념 이해

면접 질문 맛보기

Q: RDF가 관계형 데이터베이스보다 좋은 점은?

  • 유연성: 스키마 변경 없이 새 속성 추가 가능
  • 상호운용성: URI를 통한 데이터 통합
  • 추론: 논리적 추론을 통한 자동 지식 도출
  • 분산성: 웹 전체에서 쉽게 연결

더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.


🎬 프로젝트: 영화 추천 지식그래프

진행 현황

Week주제프로젝트 마일스톤
1온톨로지 입문✅ 영화 도메인 설계 완료
2RDF & RDFS영화 데이터를 트리플로 표현
3OWL & 추론추론 규칙으로 숨은 관계 발견
4지식 추출위키피디아에서 영화 정보 수집
5Neo4j그래프 DB에 저장 및 쿼리
6GraphRAG자연어 질의
7온톨로지 에이전트새 영화 자동 업데이트
8도메인 확장의료/법률/금융 케이스
9서비스 배포API + 대시보드

Week 2 마일스톤: RDF로 영화 데이터 표현

Week 1에서 설계한 온톨로지를 RDF 트리플로 변환합니다.

변환할 데이터:

@prefix movie: <http://example.org/movie/> .
@prefix schema: <http://schema.org/> .
 
movie:Inception a schema:Movie ;
    schema:name "Inception" ;
    schema:datePublished "2010-07-16" ;
    schema:director movie:ChristopherNolan ;
    schema:actor movie:LeonardoDiCaprio ;
    schema:genre movie:SciFi .
 
movie:ChristopherNolan a schema:Person ;
    schema:name "Christopher Nolan" ;
    schema:birthDate "1970-07-30" .

SPARQL 쿼리 예시:

# 크리스토퍼 놀란이 감독한 영화
SELECT ?movie ?title WHERE {
    ?movie schema:director movie:ChristopherNolan ;
           schema:name ?title .
}

프로젝트 노트북에서 영화 데이터를 웹 표준 형식으로 변환합니다.

프로젝트 노트북에서는 다음을 직접 구현합니다:

  • 인셉션, 다크나이트 등 10편 영화를 Turtle 형식으로 변환
  • Schema.org 어휘로 감독/배우 관계 표현
  • "놀란 감독 영화 목록" SPARQL 쿼리 작성
  • JSON-LD로 내보내기 (웹 호환)

9주 후 완성되는 것: "놀란 감독 스타일의 SF 영화 추천해줘"라고 물으면, 지식그래프에서 감독-장르-평점 관계를 추론하고 자연어로 답변하는 AI 에이전트


실습 노트북

이론을 더 깊이 탐구하고 싶다면:

실습 노트북에서는 추가로 다음 내용을 다룹니다:

  • Turtle, N-Triples, JSON-LD 형식 비교
  • SPARQL 고급 쿼리 (FILTER, OPTIONAL, UNION)
  • FOAF로 인물 네트워크 모델링
  • 외부 온톨로지(DBpedia) 연결

다음: Week 3: OWL & 추론