본문으로 건너뛰기

식별자와 단위: IRI, QUDT, 그리고 타입 지정 값

📍 현재 위치: 1부 · 모델의 기초 — 3장. 우리는 이제 클래스, 관계, 공리를 저작할 수 있습니다. 이번 장은 그 모든 것이 조용히 전제하고 있던 두 가지를 살펴봅니다. 하나의 이름이 어디서나 같은 것을 뜻한다는 전제, 그리고 하나의 숫자는 결코 단위 없이 떠다니지 않는다는 전제입니다.

지난 두 장은 어휘를 세우고 거기에 논리를 부여했습니다. 그러나 우리가 적은 모든 트리플은 입 밖에 내지 않은 두 가지 약속에 기대고 있었습니다. PApool-001 derivedFrom BATCH-2026-001이라고 말했을 때, 우리는 그 이름이 하나의 배치를 — 그것을 읽는 모든 시스템에게 동일한 그 배치를 — 가리킨다고 전제했습니다. 그리고 monomerPct 98.611이라고 말했을 때, 우리는 98.611이 모호하지 않을 만큼 충분한 정보를 스스로 지니고 다닌다고 전제했습니다. 두 약속 중 어느 것도 공짜로 성립하지 않으며 — 그 약속과 현실 사이의 간극이 바로 의미적 상호운용성 장이 이름 붙인 그 늪입니다. 이번 장은 그 두 간극을 모두 메웁니다. 이름을 전역적으로 만드는 식별자(identifier), 그리고 값을 스스로 기술하게 만드는 단위와 데이터타입(unit-and-datatype)의 규율입니다.

쉽게 말하면

신뢰할 수 있는 숫자와 그렇지 못한 숫자를 가르는 작은 습관 두 가지가 있습니다. 첫째는 여권(passport)입니다. 어떤 대상을 "BR-101" — 당신의 공장에서는 한 가지를 뜻하지만 내 공장에서는 다른 것을 뜻하는 이름 — 이라고 부르는 대신, 세계 어디서도 다른 누구의 것과 혼동될 수 없는 전역적으로 유일한 식별자를 부여하는 것입니다. 둘째는 언제나 화폐 단위를 함께 적는 것입니다. "5"는 쓸모가 없지만 "5 USD"는 은행에 넣을 수 있습니다. 98.611이라는 값은 소문에 불과하지만, 숫자로 타입이 지정되고 퍼센트(percent)라는 단위가 붙은 98.611은 사실입니다. 이번 장은 모든 이름에 여권을 주고 모든 숫자에 그 화폐 단위를 주는 일에 관한 이야기입니다.

이 장에서 다루는 내용

우리는 IRI를 풀어 봅니다 — 왜 전역 식별자가 지역 기본 키를 이기는지, 그리고 그것을 발행(minting)하고 화해(reconcile)시키는 규율은 무엇인지를요. 여기에는 owl:sameAs가 어떻게 네 가지 다른 이름으로 불리는 하나의 실제 배치를 잇는지, 그리고 왜 그 연결이 보이는 것보다 더 위험한지도 포함됩니다. 그다음 우리는 값에 정체성을 부여합니다. 98.611을 텍스트가 아니라 숫자로 만드는 데이터타입(datatype), 그리고 그 숫자가 무엇을 측정하는지를 고정하는 QUDT 단위입니다. 우리는 완전히 식별된 값 하나를 해부하고, 이것이 어떻게 데이터를 찾을 수 있고(Findable) 상호운용 가능하게(Interoperable) 만드는지를 정확히 보여 준 뒤, 레거시 시스템 전반에 걸친 정체성 화해라는 진정으로 미해결된 문제로 마무리합니다.

IRI: 지역 키가 아니라 전역 이름

관계형 데이터베이스에서 BATCH-2026-001은 기본 키입니다. 그 테이블 안에서는 유일하지만 그 바깥에서는 무의미하죠. 실험실 시스템, ERP, 히스토리언이 각자 자기만의 "BATCH-2026-001"을 가지는 순간, 당신에게는 똑같아 보이지만 같은 배치를 뜻하지 않을 수도 있는 키가 셋 생기거나 — 혹은 네 개의 서로 다른 키를 지닌 하나의 배치가 생깁니다. RDF의 답은 IRI, 곧 국제화 자원 식별자(Internationalized Resource Identifier)입니다. 네임스페이스 접두어와 지역 식별자로 만들어져 단 하나의 대상으로만 해석되는, 전역적으로 유일한 웹 이름이죠 [2]. 우리의 bp:BATCH-2026-001https://example.org/bioproc#BATCH-2026-001로 확장되며, 네임스페이스가 그것을 전역적으로 만들어 주기 때문에 같은 지역 이름을 지닌 다른 조직의 배치와 충돌할 수 없습니다. 모든 트리플의 주어, 술어, 그리고 자원 값을 지닌 목적어는 IRI입니다 — 그래서 정체성은 데이터 모델에 나중에 덧붙여진 것이 아니라 처음부터 내장되어 있습니다.

이것은 FAIR 원칙의 맨 첫 글자의 구조적 형태입니다. 바로 F1, "데이터와 메타데이터에는 전역적으로 유일하고 영속적인 식별자가 부여된다"입니다 [1]. 지역 키는 시스템 전반에서 찾을 수 없지만 영속적인 IRI는 찾을 수 있습니다. 그것을 잘 발행하는 일은 그 자체로 작은 규율입니다 — 의미가 바뀌면 썩어 버리는 의미 있는 식별자보다 불투명하고 안정적인 식별자를 선호하고, 폐기된 식별자는 결코 재사용하지 않으며, 네임스페이스가 계속 해석 가능하도록 누가 보장하는지를 미리 정해 두어야 합니다. 규제 환경에서는 그 정체성이 기록을 보존해야 하는 수십 년 동안 계속 해석되어야 할 수도 있기 때문입니다.

네 가지 이름으로 불리는 하나의 배치: 화해와 그 위험

어려운 경우는 새로운 대상에 이름을 붙이는 일이 아닙니다. 네 시스템이 이미 같은 대상에 서로 다른 이름을 붙여 두었다는 사실을 발견하는 일이죠. 생물반응기 DCS는 BR101.Temp.PV를 기록하고, LIMS는 그 로트를 DS-2026-001이라 부르며, ERP는 그 자재를 1000457이라 부르고, 분석성적서(CofA) PDF에는 "Lot 26-001"이라고 적혀 있습니다. 각각은 내부적으로 일관되지만 서로는 알아들을 수 없습니다 — 오픈소스 지식 그래프 장이 자신의 그래프를 만들어 풀고자 한 바로 그 문제입니다. 그래프란 이들을 화해시키는 모델이 마침내 깃들 수 있는 곳입니다.

투박한 도구는 owl:sameAs로, 두 IRI가 동일한 개체를 가리킨다고 주장합니다. 그래서 한쪽에 참인 모든 것이 다른 쪽에도 참이 됩니다. lims:DS-2026-001 owl:sameAs bp:DS-001이라고 적으면 추론기가 둘의 사실을 융합합니다. 이것은 강력하면서도 장전된 총입니다. owl:sameAs는 양방향으로 모든 속성을 전파하므로, 지나치게 성급한 정체성 연결 하나가 그래프를 거짓 추론으로 오염시킬 수 있습니다 — 잘 기록된 "sameAs 문제"로, 링크드 데이터(Linked Data) 실무자들은 이 관계가 참된 정체성이 아니라 "비슷하다"거나 "관련 있다"는 뜻으로 일상적으로 오용된다는 사실을 발견했습니다 [5]. 더 느슨한 연결을 위한 더 안전한 도구들은 일부러 더 약하게 만들어졌습니다. skos:exactMatchskos:closeMatch는 두 용어가 같은 개체라고 주장하지 않으면서 둘이 들어맞는다는 사실만 기록하므로, 잘못된 매칭이 그래프 전체를 망가뜨리는 대신 하나의 매핑을 저하시키는 데 그칩니다. 연결의 적절한 강도를 고르는 일은 실제 바이오공정 그래프를 구축할 때 가장 중대하면서도 — 가장 과소평가되는 — 결정 중 하나입니다 — 그리고 어느 쪽이든 그것은 트리플 하나입니다(여기서 소스 접두어는 예시일 뿐입니다).

# Two systems' names for the same lot, reconciled onto one bp: IRI — at two strengths.
lims:DS-2026-001 owl:sameAs bp:DS-001 . # STRONG — fuses every fact in both directions
erp:material-1000457 skos:exactMatch bp:DS-001 . # SAFE — terms line up, no identity claim

시스템 간 정체성 화해를 보여 주는 히어로 다이어그램: 왼쪽에 네 개의 소스 이름표 — DCS 태그 BR101.Temp.PV, LIMS 로트 DS-2026-001, ERP 자재 번호 1000457, CofA 문자열 Lot 26-001 — 가 각각 시스템별 색의 상자에 담겨, 매핑 화살표를 통해 가운데의 단일 IRI 노드 bp(그 원료의약품 로트 bp과 함께)로 수렴합니다. 강한 owl 연결은 실선으로 그려져 모든 사실을 전파하는 정체성으로 표시되고, 더 부드러운 skos 연결은 점선으로 그려져 더 안전한 비정체성 매칭으로 표시되며, 캡션은 지나치게 성급한 sameAs가 그래프를 오염시킨다고 경고합니다. 네 가지 이름으로 불리는 하나의 실제 배치가 단일 전역 IRI로 화해됩니다 — owl:sameAs는 모든 사실을 융합하는 강한 연결로, skos:exactMatch는 그렇지 않은 더 안전한 매칭으로 그려졌습니다. 연결의 강도 그 자체가 하나의 모델링 결정이기 때문입니다. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.

타입 지정 값: 숫자는 그렇다고 말하기 전까지는 텍스트다

정체성은 주어와 술어를 다룹니다. 목적어는 — 그것이 간선이 아니라 값일 때 — 자신만의 규율을 필요로 합니다. 맨숫자 98.611은 기계에게 아직 숫자가 아니기 때문입니다. 그것은 숫자처럼 보이는 문자들의 나열일 뿐입니다. RDF는 이를 타입 지정 리터럴(typed literal)로 해결합니다. 어휘 형식(98.611)을 데이터타입(datatype) IRI(xsd:float)와 짝지어, 그것을 읽는 누구에게나 그 값을 텍스트나 날짜, 코드가 아니라 부동소수점 숫자로 파싱하라고 알려 주는 것이죠 [2]. 데이터타입을 잘못 지정하면 산술이 조용히 깨집니다 — "98.611"을 문자열로 두면 텍스트처럼 정렬되고 비교되므로, "98.611""9"보다 "작습니다". 데이터타입은 계산할 수 있는 값과 표시밖에 할 수 없는 값을 가르는 차이입니다.

하지만 타입이 지정된 숫자도 무엇을 측정하는지에 대해서는 여전히 모호합니다. 98.611이 무엇이라는 걸까요? 데이터 책의 트리플 해부가 이 점을 짚었습니다. 히스토리언은 퍼센트가 이름표에 묻힌 Monomer% = 98.6을 기록했고, 어떤 CSV는 "frac"이 분수를 뜻할 수도 있는 %Mono,98.611,frac을 적었습니다. 같은 숫자, 양립 불가능한 세 가지 의미입니다. 그 치료법은 QUDT — 수량·단위·차원·타입(Quantities, Units, Dimensions and Types) 어휘 — 로, 값이 단위를 문자열 접미어가 아니라 기계가 읽을 수 있는 IRI로 지니게 합니다 [3]. QUDT는 사람들이 혼동하는 두 가지를 분리합니다. 수량 종류(quantity kind)(이것이 어떤 종류의 수량인지 — 무차원 비율인지, 온도인지, 질량 농도인지)와 단위(unit)(unit:PERCENT, unit:DEG_C, unit:GM-PER-L)입니다. 둘 다를 고정하면 98.611은 무차원 비율의 98.611 %를 모호함 없이 가리키고, 37.2라는 온도는 수량 종류가 온도인 unit:DEG_C가 되어 — 결코 화씨나 켈빈으로 잘못 읽힐 수 없습니다. 임상 및 실험실 시스템과의 교환에서는 같은 역할을 UCUM, 곧 통합 측정 단위 코드(Unified Code for Units of Measure)가 맡으며, 그 대소문자 구분 코드(%, Cel, g/L)는 소프트웨어 전반에서 모호하지 않도록 설계되었습니다 [4]. 단위를 데이터로 지니고 다니는 값은 결코 일어나지 않을 미래의 일탈입니다. 다음은 실행 예제의 단량체 값을, 적재 가능한 데이터셋이 그것을 지니고 다니는 모습 그대로, 완전히 한정한 것입니다.

# instances.ttl — 98.611 made self-describing: a number, a unit IRI, and a quantity kind.
bp:DS-001-monomer a qudt:QuantityValue ; rdfs:label "DS-001 SEC %monomer" ;
qudt:numericValue "98.611"^^xsd:float ; # the number, typed as a float
qudt:hasUnit unit:PERCENT ; # the unit as an IRI, not a string suffix
qudt:hasQuantityKind qkind:DimensionlessRatio . # what *sort* of quantity it is

(QUDT의 현재 속성은 qudt:hasUnit이며, 더 오래된 qudt:unit은 더 이상 사용되지 않습니다.) 이제 98.611은 어떤 시스템이든 추측 없이 읽고, 비교하고, 변환할 수 있습니다 — 맨숫자 소문이 사실이 된 것입니다.

하나의 타입 지정 값에 대한 식별 카드를 위아래로 대비: 위에는 그저 98.611만 적힌 맨 칸이 있고, 기계는 종류와 단위를 알 수 없는 텍스트만 본다는 빨간 주석이 붙어 있습니다. 그 아래에는 같은 값이 이름표 붙은 계층으로 쌓여 올라갑니다 — 어휘 형식 98.611, 그것을 숫자로 파싱할 수 있음을 표시하는 xsd 데이터타입 태그, QUDT 단위 IRI unit, 그리고 QUDT 수량 종류 IRI DimensionlessRatio — 가 하나의 스스로를 기술하는 리터럴로 조립됩니다. 옆 패널은 같은 규율을 온도 37.2에 적용해 xsd, unit, 그리고 수량 종류 온도를 보여 주며, 캡션은 값은 결코 맨몸으로 떠돌지 않는다고 적혀 있습니다. 같은 숫자, 전과 후: 맨숫자 98.611은 종류와 단위를 알 수 없는 텍스트이지만, 데이터타입과 QUDT 단위와 수량 종류를 입히면 기계가 계산할 수 있고 결코 잘못 읽지 않는 스스로를 기술하는 사실이 됩니다. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.

왜 이것이 정확히 데이터를 FAIR하게 만드는가

이번 장의 두 규율은 FAIR의 네 글자 중 두 글자에 곧바로 대응되며, 그래서 이들은 마무리 손질이 아니라 토대입니다 [1]. 전역적이고 영속적인 IRI는 데이터를 시스템 전반에서 찾을 수 있고(Findable)(F1) 주소 지정 가능하게 만드는 것입니다 — 안정된 이름이 없는 것은 찾을 수 없습니다. 공유 어휘에 더해 한정되고(qualified) 단위를 지니며 데이터타입이 부여된 값은 데이터를 상호운용 가능하게(Interoperable)(I1–I3) 만드는 것입니다 — 데이터 책이 보여 주었듯이, 실제 데이터셋이 가장 자주 실패하는 그 "I"는, 그 메타데이터가 맨 문자열과 지역 키를 썼기 때문입니다. 데이터 책이 밑그림을 그린 화해·정규화 파이프라인 — 모든 이름을 하나의 공유 술어에 매핑하고, 모든 값의 단위와 데이터타입을 고정한 뒤, 적재하는 — 은, 한 단계 한 단계가 이번 장의 정체성과 단위 규율을 규모에 맞게 적용한 것입니다.

이질적 입력을 FAIR한 사실로 바꾸는 3단계 흐름: 1단계는 서로 다른 이름의 네 소스 값(태그, LIMS 필드, ERP 번호, CofA 문자열, 그리고 반올림된 값 98.6과 값 frac)을 받아 sameAs/exactMatch 연결로 이름들을 하나의 IRI로 화해시킵니다. 2단계는 값을 정규화합니다 — 분수를 퍼센트로 변환하고, xsd와 QUDT 단위 PERCENT를 고정하여 — 하나의 타입 지정 리터럴을 만들어 냅니다. 3단계는 그 결과를 스스로를 기술하는 트리플로 그래프에 적재하며, 그것이 충족하는 FAIR 글자들(F1 전역 식별자, I1–I3 공유 어휘와 한정된 단위)을 함께 표시합니다. 사이드바는 맨 문자열과 지역 키가 데이터를 찾을 수는 있지만 상호운용 불가능하게 남겨 두는 실패 양상을 표시합니다. 정체성 다음에 단위, 단번에: 모든 이름을 하나의 전역 IRI로 화해시키고, 모든 값을 그 QUDT 단위와 함께 정규화하고 타입을 부여하면, 적재된 트리플은 설계상 찾을 수 있고 상호운용 가능합니다 — 대부분의 실제 데이터셋이 놓치는 그 FAIR의 "I"입니다. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.

미해결 과제: 정체성 화해는 여전히 부분적으로 수작업이다

솔직히 말해, 단위는 이번 장에서 풀린 절반입니다. 의지만 있다면 QUDT와 UCUM은 단위 모호성을 완전히 제거합니다 — 거기서의 실패는 도구의 빈틈이 아니라 규율의 실패입니다. 정체성 화해는 풀리지 않은 절반입니다. DCS의 BR101.Temp.PV, LIMS의 DS-2026-001, ERP의 1000457, 그리고 PDF의 "Lot 26-001"이 모두 같은 배치를 가리킨다고 판단하는 일은 개체 해소(entity resolution) 문제이며, 공유 키가 없는 수십 년 묵은 레거시 시스템 전반에서 이것은 여전히 끈질기게 수작업이거나 반자동이고, 오류가 잦으며, 비용이 큽니다. 매칭 하나를 틀리면 owl:sameAs는 조용히 실패하지 않습니다 — 그것은 서로 다른 두 배치를 하나로 융합하고 양방향으로 모든 거짓 사실을 전파합니다. sameAs 문헌이 경고한 바로 그 오염이죠 [5]. 올바르게 타입이 지정된 두 IRI가 같은 물리적 대상을 가리키는지 알려 줄 수 있는 추론기는 없습니다. 그 판단은 사람이 공급하는 공정 지식에서 나옵니다.

두 번째 열린 문제는 더 조용하고 더 장기적입니다. 바로 영속성(persistence)입니다. FAIR는 계속 해석 가능한 상태로 남는 식별자를 요구하지만, bp: IRI는 그 뒤에 있는 조직과 네임스페이스만큼만 지속됩니다. https://example.org/bioproc#BATCH-2026-001이 GxP 기록이 살아남아야 할 수도 있는 지평인 십오 년 뒤에도 여전히 해석된다고 누가 보장할까요? PID 거버넌스 — 핸들, PURL, 레지스트리, 그리고 그것들을 살아 있게 유지하는 기관들 — 는 실재하지만 자금이 부족한 분야이며, 죽어 버린 식별자는 그것이 대체한 지역 키보다 나을 것이 없습니다. 그래서 이번 장이 세우는 기준은 냉정합니다. 단위는 오늘 모호하지 않게 만들 수 있지만, 정체성과 그 영속성은 능동적으로 관장(govern)해야 하며, 이 분야는 당신에게 자동적인 답을 건네주지 않았습니다.

왜 중요한가

이 책의 나머지가 그리는 모든 간선과 거기에 매다는 모든 값은 여기서 한 두 가지 보장에 달려 있습니다. 정체성이 흔들리면, 계보 추적이 조용히 서로 다른 두 배치 사이를 넘나들 수 있고, 어떤 조사가 완전한 확신을 품은 채 잘못된 결론에 이를 수 있습니다. 단위가 맨몸이면, 숫자가 시스템마다 다른 것을 뜻하고, 잘못 읽힌 값을 근거로 어떤 제어 결정이 내려집니다. 클래스, 관계, 공리로 이루어진 그 모든 구조물은 전역적인 이름과 스스로를 기술하는 값 위에 얹혀 있습니다. 이것이 그 모든 것의 밑바탕이며, 그래서 우리가 공정 자체를 모델링하기 시작하기 전에 이 장이 기초를 닫는 것입니다.

실제 현장에서는

이것들은 맞춤 제작된 발상이 아닙니다. QUDT는 발행되어 널리 쓰이는 단위 온톨로지이고, UCUM은 전 세계 임상 및 실험실 데이터 교환에 내장된 단위 표준입니다 [3][4]. 영속 식별자 시스템 — 출판물을 위한 DOI, 데이터를 위한 핸들과 PURL, 거래되는 상품을 위한 GS1 키 — 은 이미 전역 규모로 운영되고 있으며, 직렬화 장은 GS1 식별자가 완제 바이알에서 정확히 이 일을 하는 모습을 보여 줍니다. 화해 쪽에서는, 공장이 사들이는 상용 "데이터 패브릭(data fabric)"과 "마스터 데이터 관리(master data management)" 제품이, 브랜드명 아래에서는 이번 장이 미해결이라고 말하는 바로 그 정체성 문제와 씨름하는 개체 해소 엔진입니다 — 그것들이 여전히 비싸고, 사람의 감독을 받으며, 결코 완전히 끝나지 않는 이유가 바로 이것입니다.

핵심 용어

  • IRI(국제화 자원 식별자, Internationalized Resource Identifier) — RDF가 모든 주어, 술어, 자원 목적어에 부여하는 전역적으로 유일한 웹 이름. 지역 기본 키와 달리 시스템과 사이트 전반에서 같은 것을 뜻함.
  • 네임스페이스 / 발행(namespace / minting) — 지역 식별자를 전역적으로 만드는 접두어, 그리고 안정적이고 재사용되지 않는 식별자를 만드는 규율.
  • owl:sameAs — 두 IRI가 동일한 개체를 가리킨다는 강한 주장으로, 그들의 모든 사실을 융합함. 강력하지만 쉽게 오용됨("sameAs 문제").
  • skos:exactMatch / closeMatch — 두 용어가 개체로서 동일하다고 주장하지 않으면서 들어맞음을 기록하는 더 부드러운 연결. 그래서 잘못된 매칭이 그래프를 망가뜨리는 대신 매핑을 저하시키는 데 그침.
  • 타입 지정 리터럴 / 데이터타입(typed literal / datatype) — 값을 데이터타입 IRI(xsd:float)와 짝지어 기계가 그것을 텍스트가 아니라 숫자, 날짜, 코드로 파싱하게 하는 것.
  • QUDT — 수량·단위·차원·타입(Quantities, Units, Dimensions and Types) 어휘. 값이 단위(unit)수량 종류(quantity kind)를 문자열 접미어가 아니라 기계가 읽을 수 있는 IRI로 지니게 함.
  • UCUM — 통합 측정 단위 코드(Unified Code for Units of Measure). 소프트웨어 전반에서 모호하지 않도록 설계된 대소문자 구분 단위 코드로, 실험실과 임상 교환에 널리 쓰임.
  • 수량 종류 대 단위(quantity kind vs unit) — 값이 어떤 종류의 수량인지(온도, 질량 농도, 무차원 비율)와, 그것이 표현되는 구체적인 단위.
  • 개체 해소 / 화해(entity resolution / reconciliation) — 서로 다른 이름의 기록들이 같은 실제 대상을 가리킨다고 판단하는 일. 레거시 시스템 전반에서는 여전히 대체로 수작업이며, 정체성의 풀리지 않은 절반.
  • FAIR F1 / I — 데이터가 전역적으로 유일하고 영속적인 식별자를 지니고(찾을 수 있음), 한정되고 단위를 지닌 값과 함께 공유 어휘를 사용한다(상호운용 가능)는 원칙들.

다음 이야기

1부가 완성되었습니다. 우리는 상위 척추, 클래스와 공리를 저작하는 기술, 그리고 이름을 전역적으로 값을 스스로 기술하게 유지하는 정체성과 단위 규율을 갖추었습니다. 이제 그 도구 일체를 공정으로 겨눌 준비가 되었습니다. 2부는 의약품 자체가 시작되는 곳에서 — 탱크가 아니라 하나의 아이디어에서 — 시작합니다. 다음 장 표적과 제품 개념 모델링은 한 프로그램의 맨 처음 개체들에 이름을 붙입니다. 질병 표적, 작용 기전(mechanism of action), 그리고 제품 개념입니다. 그리고 (유전자, 단백질, 질병을 위한) 확립된 생의학 온톨로지에 손을 뻗는다는 것이, 어떻게 모델을 마지막 날이 아니라 첫날부터 상호운용 가능하게 만드는지를 보여 줍니다.