DCAT v2

Data Catalog Vocabulary (version 2)

Definition

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를 기반으로 한다.

Advantage

  1. 여러 데이터 카탈로그에 대한 메타데이터 연계 활용을 용이하게 지원
  2. 웹 상에서 데이터에 대한 수집과 검색을 지원
  3. 다양하고, 분산된 데이터를 데이터 목록을 중심으로 쉽게 접근할 수 있도록 지원
  4. 동일한 쿼리와 구조로 다양한 데이터에 접근할 수 있는 기능 제공

Namespace

DCAT의 namespace는 http://www.w3.org/ns/dcat# 입니다. 그리고, DCAT은 다른 vocabulary들의 용어도 포함합니다.

Scope

DCAT은 data catalog(최종 사용자에게 제공되는 데이터 셋 및 서비스의 목록)을 표현하기 위한 RDF vocabulary이다.

  • 6개의 main class로 이루어진다.

    • dcat:Catalog

      • catalog(하나 당 여러 resource를 설명하는 metadata record에 대한 dataset)를 표현합니다.
      • dataset과 data service에 대한 metadata를 수집합니다.
    • dcat:Resource

      • datase, data service 또는 다른 resource(catalog안에 metadata record에 의해 설명됨.)를 표현합니다.
      • 해당 class는 직접적으로 사용되지는 않지만, dcat:Dataset, dcat:DataService, dcat:Catalog의 부모로 존재합니다.
      • catalog에 속하는 member들은 DCAT profile 또는 다른 DCAT application에 정의된 sub-class이거나, sub-class 중에 하나이거나, data:Resource의 sub-class에 속한다.
      • dacat:Resource는 어떤 resource의 catalog라도 정의할 수 있는 효율적인 확장 지점이다.
    • dcat:Dataset

      • dataset(하나의 agent에 의해 관리되는 data의 집합)를 표현합니다.
      • data는 number, word, pixel, image, sound, multi-media, etc...를 표현할 수 있습니다.
    • dcat:Distribution

      • 다운로드할 수 있는 file과 같은 dataset의 접근 형태를 표현합니다.
    • dcat:DataService

      • dataservice(하나 이상의 dataset 또는 data 처리 함수에 대한 접근을 제공하는 API를 통해서 접근할 수 있는 operation들의 집합)를 표현합니다.
    • dcat:CatalogRecord
      - catalog 안의 metadata item(item 추가자와 일시와 같은 등록 정보가 주를 이룬다.)을 표현한다.

⭐ dataset vs distribution vs data service

  1. dataset = 단일 agent에 의해 관리되는 데이터의 집합이며, 이는 하나 이상의 직렬화 또는 format으로 접근 또는 다운로드가 가능해야 한다. 이는 개념적인 형태이며, 이는 하나 이상의 distribution에 의해서 표현된다.
  2. distribution = dataset을 이동하기 위해 직렬화한 형태이다.
  3. data service = distribution을 제공할 수 있다.

⭐ 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의 진입점에 대한 기원정보를 붙잡는데 사용된다.

RDF 작성 시 고려사항

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로 작성되었다.

Turtle

자연어의 복잡한 텍스트 형태로 쓰여진 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 .
    • green goblin은 spiderman의 적이며, 사람이고, 이름이 Green Goblin이다.
    • spider man은 green goblin의 적이며, 사람이고, 이름이 Spiderman이다.

기초 문법

주석

주석을 표현할 때에는 #을 이용하고, 해당 라인은 모두 주석처리 된다.

Simple Triples

triple은 기본적으로 [subject] [predicate] [object] . 의 형태를 띈다.

각 요소 사이의 공백 문자와 triple의 종료 시점에는 . 을 이용하여 이를 표기한다.

<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enermyOf> <http://example.org/#green-goblin> 

Predicate Lists

종종 동일한 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" .

Object Lists

종종 동일한 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 .

변수

IRIs

상대 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 .

Literals

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" .

그 중에서 좀 특별한 형태를 가지는 것을 알아보면 다음 셋 중 하나이다.

  1. Quoted Literals : 이는 언어 태그나 datatype에 대한 태그 또는 둘 다 없는 형태로 표기됩니다.

    • 기본적으로 string은 " 으로 감싸져서 표기됩니다. (LF, RF같은 문자는 허용하지 않습니다.) 감싸진 내용에는 character와 numeric, string escape sequence가 허용됩니다.
    • 해당 과정으로 생성된 후에는 @ 를 이용하여 언어를 명시합니다. 만약 언어 태그가 없다면, ^^ 를 이용하여 datatype을 명시합니다. 이 datatype은 IRI의 값만 받을 수 있으며, @^^ 모두 표기 되지 않았다면, 뒤에 ^^xsd:string 의 함축형으로 이해합니다.
    • multi line의 입력인 경우에는 ''', """을 이용하여 표기합니다.
    @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 ('').''' .
  2. 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
  3. Booleans

    true or false 의 형태로 주어지는 값이다.

    @prefix : <http://example.org/stats> .
    <http://somecountry.example/census2007>
        :isLandlocked false .           # xsd:boolean

RDF Blank Nodes

공백 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 중첩

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> <[email protected]> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

[ foaf:name "Alice" ] foaf:knows [
    foaf:name "Bob" ;
    foaf:knows [
        foaf:name "Eve" ] ;
    foaf:mbox <[email protected]> ] .

의미 : 이름이 "Alice"인 사람은 이름이 "Bob"이고, "Eve"라는 사람을 알며, 이메일은 "[email protected]" 인 사람을 안다.

Collections

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 () .

좋은 웹페이지 즐겨찾기