같은 개념, 다른 이름
‘Type 2 diabetes’와 ‘ketosis-resistant diabetes’처럼 서로 다른 표현이 동일한 개념을 지시할 수 있다. 통합 단계에서는 문자열이 아니라 개념의 동일성을 다뤄야 한다.
서로 다른 데이터가 한자리에 모인다고 곧 지식이 되는 것은 아니다. 이름을 바로잡고, 뜻의 경계를 세우고, 관계마다 근거와 날짜를 달아야 비로소 질문에 답하는 지식의 터가 생긴다. 제3장은 그 터를 닦는 과정을 희귀질환 진단 사례로 차근차근 보여준다.
제3장은 기술부터 고르지 않는다. 먼저 임상의가 풀어야 할 문제를 정하고, 사용할 데이터를 이해한 다음, 그 데이터의 성격에 맞추어 표현 기술을 선택한다. 이어 온톨로지와 주석 데이터를 하나의 그래프로 통합하고, 마지막에 질의와 추론으로 유용성을 검증한다.
이 장의 미덕은 ‘첫 지식그래프’를 단순한 입문 실습으로 다루지 않는 데 있다. 임상 현장의 모호성, 온톨로지의 계층 구조, 출처가 붙은 관계, 그리고 기술 선택의 이유가 한 흐름 안에 놓인다. 데이터베이스를 만드는 일이면서 동시에 도메인의 언어를 다듬는 일이다.
목표는 명확하다. 임상의가 관찰한 표현형 특징을 바탕으로 놓치기 쉬운 희귀질환 후보를 찾도록 돕는 지식그래프를 구축한다. 이를 위해 온톨로지는 공통 어휘와 계층을 제공하고, 주석 파일은 질환과 표현형 사이의 실제 연결 및 그 연결을 뒷받침하는 근거를 제공한다.
지식그래프 구축의 첫 난점은 파일 형식보다 의미의 불일치다. 같은 질환을 다른 이름으로 부르고, 같은 약어가 서로 다른 개념을 뜻하며, 서로 다른 상세도로 현상을 기술한다. 이 어긋남을 바로잡지 않으면 연결은 많아져도 지식은 흐려진다.
‘Type 2 diabetes’와 ‘ketosis-resistant diabetes’처럼 서로 다른 표현이 동일한 개념을 지시할 수 있다. 통합 단계에서는 문자열이 아니라 개념의 동일성을 다뤄야 한다.
‘PE’가 physical examination을 뜻하기도 하고 pulmonary embolism을 뜻하기도 한다. 문맥과 도메인 지식이 없으면 동일 식별자로 묶을 수 없다.
‘necrosis’와 ‘lobular necrosis’는 관련되지만 동일하지 않다. 계층 관계를 보존해야 넓은 질문과 세밀한 질문을 모두 처리할 수 있다.
XML, CSV, JSON, 관계형 데이터베이스처럼 저장 형식이 달라도 공통 온톨로지에 매핑하면 하나의 의미 공간에서 다룰 수 있다.
질환을 가진 한 개인이 드러내는 모든 표현형 특징의 총합으로 이해한다. 관찰 가능한 신체적·생화학적 이상이 진단의 단서가 된다.
특정 상태를 일으키는 원인, 시간적 경과, 표현형 특징의 집합, 특정 치료에 대한 특징적 반응으로 규정되는 실체다.
제1형 당뇨병을 다른 증후군에서 관찰되는 표현형 특징으로 다룰 때 사용하는 HPO 식별자다.
제1형 당뇨병을 독립된 질환 실체로 다룰 때 사용하는 OMIM 식별자다.
여기서 중요한 것은 하나의 명칭을 하나의 실체로 성급히 고정하지 않는 태도다. 제1형 당뇨병은 문맥에 따라 질환이면서 다른 희귀 증후군의 표현형일 수 있다. 두 식별자를 구분해 쓰는 일은 번거로운 형식주의가 아니라, 임상 판단의 맥락을 잃지 않기 위한 최소한의 예의다.
임상의가 필요로 하는 지식베이스에는 두 가지가 들어가야 한다. 첫째, 같은 장기나 시스템에 속한 표현형 이상을 맥락적으로 연결하는 구조다. 둘째, 각 표현형 이상과 질환 사이의 관계 및 그 관계가 어디에서 왔는지를 추적할 수 있는 정보다.
Human Phenotype Ontology 저장소는 이 사례에 두 종류의 재료를 제공한다. 하나는 표현형 개념의 표준 이름과 계층을 담은 온톨로지이고, 다른 하나는 질환과 표현형의 연결 및 그 근거를 담은 주석 데이터다.
표현형 이상을 표준화한 온톨로지다. 클래스, 레이블, 설명, 동의어, 외부 데이터베이스 교차참조, 생성자와 생성일, 상위 개념과의 관계를 담는다.
질환과 표현형 특징의 명시적 연관을 수록한 주석 파일이다. 연관의 증거 수준, 발현 시점, 빈도, 성별, 수정자, 출처와 큐레이션 정보를 함께 제공한다.
제1형 당뇨병 항목은 하나의 긴 문장이 아니라 주어–술어–목적어의 작은 진술들로 분해된다. 각 진술이 모여 개념의 정의와 위치를 이룬다.
췌장이 인슐린을 거의 또는 전혀 생산하지 못하는 만성 상태라는 자연어 설명을 갖는다.
Type 1 diabetes, juvenile diabetes mellitus, insulin-dependent diabetes mellitus 같은 변형을 연결한다.
MeSH, SNOMED CT, UMLS 식별자와 연결해 다른 지식원과의 접점을 마련한다.
from rdflib import Graph, URIRef
g = Graph()
g.parse("hp.owl", format="xml")
subject = URIRef("http://purl.obolibrary.org/obo/HP_0100651")
for s, p, o in g.triples((subject, None, None)):
print(s, p, o)
| 필드 | 예시 | 의미와 활용 |
|---|---|---|
| database_id | OMIM:222100 | OMIM·Orphanet 등에서 온 질환 식별자다. 질환 노드의 기준 키로 사용한다. |
| disease_name | Diabetes mellitus, insulin-dependent-1 | 연결된 온톨로지에서 정의한 질환 이름이다. |
| hpo_id | HP:0410050 | 연관된 표현형 이상을 가리키는 HPO 식별자다. |
| reference | PMID:9357814 | 해당 연결을 뒷받침하는 논문이나 지식베이스의 출처다. |
| evidence | PCS | 증거 수준이다. PCS는 published clinical study를 뜻한다. |
| onset | 연령·발현 구간 | 표현형 특징이 언제 시작되는지 기술한다. |
| frequency | 30/30 | 동일 질환 집단에서 해당 표현형이 관찰된 빈도다. |
| aspect | P | P는 phenotypic abnormality, I는 inheritance 하위 온톨로지를 가리킨다. |
| biocuration | HPO:NicoleVasilevsky[2018-02-23] | 주석 작성 주체와 날짜를 제공해 변경 이력과 책임 소재를 추적하게 한다. |
hpo.owl은 ‘무엇이 무엇의 하위 개념인가’를 말하고, phenotype.hpoa는 ‘어떤 질환에서 어떤 표현형이 관찰되었으며 그 근거가 무엇인가’를 말한다. 전자는 의미의 구조이고 후자는 관찰과 증거의 기록이다.
좋은 기술은 보편적으로 우월한 기술이 아니라, 현재의 목표를 가장 곧게 달성하는 기술이다. HPO 온톨로지는 RDF로 배포되지만, 이 사례의 핵심은 질환–표현형 관계마다 출처·작성자·날짜·증거를 붙이고 비교하는 데 있다.
웹 표준·의미론·상호운용성 중심
경로 탐색·개별 관계 속성·실용 질의 중심
RDF는 HPO처럼 도메인의 개념 구조를 정교하게 기술하는 데 자연스럽다. 다만 관계마다 다른 출처와 날짜를 붙이려면 단순 트리플만으로 충분하지 않다. n-ary 관계, named graph, RDF-star 같은 추가 표현이 필요하다.
의미론적 표현력은 뛰어나지만, 개별 엣지의 사례별 메타데이터를 단순하게 다루기 어렵다.
임상의는 온톨로지 전체의 완전한 논리 표현보다, 특정 질환과 표현형이 어떤 연구에서 언제 연결되었는지를 쉽게 비교하고 싶어 한다. LPG는 이 연결 자체에 속성을 붙일 수 있어 요구사항을 곧바로 모델에 옮길 수 있다.
제3장은 LPG와 Cypher를 핵심 도구로 채택하고, Neosemantics를 통해 RDF/OWL의 의미 자산을 Neo4j 안으로 들여온다.
‘표현형 주석’이라는 새 중간 실체를 만들고 질환, 표현형, 출처, 작성자, 날짜를 연결한다. 명시적이지만 스키마가 커지고 유지보수가 복잡해질 수 있다.
장점: 표준 의미론 · 단점: 구조 팽창특정 트리플을 이름 붙인 하위 그래프에 넣고 그 그래프에 메타데이터를 단다. 출처 추적에 유용하지만 수많은 named graph 관리와 미세 갱신이 부담이 될 수 있다.
장점: 문맥·프로비넌스 · 단점: 관리 복잡성트리플 자체를 다시 주어로 삼아 속성을 붙인다. 표현은 읽기 쉬워지지만 전용 엔진 지원이 필요하고 도서에서는 성능과 채택 범위를 과제로 지적한다.
장점: 간결성 · 단점: 구현 의존성HAS_PHENOTYPIC_FEATURE 관계에 출처, 작성자, 생성일을 키–값으로 직접 저장한다. 이 사례의 질의와 탐색 요구를 가장 단순하게 표현한다.
OMIM:222100HP:0410050LPG는 RDF의 풍부한 의미론을 모두 직접 표현하지 못한다. Neo4j의 Neosemantics 플러그인은 OWL·RDFS·SKOS 같은 RDF 어휘를 가져오고 기본 추론을 수행해 이 간극을 줄인다. 즉, 저장과 질의는 LPG 방식으로 하되 온톨로지의 계층과 의미를 버리지 않는다.
구축은 두 단계다. 먼저 HPO 온톨로지를 가져와 표현형 개념과 계층을 만들고, 이어 HPOA 주석을 읽어 질환 노드와 질환–표현형 관계를 만든다. 마지막에는 사람이 읽기 쉬운 속성을 보강하고 불필요한 자원을 정리한다.
HPO 지식그래프를 분리된 데이터베이스로 초기화한다.
CREATE DATABASE hpo IF NOT EXISTS;Resource.uri와 Resource.id의 유일성을 보장하고, 질환·표현형 식별자 인덱스를 만들어 구축과 검색을 안정화한다.
CREATE CONSTRAINT n10s_unique_uri IF NOT EXISTS
FOR (r:Resource) REQUIRE r.uri IS UNIQUE;
CREATE INDEX disease_id IF NOT EXISTS
FOR (n:HpoDisease) ON (n.id);
CREATE INDEX phenotype_id IF NOT EXISTS
FOR (n:HpoPhenotype) ON (n.id);가져오기 시 네임스페이스를 무시하고 Neo4j 이름 규칙을 적용한다. 관계 유형을 대문자 형태로 정규화해 LPG 관례에 맞춘다.
CALL n10s.graphconfig.init();
CALL n10s.graphconfig.set({ handleVocabUris: "IGNORE" });
CALL n10s.graphconfig.set({ applyNeo4jNaming: true });RDF/XML 온톨로지를 Neo4j 그래프로 변환한다. 도서의 실험에서는 899,558개 문장이 적재됐다. HPO URI를 가진 자원에 HpoPhenotype 레이블과 사람이 쓰는 HP:... 식별자를 추가한다.
CALL n10s.rdf.import.fetch(
"http://purl.obolibrary.org/obo/hp.owl",
"RDF/XML"
);
MATCH (n:Resource)
WHERE n.uri STARTS WITH "http://purl.obolibrary.org/obo/HP"
SET n:HpoPhenotype,
n.id = replace(n.uri, "http://purl.obolibrary.org/obo/HP_", "HP:");TSV 파일의 처음 다섯 행은 메타데이터이므로 건너뛴다. 질환 노드를 만들고, 같은 행의 질환 ID와 HPO ID를 이용해 HAS_PHENOTYPIC_FEATURE 관계를 생성한다.
LOAD CSV FROM $hpoa AS row
FIELDTERMINATOR '\t'
WITH row SKIP 5
MERGE (d:Resource:HpoDisease {id: row[0]})
ON CREATE SET d.label = row[1];
MATCH (d:HpoDisease {id: row[0]})
MATCH (p:HpoPhenotype {id: row[3]})
MERGE (d)-[:HAS_PHENOTYPIC_FEATURE]->(p);source, evidence, onset, frequency, sex, modifier, aspect, biocuration을 관계에 저장한다. 주석의 핵심 정보가 노드가 아니라 ‘연결’에 놓인다는 설계가 여기서 구현된다.
정규식으로 큐레이터와 생성일을 추출한다. P·I, IEA·PCS·TAS 같은 코드를 설명형 속성으로 바꾸고 PMID·OMIM 식별자에서 원문 링크를 생성한다.
HpoPhenotype와 HpoDisease가 아닌 잔여 자원과 관계를 배치로 정리한다. 탐색 대상과 사용 목적을 분명하게 유지하는 마무리 단계다.
Inferred from Electronic Annotation. OMIM의 임상 특징 등을 기계적으로 파싱해 얻은 전자 주석을 뜻한다.
Published Clinical Study. 의학 문헌에서 추출한 정보이며 보통 PubMed ID를 포함한다.
Traceable Author Statement. OMIM·Orphanet 같은 지식베이스가 출판된 근거에서 정리한 추적 가능한 진술이다.
이 과정에서 주목할 점은 데이터 적재와 인간의 이해가 따로 가지 않는다는 것이다. 코드 값을 그대로 보존하되, evidenceName과 evidenceDescription 같은 설명 속성을 더한다. 그래프가 기계에게만 빠른 구조가 아니라 임상의에게도 읽히는 기록이 되도록 한 것이다.
또한 도서의 예제 중 일부는 최종 정리 전 단계에서만 실행된다. 전체 저장소 코드를 한 번에 실행하면 최종 청소로 중간 자원이 삭제되어 특정 탐색 예제가 더는 작동하지 않을 수 있다는 경고도 제시한다. 재현 가능한 실습에서는 파이프라인 단계와 데이터 상태를 함께 기록해야 한다.
구축된 그래프는 임상의의 관찰을 질의로 바꾸는 도구가 된다. 제1형 당뇨병 환자에게서 추가 표현형이 발견되면, 그 특징들을 함께 갖는 다른 질환을 검색하고 일치 개수로 후보를 순위화할 수 있다.
도서가 사용한 다섯 표현형을 선택하면 알려진 표 3.2의 후보 질환을 단순 일치 개수로 다시 정렬한다. 이는 교육용 재현이며 임상 진단 도구가 아니다.
5개 표현형을 기준으로 일치도를 계산했다.
| 순위 | 질환 ID | 질환명 | 일치한 표현형 | 개수 |
|---|---|---|---|---|
| 1 | OMIM:619269 | Odontochondrodysplasia 2 with hearing loss and diabetes | 성장 지연, 감각신경성 청각장애, 소양증, 큰 무릎, 제1형 당뇨병 | 5 |
| 2 | OMIM:618500 | Holoprosencephaly 12 with or without pancreatic agenesis | 감각신경성 청각장애, 성장 지연, 제1형 당뇨병 | 3 |
| 3 | OMIM:614700 | 3-methylglutaconic aciduria, type VIII | 성장 지연, 감각신경성 청각장애 | 2 |
| 4 | OMIM:616192 | Alobar holoprosencephaly | 성장 지연, 감각신경성 청각장애 | 2 |
| 5 | OMIM:602782 | Alpha-thalassemia / mental retardation syndrome, X-linked | 성장 지연, 감각신경성 청각장애 | 2 |
도서의 사례에서는 다섯 특징을 모두 공유하는 Odontochondrodysplasia 2 with hearing loss and diabetes가 가장 유력한 후보로 드러난다.
순위만으로 결론을 내리지 않는다. 관계에 저장된 frequency, evidence, source, URL을 확인해 해당 표현형이 얼마나 자주 보고됐고 어떤 근거가 있는지 검토한다.
그래프 질의의 힘은 단순히 다섯 단어를 검색하는 데 있지 않다. 표현형은 표준 식별자로 연결되고, 질환과의 관계에는 출처가 붙으며, 동일한 질환 후보가 여러 표현형 경로에서 반복해서 만나는지를 셀 수 있다. 문자열 검색이 흩어진 흔적을 보여준다면, 그래프 질의는 그 흔적이 한 질환으로 모이는 모양을 보여준다.
도서는 연습문제로 후보 질환 질의를 확장해 evidence_name, evidence_description, source, url 같은 관계 속성까지 반환하도록 제안한다. 이는 진단 후보의 ‘무엇’뿐 아니라 ‘왜 믿을 수 있는가’를 함께 보는 방향이다.
질의는 명시적으로 저장된 관계를 찾는다. 추론은 온톨로지의 논리 규칙을 이용해 직접 저장되지 않은 연결을 드러낸다. 제3장은 HPO 계층을 따라 내분비계 이상과 더 구체적인 표현형을 함께 고려하는 예를 든다.
HP:0000818HpoPhenotypeHpoDiseaseSUBCLASSOF*1..3 패턴으로 내분비계 이상보다 한 단계에서 세 단계 더 구체적인 표현형을 찾는다.
Neosemantics의 추론 기능을 이용해 하위 표현형과 연결된 질환을 상위 개념의 질환 후보로 확장한다.
도출된 결과는 ‘어떤 하위 표현형이 어떤 상위 개념에 속하는가’라는 경로로 추적할 수 있다.
| 구분 | 직접 질의 | 온톨로지 기반 추론 |
|---|---|---|
| 출발점 | 그래프에 실제로 저장된 질환–표현형 관계 | 상·하위 개념, 전이 관계 같은 논리 규칙 |
| 질문 | “이 표현형이 직접 연결된 질환은?” | “이 상위 범주에 포함되는 더 구체적인 표현형을 가진 질환은?” |
| 장점 | 정확하고 단순하며 결과의 근거가 직접적이다. | 명시적으로 기록되지 않은 관련성까지 발견 범위를 넓힌다. |
| 주의점 | 데이터에 없는 관계는 찾지 못한다. | 도출 규칙과 온톨로지 품질에 의존하며, 새로운 임상 사실을 창조하는 것은 아니다. |
상위 개념과 하위 개념의 구조를 따라 기존 주석의 의미 범위를 확장하는 것이다. 따라서 결과는 온톨로지의 분류와 원래 주석의 신뢰성을 함께 상속한다. 임상 판단에서는 추론 경로, 증거 코드, 출처 원문을 다시 확인해야 한다.
이 사례는 의료 도메인을 다루지만, 그 원칙은 다른 분야에도 그대로 옮겨갈 수 있다. 핵심은 데이터의 양보다 목적, 의미, 근거, 사용자의 탐색 방식을 먼저 설계하는 데 있다.
RDF와 LPG의 선택은 이념의 문제가 아니다. 임상의가 어떤 정보를 비교하고 어떤 질문을 할 것인지에서 결정한다.
동의어, 약어 충돌, 상세도 차이를 표준 개념과 계층으로 정리해 여러 출처가 같은 의미 공간에서 만나게 한다.
질환과 표현형 사이의 연결에는 출처, 작성자, 날짜, 증거 수준이 있다. 관계를 단순 선이 아니라 증거 기록으로 모델링한다.
IEA, PCS, TAS 같은 약어를 설명형 속성으로 확장해 그래프 탐색 결과를 도메인 전문가가 바로 이해하게 한다.
직접 저장된 사실을 찾는 일과 계층 규칙으로 암묵 관계를 도출하는 일은 결과의 성격과 검증 방법이 다르다.
목적과 무관한 온톨로지 자원을 정리하고 필요한 노드·관계·속성만 남겨 탐색성과 유지보수성을 확보한다.
제3장의 여정은 온톨로지 파일을 데이터베이스에 넣는 것으로 끝나지 않는다. 임상의의 질문에서 출발해, 두 종류의 HPO 데이터를 읽고, 관계의 성격에 맞는 모델을 고르고, 출처와 증거를 엣지에 보존하며, 질의와 추론으로 다시 현장에 돌려준다. 한 줄의 관계가 믿을 만한 지식이 되기까지 필요한 손길을 보여주는 장이다.