#!/usr/bin/env python3 """psymap 기억 모듈 구축 스크립트 (5-5 ~ 5-6). 실행: python3 build_psymap.py → psymap.owl (RDF/XML) 저장.""" from owlready2 import * onto = get_ontology("https://example.org/psymap/") with onto: # ---------- 주석 속성 (SKOS·Dublin Core 재사용) ---------- class prefLabel(AnnotationProperty): pass class altLabel(AnnotationProperty): pass class definition(AnnotationProperty): pass class exactMatch(AnnotationProperty): pass class note(AnnotationProperty): pass class source(AnnotationProperty): pass prefLabel.iri = "http://www.w3.org/2004/02/skos/core#prefLabel" altLabel.iri = "http://www.w3.org/2004/02/skos/core#altLabel" definition.iri = "http://www.w3.org/2004/02/skos/core#definition" exactMatch.iri = "http://www.w3.org/2004/02/skos/core#exactMatch" note.iri = "http://www.w3.org/2004/02/skos/core#note" source.iri = "http://purl.org/dc/terms/source" CA = "https://www.cognitiveatlas.org/{kind}/id/{id}" def dress(cls, ko, en, defin=None, alts=None, ca=None, ca_kind="concept", src=None, memo=None): cls.prefLabel = [locstr(ko, "ko"), locstr(en, "en")] cls.label = [locstr(ko, "ko")] if alts: cls.altLabel = [locstr(a, "ko") for a in alts] if defin: cls.definition = [locstr(defin, "ko")] if ca: cls.exactMatch = [CA.format(kind=ca_kind, id=ca)] if src: cls.source = [src] if memo: cls.note = [locstr(memo, "ko")] 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]) # ---------- 관계 (5-4 확정) ---------- 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 depends_on(ObjectProperty): # 과정 → 뇌 구조 domain = [PSY_0000001]; range = [PSY_0000003] class associated_with(ObjectProperty, SymmetricProperty): pass # 증거 1단계 class influences(ObjectProperty): pass # 증거 2단계 class causes(ObjectProperty): pass # 증거 3단계 causes.is_a.append(influences) # causes ⊑ influences # ---------- 성향: 기억 능력 가지 ---------- 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_0000014(PSY_0000013): pass # 일화기억 class PSY_0000015(PSY_0000013): pass # 의미기억 class PSY_0000016(PSY_0000012): pass # 비서술기억 class PSY_0000017(PSY_0000016): pass # 절차기억 class PSY_0000018(PSY_0000010): pass # 작업기억 class PSY_0000022(PSY_0000018): pass # 음운 작업기억 class PSY_0000023(PSY_0000010): pass # 언어 기억 (양상 축) # 작업기억 구성 요소 — '구성요소' 역할 클래스를 두지 않고 관계로 표현 (3-4) class PSY_0000019(PSY_0000002): # 음운 루프 pass class PSY_0000020(PSY_0000002): # 시공간 잡기장 pass class PSY_0000021(PSY_0000002): # 중앙 집행기 pass PSY_0000019.is_a.append(component_of.some(PSY_0000018)) PSY_0000020.is_a.append(component_of.some(PSY_0000018)) PSY_0000021.is_a.append(component_of.some(PSY_0000018)) # ---------- 과정: 기억 과정 가지 ---------- class PSY_0000030(PSY_0000001): pass # 기억 과정 class PSY_0000031(PSY_0000030): pass # 부호화 class PSY_0000032(PSY_0000030): pass # 저장 class PSY_0000033(PSY_0000030): pass # 인출 class PSY_0000034(PSY_0000030): pass # 응고화 # ---------- 뇌 구조 ---------- class PSY_0000040(PSY_0000003): pass # 해마 PSY_0000031.is_a.append(depends_on.some(PSY_0000040)) # 부호화 —depends_on→ 해마 PSY_0000034.is_a.append(depends_on.some(PSY_0000040)) # 응고화 —depends_on→ 해마 # ---------- 과제 ---------- class PSY_0000050(PSY_0000004): pass # 기억 과제 class PSY_0000051(PSY_0000050): pass # 숫자폭 과제 class PSY_0000052(PSY_0000050): pass # N백 과제 PSY_0000051.is_a.append(measures.some(PSY_0000018)) # 숫자폭 → 작업기억 PSY_0000051.is_a.append(measures.some(PSY_0000022)) # 숫자폭 → 음운 작업기억 PSY_0000051.is_a.append(measures.some(PSY_0000023)) # 숫자폭 → 언어 기억 PSY_0000052.is_a.append(measures.some(PSY_0000018)) # N백 → 작업기억 # 정의된 클래스 1개 (공리 예산): 작업기억 과제 class PSY_0000053(Thing): pass PSY_0000053.equivalent_to = [PSY_0000004 & measures.some(PSY_0000018)] # ---------- 정보 개체 ---------- class PSY_0000060(PSY_0000005): pass # 기억 흔적 # ---------- 라벨·정의·출처·정렬 (5-6) ---------- SQ = "Squire, L. R. (2004). Memory systems of the brain. Neurobiol Learn Mem, 82(3)." BAD = "Baddeley, A. D. & Hitch, G. (1974). Working memory. Psychology of Learning and Motivation, 8." COW = "Cowan, N. (2008). What are the differences between long-term, short-term, and working memory? Prog Brain Res, 169." ATK = "Atkinson, R. C. & Shiffrin, R. M. (1968). Human memory: A proposed system. Psychology of Learning and Motivation, 2." TUL = "Tulving, E. (1972). Episodic and semantic memory. In Organization of Memory." dress(PSY_0000001, "심리적 과정", "psychological process", "시간 속에서 전개되는 심리적 사건. BFO의 발생체에 대응한다.") dress(PSY_0000002, "심리적 성향", "psychological disposition", "조건이 갖추어지면 특정 과정으로 실현되는 지속적 능력. BFO의 성향에 대응한다.") dress(PSY_0000003, "뇌 구조", "brain structure", "심리적 과정이 의존하는 신경해부학적 구조.") dress(PSY_0000004, "측정 과제", "measurement task", "심리적 성향을 측정하기 위해 설계된 표준화된 절차.") dress(PSY_0000005, "정보 개체", "information entity", "심리적 과정이 만들거나 사용하는 정보적 대상.") dress(PSY_0000010, "기억 능력", "memory ability", "정보를 부호화·저장·인출하는 성향의 총칭. 단일한 능력이 아니라 해리 가능한 하위 체계들의 상위 개념이다.", src=SQ, memo="CA에는 'memory'가 있으나 과정·성향을 묶은 광의 개념이므로 exactMatch 대신 분해를 택한다(4-2 결정).") dress(PSY_0000011, "단기기억", "short-term memory", "수 초에서 수십 초 범위에서 소량의 정보를 수동적으로 유지하는 능력.", alts=["STM"], src=ATK, memo="작업기억과의 관계(동일시·포함·분리)는 이론 경합 중이므로 공리를 두지 않고 기록만 남긴다(5-3 결정, 보수성 원칙 3-5). Cowan 2008 참조.") dress(PSY_0000012, "장기기억", "long-term memory", "수 분 이상에서 평생에 이르는 기간 동안 정보를 유지하는 능력.", alts=["LTM"], ca="trm_4a3fd79d0a833", src=SQ) dress(PSY_0000013, "서술기억", "declarative memory", "사실과 사건에 대한, 의식적으로 접근하고 언어로 보고할 수 있는 장기기억.", alts=["명시적 기억", "외현기억"], ca="trm_4a3fd79d0a04f", src=SQ, memo="명시/암묵 축은 서술/비서술 축의 별칭으로 흡수한다(5-3 결정). CA는 explicit memory를 declarative의 하위 종으로 두므로 불일치를 기록한다(5-8).") dress(PSY_0000014, "일화기억", "episodic memory", "특정 시간과 장소에 결부된 개인적 사건에 대한 서술기억.", ca="trm_4a3fd79d0a1f4", src=TUL, memo="CA는 semantic memory를 episodic memory의 부분으로도 기재한다(Tulving 후기 견해). 본 지도는 Squire 분류를 따라 형제 관계로 두고 불일치를 기록한다(5-8).") dress(PSY_0000015, "의미기억", "semantic memory", "특정 사건과 무관한 일반 지식·사실·어휘에 대한 서술기억.", ca="trm_4a3fd79d0b083", src=TUL) dress(PSY_0000016, "비서술기억", "nondeclarative memory", "수행의 변화로 드러나며 의식적 보고가 필요 없는 장기기억의 총칭.", alts=["암묵적 기억", "내현기억"], src=SQ) dress(PSY_0000017, "절차기억", "procedural memory", "기술과 습관의 학습·수행을 지탱하는 비서술기억.", src=SQ) dress(PSY_0000018, "작업기억", "working memory", "진행 중인 인지 과제를 위해 정보를 일시적으로 유지하고 조작하는 능력.", alts=["작동기억"], ca="trm_4a3fd79d0b5a7", src=BAD) dress(PSY_0000019, "음운 루프", "phonological loop", "언어·음운 정보를 되뇌기로 유지하는 작업기억의 구성 요소.", src=BAD) dress(PSY_0000020, "시공간 잡기장", "visuospatial sketchpad", "시각·공간 정보를 유지·조작하는 작업기억의 구성 요소.", src=BAD, memo="음운 루프와의 대칭성에 따라 용어 대장 v2에서 추가(5-3). 일화 완충기(2000)는 이론적 지위가 유동적이어서 기각 — 결정 로그 참조.") dress(PSY_0000021, "중앙 집행기", "central executive", "하위 체계를 제어하고 주의를 배분하는 작업기억의 구성 요소.", src=BAD, memo="주의 모듈과의 경계 개념. 주의 모듈 구축 시 재검토한다.") dress(PSY_0000022, "음운 작업기억", "phonological working memory", "음운 정보의 유지·조작에 특화된 작업기억.", ca="trm_4a3fd79d0ac9e", src=BAD) dress(PSY_0000023, "언어 기억", "verbal memory", "언어 재료에 대한 기억 능력. 시간 축이 아닌 양상(modality) 축의 구분이다.", ca="trm_4a3fd79d0b457", memo="양상 축은 시간·내용 축과 교차한다. 다중 상속을 피하기 위해 기억 능력 직속에 두고 교차는 기록만 한다(5-3 결정).") dress(PSY_0000030, "기억 과정", "memory process", "정보의 부호화에서 인출에 이르는 심리적 과정의 총칭.") dress(PSY_0000031, "부호화", "encoding", "감각·지각 정보를 저장 가능한 기억 표상으로 변환하는 과정.", src=SQ) dress(PSY_0000032, "저장", "storage", "부호화된 표상을 시간에 걸쳐 유지하는 과정.") dress(PSY_0000033, "인출", "retrieval", "저장된 표상에 접근하여 활성화하는 과정.") dress(PSY_0000034, "응고화", "consolidation", "불안정한 기억 흔적이 안정된 장기 표상으로 변환되는 과정.", src=SQ, memo="저장의 하위로 볼 수도 있으나 시간 경과·수면 의존 등 구분되는 특성이 있어 형제로 둔다(5-3 결정). CA는 consolidation을 long-term memory의 부분으로 기재 — 과정을 성향의 부분으로 두는 범주 혼합이므로 따르지 않고 기록한다(5-8).") dress(PSY_0000040, "해마", "hippocampus", "내측 측두엽의 구조. 서술기억의 부호화와 응고화에 필수적이다.", src=SQ) dress(PSY_0000050, "기억 과제", "memory task", "기억 능력을 측정하기 위한 과제의 총칭.") dress(PSY_0000051, "숫자폭 과제", "digit span task", "제시된 숫자열을 순서대로(또는 역순으로) 되말하게 하여 유지(및 조작) 용량을 재는 과제.", ca="tsk_4a57abb949a0d", ca_kind="task", memo="CA measures: working memory, phonological working memory, verbal memory (2026-10 조회).") dress(PSY_0000052, "N백 과제", "n-back task", "연속 자극에서 n단계 전 자극과의 일치를 판단하게 하여 갱신·유지를 재는 과제.", ca="tsk_4a57abb949bcd", ca_kind="task", memo="CA measures: working memory, updating, active maintenance 외 (2026-10 조회).") dress(PSY_0000053, "작업기억 과제", "working memory task", "작업기억을 측정하는 측정 과제. 정의된 클래스 — 추론기가 구성원을 도출한다(2-6).") dress(PSY_0000060, "기억 흔적", "memory trace", "부호화가 남기는, 저장·응고화의 대상이 되는 정보적 표상.", alts=["엔그램"]) # 관계에도 라벨 for prop, ko, en, memo in [ (measures, "측정한다", "measures", "출처: Cognitive Atlas의 measures 관계(4-2)."), (measured_by, "측정된다", "measured by", None), (component_of, "구성 요소이다", "component of", "출처: RO part_of(BFO_0000050) 계열. 성향의 구성 표현용(2-3)."), (depends_on, "의존한다", "depends on", "출처: RO depends on(RO_0002502) 차용."), (associated_with, "연관된다", "associated with", "증거 1단계: 상관(2-3)."), (influences, "영향을 준다", "influences", "증거 2단계: 방향 있는 영향(2-3)."), (causes, "일으킨다", "causes", "증거 3단계: 실험적 인과(2-3). causes ⊑ influences."), ]: prop.prefLabel = [locstr(ko, "ko"), locstr(en, "en")] if memo: prop.note = [locstr(memo, "ko")] onto.save(file="psymap.owl", format="rdfxml") n_classes = len(list(onto.classes())) n_props = len(list(onto.object_properties())) import os print(f"저장: psymap.owl ({os.path.getsize('psymap.owl'):,} bytes)") print(f"클래스 {n_classes}개 · 객체 속성 {n_props}개 · 주석 속성 6개")