2부 구축 · 트랙 5 직접 만들기: 인지심리 온톨로지

제 5 차 시

OWL 구현 1 — 파일 생성과 클래스 입력

빈 파일에서 시작하여, 5-3·5-4의 설계를 추론기가 읽을 수 있는 psymap.owl로 옮긴다.
읽기 약 13분 · 코드 실행 1회

편집기가 아니라 스크립트로 짓는다

코드로서의 온톨로지

구축 과정 전체를 다시 실행할 수 있는 기록으로 남긴다.

클릭으로 지은 집은 다시 지을 수 없다.
스크립트로 지은 집은 언제든 허물고 다시 짓는다.

학 습 목 표

  1. Owlready2로 네임스페이스·ID 체계에 맞는 OWL 파일을 생성한다.
  2. 계층·분리 공리·존재 제약·정의된 클래스를 코드로 입력한다.
  3. 스크립트 기반 구축의 장점(재실행 가능성)을 설명한다.

왜 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 대역 표만 자기 범주로 바꾸면 나머지 구조가 그대로 재사용된다.

용어 정리

용어원어뜻
Owlready2Owlready2파이썬에서 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(본 사이트 수록).
트랙 5 · 차시 5OWL 구현 1