Week 3. OWL & 추론
클래스 계층, 속성 제약, 논리적 추론, Protégé 실습
학습 목표
이 튜토리얼을 완료하면 다음을 할 수 있습니다:
- **OWL(Web Ontology Language)**로 풍부한 시맨틱 표현
- 클래스 계층과 속성 제약조건 정의
- owlready2로 OWL 온톨로지 구현
- Protégé를 이용한 추론 수행
핵심 개념
1. OWL 기본
RDFS가 부족한 이유: "사전" vs "논리학 책"
Week 2에서 배운 RDFS는 사전과 같습니다. "영화"는 "창작물"의 일종이라는 것을 알려주죠.
하지만 사전은 논리를 강제할 수 없습니다. 다음과 같은 규칙을 말할 수 없죠:
- "영화는 반드시 최소 1명의 감독이 있어야 한다." (필수 조건)
- "사람은 동시에 영화일 수 없다." (서로소 조건)
OWL (Web Ontology Language) 은 논리학 책입니다. 어휘에 세상의 규칙을 더해줍니다. 이를 통해 기계는 명시적으로 적혀있지 않은 새로운 사실을 추론할 수 있게 됩니다.
OWL vs RDFS
| 기능 | RDFS | OWL |
|---|---|---|
| 클래스 계층 | ✓ | ✓ |
| 속성 도메인/레인지 | ✓ | ✓ |
| 카디널리티 제약 | ✗ | ✓ |
| 서로소 클래스 | ✗ | ✓ |
| 동치 관계 | ✗ | ✓ |
| 복합 표현 | ✗ | ✓ |
OWL 문법 예시
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix ex: <http://example.org/> .
# 클래스 정의
ex:Movie a owl:Class .
ex:Director a owl:Class ;
rdfs:subClassOf ex:Person .
# 서로소 클래스
ex:Movie owl:disjointWith ex:Person .
# 속성 제약
ex:directedBy a owl:ObjectProperty ;
rdfs:domain ex:Movie ;
rdfs:range ex:Director .2. 속성 제약조건
카디널리티
from owlready2 import *
onto = get_ontology("http://example.org/movie.owl")
with onto:
class Movie(Thing): pass
class Director(Thing): pass
class directed_by(ObjectProperty):
domain = [Movie]
range = [Director]
# 모든 영화는 최소 1명의 감독이 있어야 함
class Movie(Thing):
is_a = [directed_by.min(1, Director)]
# 모든 영화는 최대 5명의 감독을 가질 수 있음
class Movie(Thing):
is_a = [directed_by.max(5, Director)]속성 특성
with onto:
# 대칭: A knows B → B knows A
class knows(ObjectProperty, SymmetricProperty):
pass
# 전이: A ancestor B, B ancestor C → A ancestor C
class ancestor_of(ObjectProperty, TransitiveProperty):
pass
# 역관계: directed 는 directedBy의 역
class directs(ObjectProperty):
inverse_property = directed_by3. 추론 (Reasoning)
추론 유형
# 포함 관계: Director는 Person의 하위 클래스
# → Nolan (Director)은 Person이기도 함
# 속성 추론: directed_by의 역관계는 directs
# → (Movie1 directed_by Nolan) → (Nolan directs Movie1)
# 카디널리티 검증
# → 감독이 없으면 제약 위반 탐지Reasoner 사용
from owlready2 import *
onto = get_ontology("movie.owl").load()
# 추론 수행
with onto:
sync_reasoner_pellet(infer_property_values=True)
# 추론 결과 확인
for movie in onto.Movie.instances():
print(f"{movie.name}: {movie.directed_by}")4. Protégé 실습
온톨로지 생성
- 클래스 생성:
Classes:
├── Person
│ ├── Director
│ └── Actor
├── Movie
└── Genre- Object Properties 생성:
directed_by: Movie → Director
acted_in: Actor → Movie
has_genre: Movie → Genre- Data Properties 생성:
title: Movie → string
release_year: Movie → integer
name: Person → string- 제약조건 추가:
Movie:
- directed_by min 1 Director
- has_genre some Genre- Reasoner 실행: Reasoner → Start reasoner → HermiT 또는 Pellet
5. SHACL 검증
from pyshacl import validate
shacl_shapes = """
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix ex: <http://example.org/> .
ex:MovieShape a sh:NodeShape ;
sh:targetClass ex:Movie ;
sh:property [
sh:path ex:title ;
sh:minCount 1 ;
sh:datatype xsd:string ;
] ;
sh:property [
sh:path ex:directed_by ;
sh:minCount 1 ;
sh:class ex:Director ;
] .
"""
conforms, results_graph, results_text = validate(
data_graph,
shacl_graph=shacl_shapes,
inference='rdfs'
)
print(f"검증 결과: {conforms}")면접 질문 맛보기
Q: RDFS 대신 OWL을 선택하는 경우는?
- 복잡한 제약: 카디널리티, 서로소 등이 필요할 때
- 자동 추론: 추론이 필요할 때
- 데이터 검증: 온톨로지 규칙에 대한 데이터 검사
- 시맨틱 일관성: 논리적 일관성 보장이 필요할 때
더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.
🎬 프로젝트: 영화 추천 지식그래프
진행 현황
| Week | 주제 | 프로젝트 마일스톤 |
|---|---|---|
| 1 | 온톨로지 입문 | ✅ 영화 도메인 설계 완료 |
| 2 | RDF & RDFS | ✅ 영화 10편 RDF 변환 완료 |
| 3 | OWL & 추론 | 추론 규칙으로 숨은 관계 발견 |
| 4 | 지식 추출 | 위키피디아에서 영화 정보 수집 |
| 5 | Neo4j | 그래프 DB에 저장 및 쿼리 |
| 6 | GraphRAG | 자연어 질의 |
| 7 | 온톨로지 에이전트 | 새 영화 자동 업데이트 |
| 8 | 도메인 확장 | 의료/법률/금융 케이스 |
| 9 | 서비스 배포 | API + 대시보드 |
Week 3 마일스톤: OWL 추론 규칙 추가
RDF 데이터에 OWL 추론 규칙을 적용해 숨은 관계를 자동으로 발견합니다.
추가할 추론 규칙:
# 1. 베테랑 감독: 3편 이상 감독한 사람
class VeteranDirector(Director):
equivalent_to = [Director & directed.min(3, Movie)]
# 2. 블록버스터: 평점 8.0 이상 + 러닝타임 120분 이상
class Blockbuster(Movie):
equivalent_to = [Movie & rating.value(lambda x: x >= 8.0)
& runtime.value(lambda x: x >= 120)]
# 3. 콜라보레이터: 같은 감독과 2편 이상 작업한 배우
class FrequentCollaborator(Actor):
# 동일 감독 영화에 2회 이상 출연추론 결과 예시:
| 입력 데이터 | 추론 결과 |
|---|---|
| 놀란 감독 영화 5편 | → VeteranDirector |
| 인셉션 (평점 8.8, 148분) | → Blockbuster |
| 디카프리오 + 놀란 2편 | → FrequentCollaborator |
프로젝트 노트북에서 추론으로 숨겨진 관계를 자동 발견합니다.
프로젝트 노트북에서는 다음을 직접 구현합니다:
- VeteranDirector 클래스: 3편 이상 감독한 사람 자동 분류
- Blockbuster 클래스: 평점 8.0+ & 러닝타임 120분+ 영화 추론
- FrequentCollaborator: 같은 감독과 2편 이상 작업한 배우 발견
- Pellet Reasoner로 "놀란 = VeteranDirector" 자동 추론
9주 후 완성되는 것: "놀란 감독 스타일의 SF 영화 추천해줘"라고 물으면, 지식그래프에서 감독-장르-평점 관계를 추론하고 자연어로 답변하는 AI 에이전트
실습 노트북
이론을 더 깊이 탐구하고 싶다면:
실습 노트북에서는 추가로 다음 내용을 다룹니다:
- Intersection, Union, Complement 클래스 표현
- Pellet vs HermiT Reasoner 성능 비교
- SHACL로 데이터 품질 검증
- Protégé GUI에서 추론 시각화
다음: Week 4: 지식 추출