G·Graph Daily Lab 전체 140회
추가 15 / 40 · 보충 · 약 12분

빈 노드와 리터럴 데이터타입

IRI 없이 쓰는 빈 노드와, 같은 숫자라도 타입에 따라 비교 결과가 달라지는 리터럴을 봅니다.

RDF와 SPARQL

배운 뒤 돌아올 회차

DAY 36·37에서 트리플과 IRI를 배운 뒤, 이름 없는 대상과 값의 타입 때문에 생기는 실수를 다루러 옵니다.

시작하면 직접 풀기와 퀴즈 기록이 저장됩니다. 본과정 100회 진도와는 별도입니다.

이번에 더 배울 것

빈 노드(blank node)는 전역 IRI 없이 쓰는 자원입니다. Turtle에서는 _:addr1처럼 쓰거나 대괄호 [ ... ] 안에 속성을 바로 적습니다. 주소처럼 바깥에서 따로 가리킬 일이 없는 구조에 편합니다. 다만 _:addr1이라는 이름은 그 문서 안에서만 의미가 있어, 두 파일의 _:b1은 같은 대상이 아니며 외부에서 링크하거나 정확히 지목해 고치기도 어렵습니다.

리터럴은 글자 형태와 데이터타입 IRI로 이루어집니다. "29"^^xsd:integer는 정수 29이고, 그냥 "29"는 문자열입니다. Turtle에서는 따옴표 없는 29가 xsd:integer, 4.5가 xsd:decimal, true가 xsd:boolean으로 읽힙니다. "대전"@ko처럼 언어 태그를 붙인 문자열은 rdf:langString 타입입니다.

타입이 다르면 비교와 정렬이 달라집니다. 문자열로는 "100"이 "29"보다 앞에 오고(첫 글자 1이 2보다 앞), 정수로는 29가 100보다 작습니다. SPARQL에서 FILTER(?age > 30)을 문자열 나이에 적용하면 비교가 타입 오류가 되어 그 해가 걸러집니다. 반대로 우편번호처럼 앞자리 0을 지켜야 하는 값은 문자열이 맞습니다. 타입은 값의 쓰임을 보고 고릅니다.

작은 예제로 따라가기

1

@prefix ex: <http://example.org/> . ex:minsu ex:address [ ex:city "대전" ; ex:zip "34141" ] .은 빈 노드 1개와 트리플 3개(민수→빈 노드, 빈 노드→city, 빈 노드→zip)를 만듭니다.

2

같은 접두사 아래에서 ex:minsu ex:age 29 .의 29는 "29"^^xsd:integer이고, ex:minsu ex:age "29" .의 "29"는 xsd:string입니다.

3

문자열 정렬에서는 "100"이 "29"보다 앞이고, 정수 정렬에서는 29가 100보다 앞입니다.

COMPARE & EXPLAIN

같은 숫자, 다른 타입

민수 31, 지아 45, 서준 27의 나이에 FILTER(?age > 30)을 걸 때, 각 조건에서 누가 남을지 먼저 예상하세요.

민수·지아 2명

정수끼리 비교되어 31과 45가 30보다 큽니다.

빈 노드는 문서 안에서만 쓰는 이름이고, 리터럴의 데이터타입은 비교·정렬 결과를 바꾸므로 의도적으로 고릅니다.

학습을 시작하면 새 문제를 직접 풀고 확인 퀴즈를 마친 뒤 선택한 본과정 회차로 돌아갑니다.