학 습 목 표
- Owlready2로 네임스페이스·ID 체계에 맞는 OWL 파일을 생성한다.
- 계층·분리 공리·존재 제약·정의된 클래스를 코드로 입력한다.
- 스크립트 기반 구축의 장점(재실행 가능성)을 설명한다.
왜 Protégé가 아니라 스크립트인가
온톨로지 편집기 Protégé(1-5)는 훌륭한 도구이고, 처음 익힐 때는 시각적 편집이 수월하다. 그럼에도 실습 프로젝트는 파이썬 라이브러리 Owlready2로 전 과정을 스크립트화한다. 이유는 셋이다. 첫째, 재실행 가능성 — 스크립트는 구축 과정 자체의 기록이어서, 설계가 바뀌면 코드를 고치고 다시 실행하면 된다(해석학적 순환 3-6을 도구가 받쳐 준다). 둘째, 검증과의 결속 — 5-7의 추론·질의 테스트가 같은 언어 안에서 이어진다. 셋째, 3부와의 연결 — 에이전트와 RAG 실습(트랙 6)이 파이썬에서 이 파일을 그대로 연다. 완성 스크립트와 파일은 차시 끝에서 내려받을 수 있다.
네임스페이스, ID, 그리고 첫 다섯 클래스
2-4에서 확정한 명명 체계를 그대로 쓴다. 네임스페이스는 https://example.org/psymap/, 식별자는 PSY_ 뒤에 일곱 자리 숫자다. ID 대역을 범주별로 나누어 두면 파일을 사람이 훑을 때도 질서가 보인다.
| ID 대역 | 용도 | 예 |
|---|---|---|
| 0000001~0000005 | 최상위 분할 | PSY_0000002 심리적 성향 |
| 0000010~0000029 | 성향(기억 능력 가지) | PSY_0000018 작업기억 |
| 0000030~0000039 | 과정(기억 과정 가지) | PSY_0000031 부호화 |
| 0000040~0000049 | 뇌 구조 | PSY_0000040 해마 |
| 0000050~0000059 | 측정 과제 | PSY_0000051 숫자폭 과제 |
| 0000060~0000069 | 정보 개체 | PSY_0000060 기억 흔적 |
표 1ID 대역 할당. 의미 없는 식별자(2-4)를 쓰되 대역으로 질서를 준다 — 이름이 바뀌어도 ID는 불변이고, ID가 불변이어야 정렬(5-8)과 외부 참조가 깨지지 않는다.
Owlready2에서 온톨로지는 get_ontology로 열고, with onto: 블록 안에서 선언한 파이썬 클래스가 곧 OWL 클래스가 된다. 파이썬의 상속 문법이 subClassOf 공리가 된다는 점이 이 라이브러리의 묘미다.
from owlready2 import *
onto = get_ontology("https://example.org/psymap/")
with onto:
# 최상위 분할 — 5-3 결정: '기억' 단일 클래스 금지
class PSY_0000001(Thing): pass # 심리적 과정
class PSY_0000002(Thing): pass # 심리적 성향
class PSY_0000003(Thing): pass # 뇌 구조
class PSY_0000004(Thing): pass # 측정 과제
class PSY_0000005(Thing): pass # 정보 개체
AllDisjoint([PSY_0000001, PSY_0000002, PSY_0000003,
PSY_0000004, PSY_0000005])
# 성향 가지 — 파이썬 상속이 곧 subClassOf
class PSY_0000010(PSY_0000002): pass # 기억 능력
class PSY_0000011(PSY_0000010): pass # 단기기억
class PSY_0000012(PSY_0000010): pass # 장기기억
class PSY_0000013(PSY_0000012): pass # 서술기억
class PSY_0000018(PSY_0000010): pass # 작업기억
build_psymap.py 발췌 1 — 최상위 분할과 분리 공리, 성향 가지의 시작. AllDisjoint 한 줄이 2-5에서 본 분리 공리를 다섯 범주 전체에 건다.
관계와 존재 제약 — 설계를 공리로
5-4의 관계 명세도 같은 방식으로 옮긴다. ObjectProperty를 상속하면 객체 속성이 되고, domain·range 속성과 TransitiveProperty 같은 혼합 상속으로 명세의 각 칸이 코드 한 줄씩이 된다. 구성 요소와 측정 주장은 존재 제약(2-5의 some)으로 적는다.
class measures(ObjectProperty): # 과제 → 성향 domain = [PSY_0000004]; range = [PSY_0000002] class measured_by(ObjectProperty): inverse_property = measures class component_of(ObjectProperty, TransitiveProperty): domain = [PSY_0000002]; range = [PSY_0000002] class causes(ObjectProperty): pass causes.is_a.append(influences) # 관계 계층 # 존재 제약 — "음운 루프는 어떤 작업기억의 구성 요소다" PSY_0000019.is_a.append(component_of.some(PSY_0000018)) # "숫자폭 과제는 작업기억을 측정한다" PSY_0000051.is_a.append(measures.some(PSY_0000018)) # 정의된 클래스 (공리 예산의 1개): 작업기억 과제 class PSY_0000053(Thing): pass PSY_0000053.equivalent_to = [PSY_0000004 & measures.some(PSY_0000018)]
build_psymap.py 발췌 2 — 관계, 존재 제약, 그리고 정의된 클래스. 마지막 두 줄이 2-6의 실험을 실전으로 가져온다: 추론기는 이 필요충분조건만으로 구성원을 스스로 찾아낼 것이다(5-7).
전부 입력하고 저장하면 다음이 출력된다.
$ python3 build_psymap.py 저장: psymap.owl (25,061 bytes) 클래스 30개 · 객체 속성 7개 · 주석 속성 6개
실제 실행 출력. 25KB — 지금까지 다섯 차시의 설계가 이 작은 파일 하나로 응축된다. 주석 속성 6개는 다음 차시의 주제다.
판별 연습
문 1PSY_0000019.is_a.append(component_of.some(PSY_0000018))와 class PSY_0000019(PSY_0000018)의 차이를 OWL 공리 수준에서 말하라.
답 확인
전자는 "음운 루프 ⊑ ∃component_of.작업기억" — 음운 루프의 모든 사례가 어떤 작업기억의 구성 요소라는 존재 제약이다. 후자는 "음운 루프 ⊑ 작업기억" — 음운 루프가 작업기억의 일종이라는 포섭이다. 후자를 쓰면 2-2의 is_a 오용(부분을 종류로)이 되고, 작업기억에 대한 모든 질의에 음운 루프가 잘못 걸려든다.
문 2정의된 클래스 PSY_0000053에는 상위 클래스를 직접 지정하지 않았다(Thing 직속). 고아 금지 원칙 위반인가.
답 확인
아니다. equivalent_to의 필요충분조건(측정 과제 ⊓ ∃measures.작업기억)에 의해 추론기가 PSY_0000053 ⊑ 측정 과제를 도출한다. 자리 잡기를 공리가 아니라 추론에 맡기는 것이 정의된 클래스의 요점이다(2-6). 고아 여부는 추론 후의 계층으로 판정한다.
적용: 산출물과 내려받기
이 차시의 산출물은 psymap.owl 초판 — 계층과 관계가 들어간, 그러나 아직 라벨과 정의가 없는 뼈대 파일이다. 완성 스크립트 전문은 build_psymap.py에서 열어 볼 수 있다 — 내용을 복사해 build_psymap.py로 저장하면 그대로 실행된다(owlready2 설치 필요: pip install owlready2). 자신의 도메인으로 실습 중인 독자는 ID 대역 표만 자기 범주로 바꾸면 나머지 구조가 그대로 재사용된다.
용어 정리
| 용어 | 원어 | 뜻 |
|---|---|---|
| Owlready2 | Owlready2 | 파이썬에서 OWL 온톨로지를 만들고 추론기를 부르는 라이브러리 |
| 존재 제약 | existential restriction | ∃관계.클래스 — "어떤 ~와 관계 맺는다"는 공리(2-5의 some) |
| ID 대역 | ID range | 식별자 번호를 범주별로 나눈 구간. 의미 없는 ID에 질서를 준다 |
| 스크립트 구축 | scripted construction | 편집기 대신 코드로 온톨로지를 생성하는 방식. 재실행이 가능하다 |
Lamy, J.-B. (2017). Owlready: Ontology-Oriented Programming in Python. Artificial Intelligence in Medicine, 80. · W3C (2012). OWL 2 Web Ontology Language Primer. · 실습 파일: build_psymap.py(본 사이트 수록).