튜토리얼
Week 3: OWL & 추론

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

기능RDFSOWL
클래스 계층
속성 도메인/레인지
카디널리티 제약
서로소 클래스
동치 관계
복합 표현

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_by

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