Data Catalog Vocabulary (version 2)
DCAT은 웹에 공개된 data catalog들 사이의 교류를 용이하기 위해 만들어진 RDF vocabulary이다.
즉. data catalog를 적는 표준이다.
what is catalog?
dataset과 data service에 대한 metadata의 집합이다.
what is dataset and what is data service?
해당 내용은 하단에서 설명 (dataset은 실제 정보의 집합이고, data service는 데이터를 제공하는 service이다. 예를 들면, 공공 API)
W3C의 Data Exchange WG에서 표준화를 진행중
RDF를 기반으로 한다.
DCAT의 namespace는 http://www.w3.org/ns/dcat# 입니다. 그리고, DCAT은 다른 vocabulary들의 용어도 포함합니다.
DCAT은 data catalog(최종 사용자에게 제공되는 데이터 셋 및 서비스의 목록)을 표현하기 위한 RDF vocabulary이다.
6개의 main class로 이루어진다.
dcat:Catalog
dcat:Resource
dcat:Dataset
dcat:Distribution
dcat:DataService
dcat:CatalogRecord
- catalog 안의 metadata item(item 추가자와 일시와 같은 등록 정보가 주를 이룬다.)을 표현한다.
⭐ dataset vs distribution vs data service
⭐ Data service
data service는 dataset을 이용한 selection, extraction, combination, processing or transformation과 같은 기능을 제공한다. (원격이든, 로컬이든)
data service에 대한 요청의 결과는 전체 또는 일부의 dataset or catalog의 형태를 띈다.
data service는 특정 dataset에 묵여있거나, 이것의 source data는 요청 시 또는 실행 중에 구성될 수 있다.
data distribution service는 dataset 또는 subset의 distribution의 다운로드와 조회를 허락한다.
data discovery service는 적당한 dataset을 발견할 수 있게 한다.
transformation을 포함한 다른 종류의 data service도 그런 식으로 동작한다.
data service는 UI적 요소를 포함할 수 있지만, 이것에 대한 부분은 DCAT 범주 밖이다.
하지만, 특정 dataservice endpoint의 세부사항은 DCAT의 standard service type을 따르게 기술되어진다.
⭐ Catalog record는 catalog 안의 item의 등록을 기술한다.
이는 부가사항으로 고려된다. catalog 안의 item의 진입점에 대한 기원정보를 붙잡는데 사용된다.
DCAT의 vocabulary는 RDF-S를 사용하여 형식을 맞춘 OWL2 ontology이다. 각 각의 class와 property는 IRI 형태로 기록된다. 내부에서 정의된 요소는 namespace는 http://www.w3.org/ns/dcat# 에 속한다. 또한, FOAF, DCTERMS, PROV-O와 같은 외부 vocabulary도 포함한다.
RDF는 blank node 또는 IRI로 resource를 가진다.
Blank node는 IRI 없이 resource를 기록하는 방식이다. 이는 triple의 subject와 object 위치에 존재할 수 있다. 예를 들어, 여러 DCAT catalog에서, distribution은 연관된 dataset의 표현에서 자유롭기 위해 blank node를 사용한다. blank node가 어떤 use case에서 유연함을 제공하는 반면에, 이는 데이터의 정보를 협력적으로 만드는 우리의 능력을 제한한다. blank node의 자원은 연결을 목적으로 하지 않아서 새로운 요소에 대한 새로운 정보를 표시할 수 없다.
연결된 데이터 방식의 최고의 장점 중의 하나는 "anyone can say anything anywhere"이다. 하지만, blank node는 이러한 장점을 갉아먹는다. 심지어 하나의 application이라는 닫혀진 공간에서도 새로운 데이터의 통합을 제한하는 상황을 만들기도 한다. 이러한 이유 때문에, DCAT의 main classs의 instance는 IRI 형태이며, blank node의 사용은 DCAT에서는 지양된다.
아래에 제시된 RDF의 예시는 거의 다 Turtle syntax로 작성되었다.
자연어의 복잡한 텍스트 형태로 쓰여진 RDF graph를 datatype과 pattern을 생략 사용하여 표현하는 RDF 문법을 말한다.
Example
RELATIONSHEEP between Green Goblin and Spiderman.
@base <http://example.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rel: <http://www.perceive.net/schemas/relationship/> .
<#green-goblin>
rel:enemyOf <#spiderman> ;
a foaf:Person ; # in the context of the Marvel universe
foaf:name "Green Goblin" .
<#spiderman>
rel:enemyOf <#green-goblin> ;
a foaf:Person ;
foaf:name "Spiderman", "Человек-паук"@ru .
기초 문법
주석을 표현할 때에는 #을 이용하고, 해당 라인은 모두 주석처리 된다.
triple은 기본적으로 [subject] [predicate] [object] .
의 형태를 띈다.
각 요소 사이의 공백 문자와 triple의 종료 시점에는 . 을 이용하여 이를 표기한다.
<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enermyOf> <http://example.org/#green-goblin>
종종 동일한 subject가 다양한 predicate를 요구할 때가 있다. 이럴 경우는 문장의 끝을 .
이 아닌 ;
으로 표기하면, 동일한 subject를 이용하는 triple이 이어짐을 명시할 수 있다.
따라서, 아래 나오는 두 예시는 모두 동일한 내용을 말한다.
# predicate list 사용
<http://example.org/#spiderman>
<http://www.perceive.net/schemas/relationship/enemyOf> <http://example.org/#green-goblin> ;
<http://xmlns.com/foaf/0.1/name> "Spiderman" .
# predicate list 사용 x
<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enemyOf> <http://example.org/#green-goblin> .
<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Spiderman" .
종종 동일한 subject와 predicate에 대하여 동일한 object를 필요로 할 때가 있다. 이때는 ,
를 통해서 이를 표현해주는 것이 가능하다.
따라서, 아래 나오는 두 예시는 모두 동일한 내용을 말한다.
# object list 사용
<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Spiderman", "Человек-паук"@ru .
# object list 사용 x
<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Spiderman" .
<http://example.org/#spiderman> <http://xmlns.com/foaf/0.1/name> "Человек-паук"@ru .
변수
상대 or 절대 경로 or Prefix 이름을 통해서 표기됩니다.
상대 or 절대 경로 : <[IRI]>
의 형태로 표현합니다. 유니코드를 표현하기 위해 numeric escape sequence를 사용하기도 합니다.
절대경로 : <http://example.org/#green-goblin>
상대경로 : <#green-goblin>
# 현재 base IRI를 기준으로 IRI를 완성합니다.
# 만약, base를 임의로 지정해주고 싶다면, @base or Base를 이용하여 이를 지정해주는 것이 가능합니다.
prefix를 이용한 표기 : 선언부와 사용부 두 단계로 나뉘어집니다. 먼저, 문서 초반에 사용할 prefix에 대한 정의를 한 후, 이를 해당 파일 내에서 불러와 사용하는 것이 가능합니다.
위의 예시에서 길게 표현하였던, green goblin의 적이 spiderman이라는 내용을 짧게 표현하는 것이 가능합니다.
여기서, @prefix를 PREFIX 라고 적어도 무방합니다. ← SPARQL 문법
# somePrefix에 해당 IRI를 지정합니다.
@prefix somePrefix: <http://www.perceive.net/schemas/relationship/> .
# somePrefix에 enermyOf라는 IRI를 가르킨다는 것을 표현합니다.
<http://example.org/#green-goblin> somePrefix:enemyOf <http://example.org/#spiderman> .
이를 이용한 다양한 예제
# A triple with all absolute IRIs
<http://one.example/subject1> <http://one.example/predicate1> <http://one.example/object1> .
@base <http://one.example/> .
<subject2> <predicate2> <object2> . # relative IRIs, e.g. http://one.example/subject2
BASE <http://one.example/>
<subject2> <predicate2> <object2> . # relative IRIs, e.g. http://one.example/subject2
@prefix p: <http://two.example/> .
p:subject3 p:predicate3 p:object3 . # prefixed name, e.g. http://two.example/subject3
PREFIX p: <http://two.example/>
p:subject3 p:predicate3 p:object3 . # prefixed name, e.g. http://two.example/subject3
@prefix p: <path/> . # prefix p: now stands for http://one.example/path/
p:subject4 p:predicate4 p:object4 . # prefixed name, e.g. http://one.example/path/subject4
@prefix : <http://another.example/> . # empty prefix
:subject5 :predicate5 :object5 . # prefixed name, e.g. http://another.example/subject5
:subject6 a :subject7 . # same as :subject6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> :subject7 .
string, number, date와 같은 데이터를 표현하는데 사용됩니다.
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
<http://example.org/#green-goblin> foaf:name "Green Goblin" .
<http://example.org/#spiderman> foaf:name "Spiderman" .
그 중에서 좀 특별한 형태를 가지는 것을 알아보면 다음 셋 중 하나이다.
Quoted Literals : 이는 언어 태그나 datatype에 대한 태그 또는 둘 다 없는 형태로 표기됩니다.
"
으로 감싸져서 표기됩니다. (LF, RF같은 문자는 허용하지 않습니다.) 감싸진 내용에는 character와 numeric, string escape sequence가 허용됩니다.@
를 이용하여 언어를 명시합니다. 만약 언어 태그가 없다면, ^^
를 이용하여 datatype을 명시합니다. 이 datatype은 IRI의 값만 받을 수 있으며, @
와 ^^
모두 표기 되지 않았다면, 뒤에 ^^xsd:string
의 함축형으로 이해합니다.@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix show: <http://example.org/vocab/show/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
show:218 rdfs:label "That Seventies Show"^^xsd:string . # literal with XML Schema string datatype
show:218 rdfs:label "That Seventies Show"^^<http://www.w3.org/2001/XMLSchema#string> . # same as above
show:218 rdfs:label "That Seventies Show" . # same again
show:218 show:localName "That Seventies Show"@en . # literal with a language tag
show:218 show:localName 'Cette Série des Années Soixante-dix'@fr . # literal delimited by single quote
show:218 show:localName "Cette Série des Années Septante"@fr-be . # literal with a region subtag
show:218 show:blurb '''This is a multi-line # literal with embedded new lines and quotes
literal with many quotes (""""")
and up to two sequential apostrophes ('').''' .
Numbers
어떤 숫자든 표기할 때에는 ^^xsd:decimal
을 사용하지만, 기본적으로 아무것도 없을 때에는 정규표현식(regexp)에 따라서 datatype을 함축한다.
[Number 표기법]
@prefix : <http://example.org/elements> .
<http://en.wikipedia.org/wiki/Helium>
:atomicNumber 2 ; # xsd:integer
:atomicMass 4.002602 ; # xsd:decimal
:specificGravity 1.663E-4 . # xsd:double
Booleans
true
or false
의 형태로 주어지는 값이다.
@prefix : <http://example.org/stats> .
<http://somecountry.example/census2007>
:isLandlocked false . # xsd:boolean
공백 node는 _:
로 표기합니다. :
뒤에는 character sequence 값의 label을 붙일 수 있습니다. 동일한 label을 붙이면 동일한 blank node로 인식합니다.
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:alice foaf:knows _:bob .
_:bob foaf:knows _:alice .
blank node의 중첩을 통해서 관계를 표현할 수도 있다. 이 때 predicate와 object로 이루어진 하나의 object를 표현함으로서 이 과정이 가능해진다. 따라서 중첩의 형태는 [ predicate [ predicate object ]; ... ]
를 통해서 표현된다.
따라서, 다음 두 표현은 서로 동일하다.
_:a <http://xmlns.com/foaf/0.1/name> "Alice" .
_:a <http://xmlns.com/foaf/0.1/knows> _:b .
_:b <http://xmlns.com/foaf/0.1/name> "Bob" .
_:b <http://xmlns.com/foaf/0.1/knows> _:c .
_:c <http://xmlns.com/foaf/0.1/name> "Eve" .
_:b <http://xmlns.com/foaf/0.1/mbox> <bob@example.com> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
[ foaf:name "Alice" ] foaf:knows [
foaf:name "Bob" ;
foaf:knows [
foaf:name "Eve" ] ;
foaf:mbox <bob@example.com> ] .
의미 : 이름이 "Alice"인 사람은 이름이 "Bob"이고, "Eve"라는 사람을 알며, 이메일은 "bob@example.com" 인 사람을 안다.
RDF node의 리스트 구조이다. 기본적으로 ([contents])
으로 표기한다. 여기서 empty도 허용하기 때문에 ()
역시 가능하다.
collection은 subject와 object에만 사용이 가능하다.
@prefix : <http://example.org/foo> .
# the object of this triple is the RDF collection blank node
:subject :predicate ( :a :b :c ) .
# an empty collection value - rdf:nil
:subject :predicate2 () .