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 | 온톨로지 입문 | ✅ 영화 도메인 설계 완료 |
| 2 | RDF & RDFS | 영화 데이터를 트리플로 표현 |
| 3 | OWL & 추론 | 추론 규칙으로 숨은 관계 발견 |
| 4 | 지식 추출 | 위키피디아에서 영화 정보 수집 |
| 5 | Neo4j | 그래프 DB에 저장 및 쿼리 |
| 6 | GraphRAG | 자연어 질의 |
| 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 & 추론