[RDF Primer]W3C Proposed Recommendation-3

3. RDF의 XML 구문 : RDF/XML

제2절에서 설명한 바와 같이 RDF의 개념모델은 그래프이다.  RDF에서는 RDF 그래프를 작성하고 교환하기 위하여 RDF/XML이라고 하는 XML 구문을 제공하고 있다.  단축표기로서의 역할을 하는 트리플과 달리 RDF/XML은 RDF를 작성하기 위한 규범적인 구문이다.  RDF/XML은 RDF/XML Syntax Specification[rdf-syntax]에 정의되어 있다.  이 절에서는 이 RDF/XML을 다룬다.


RDF/XML 구문의 배경을 이루는 기본 개념을 이미 제시한 예 중에서 일부를 사용하여 예시할 수 있다.  영어로 된 선언문을 예로 들어보자:

 

http://www.example.org/index.html has a creation-date whose value is August 16, 1999

 

creation-date 성질에 URIref를 배정한 다음, 이 하나의 선언문에 대한 RDF 그래프는 <그림 11>과 같다:


<그림 11>: 웹 페이지의 작성일자 기술

이를 트리플로 표현하면 다음과 같다:


ex:index.html   exterms:creation-date   "August 16, 1999" .


(이 예에서는 date의 값으로 유형화된 리터럴을 사용하지 않았음을 유의할 필요가 있다.  RDF/XML에서 유형화된 리터럴을 표현하는 방법은 이 절 후반부에서 다룰 것이다).


예 2에서는 <그림 11>의 그래프에 대응되는 RDF/XML 구문을 보여주고 있다.


예 2: 웹 페이지의 작성일자에 대한 RDF/XML



<?xml version="1.0"?>

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

             xmlns:exterms="http://www.example.org/terms/">


   <rdf:Description rdf:about="http://www.example.org/index.html">

      <exterms:creation-date>August 16, 1999</exterms:creation-date>

   </rdf:Description>


</rdf:RDF>




(행번호는 이 예를 설명하는데 도움을 주기 위해 붙인 것이다).


이것은 부수적인 업무를 많이 필요로 하는 것처럼 보인다.  이 XML의 각 부분을 차례대로 검토함으로써 무엇이 진행되고 있는지를 이해하는 것이 훨씬 쉬울 것이다 (XML에 대한 간략한 소개는 부록 B에 제시되어 있다).


1행의 <?xml version="1.0"?>은 XML 선언부(XML declaration)로서, 다음의 컨텐츠가 XML이고 XML의 어느 버전이 사용되었는지를 나타낸다.


2 행에서는 rdf:RDF 요소를 시작하고 있다.  이것은 다음에 오는 XML 컨텐츠(이 행에서 시작하여 7행의 </rdf:RDF>로 끝난다)가 RDF를 표현하기 위한 것임을 의미한다.  같은 행의 rdf:RDF 다음에는 rdf:RDF 시작태그의 xmlns 속성으로 표현된 XML 이름공간 선언부가 온다.  이 선언부에서는 이 컨텐츠에서 rdf:라는 접두어를 가진 모든 태그는 URIref http://www.w3.org/1999/02/

22-rdf-syntax-ns#로 식별되는 이름공간의 일부라는 점을 명시한 것이다.  http://www.w3.org/1999/02/22-rdf-syntax-ns#라는 문자열로 시작되는 URIref는 RDF 어휘에 있는 용어에 대해 사용된다.


3행에서는 또 다른 XML 이름공간 선언부를 명기하면서 이번에는 접두사 exterms:을 사용하였다.  이것은 rdf:RDF 요소의 또 다른 xmlns 속성으로 표현되어 있고, 이름공간 URIref http://www.example.org/terms/가 접두사 exterms:와 연결된다는 것을 명시한 것이다.  http://www.example.org/terms/ 라는 문자열로 시작되는 URIref는 예로 든 기관인 example.org에서 정의한 어휘의 용어에 대해 사용된다.  3행의 마지막에 있는 ">"는 rdf:RDF 시작태그의 끝을 표시한 것이다.  1행에서 3행까지는 이것이 RDF/XML 컨텐츠이고, 아울러 RDF/XML 컨텐츠에서 사용된 이름공간을 식별하기 위해 필요한 일반적인 “관리” 용 정보이다.


4행에서 6행까지는 <그림 11>에 제시된 특정 선언문에 대한 RDF/XML을 제시하고 있다.  어떤 RDF 선언문에 관해 확실하게 말하는 방법은 이 선언문이 기술(description)이며, 이 선언문의 주어에 관한(about) 것이며 (이 경우http://www.example.org/index.html에 관하여), 이것이 RDF/XML에서 선언문을 표현하는 방식이라고 말하는 것이다.  4행의 rdf:Description 시작태그는 자원의 기술(description)의 시작임을 알리는 것이며, rdf:about 속성을 사용하여 주어인 자원의 URIref를 지정함으로써 그 선언문이 무엇에 관한(선언문의 주어) 자원인지를 식별하게 된다.  5행에서는 선언문의 술어와 목적어를 표현하기 위하여 QName인 exterms:creation-date를 태그로 한 성질 요소(property element)를 제시한 것이다.  로컬명인 creation-date를 exterms:의 URIref에 추가해서 접두사(http://www.example.org/terms/) 가 선언문의 술어 URIref인 http://www.example.org/terms/creation-date를 만들 수 있도록 QName인 exterms:creation-date를 선택하였다.  이 성질요소의 컨텐츠는 선언문의 목적어로서, 일반 리터럴인 August 19, 1999(주어인 자원의 creation-date 성질의 값) 이다.  이 성질요소는 이를 포괄하는 rdf:Description 요소 내에 포함되어, rdf:Description 요소의 rdf:about 속성으로 지정된 자원에 이 성질이 적용되고 있음을 제시한 것이다.  6행은 이 특정한 rdf:Description 요소의 끝을 나타낸 것이다.


마 지막으로 7행은 2행에서 시작된 rdf:RDF 요소의 끝을 나타낸다.  Rdf:RDF 요소를 사용하여 RDF/XML 컨텐츠를 포함하는 것은 XML이 맥락에 따라 RDF/XML로 식별될 수 있는 상황에서는 선택적으로 사용된다.  이것은 [RDF-SYNTAX]에서 더욱 상세히 다루고 있다.  그러나 어떤 경우에든 rdf:RDF 요소를 제공하는 데에 손상을 주지 않으며, 입문서의 예에서는 일반적으로 (항상 그런 것은 아니나) 그 요소를 제공할 것이다.


예 2에서는 RDF 그래프를 XML 요소와 속성, 요소 컨텐츠, 속성 값으로 부호화하기 위하여 RDF/XML에서 사용한 기본개념을 예시하고 있다.  술어 URIref(일부 노드와 함께)는 XML QName으로 작성되는데, 이 QName은 부록 B에서 설명한 바와 같이, 이름공간으로 한정된 요소나 속성을 의미하는 로컬명(local name)과 함께 이름공간 URI를 의미하는 간략한 접두사(prefix) 로 구성되어 있다.  이 쌍(이름공간 URIref와 로컬명)을 선택하게 되면 이들을 연결하게 되어 원래의 노드나 술어 URIref를 만들게 된다. 주어 노드의 URIref는 XML 속성 값으로 작성된다(목적어 노드의 URIref도 때로는 속성 값으로 작성되기도 한다).  리터럴 노드(이것은 항상 목적어 노드이다)는 요소 텍스트 컨텐츠나 속성 값이 된다(이들 선택사항 가운데 대부분이 본서의 후반부에 설명되어 있으며, 전체 선택사항에 대해서는[RDF-SYNTAX]에서 설명하고 있다).


복수의 선언문으로 구성된 RDF 그래프에서 각 선언문을 별도로 표현하기 위하여 예 2의 4-6행과 비슷한 RDF/XML을 사용해서 RDF/XML로 표현할 수 있다.  예를 들면 다음 두 개의 선언문을 작성하는 경우:


ex:index.html   exterms:creation-date      "August 16, 1999" .

ex:index.html   dc:language                 "en" .


RDF/XML을 예 3에서와 같이 사용할 수 있다:


예 3: 두 개의 선언문에 대한 RDF/XML



<?xml version="1.0"?>

  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

              xmlns:dc="http://purl.org/dc/elements/1.1/"

              xmlns:exterms="http://www.example.org/terms/">


    <rdf:Description rdf:about="http://www.example.org/index.html">

        <exterms:creation-date>August 16, 1999</exterms:creation-date>

    </rdf:Description>


    <rdf:Description rdf:about="http://www.example.org/index.html">

        <dc:language>en</dc:language>

   </rdf:Description>


</rdf:RDF>


 


예 3예2와 동일한데, 다만 두 번째 선언문을 표현하기 위하여 두 번째 rdf:Description 요소(8-10행에)가 추가되었다(아울러 이 선언문에 추가로 사용된  이름공간을 식별하기 위하여 이름공간 선언부가 3행에 추가되었다). 추가된 각 선언문에 대해 별도의 rdf:Description 요소를 사용하는 방식으로, 원하는 수만큼의 추가 선언문을 작성할 수 있다.  예 3에서 보는 바와 같이, 일단 XML과 이름공간 선언부를 작성하는 업무를 처리하고 나면, RDF/XML에 추가되는 각각의 RDF 선언문을 작성하는 것은 쉬우면서 그다지 복잡하지도 않다.


RDF/XML 구문에서는 쉽게 작성할 수 있도록 공통으로 사용되는 여러 가지 약어를 제공하고 있다.  예를 들어 자원인 ex:index.html이 여러 선언문의 주어로 되어 있는 예 3에 서와 같이, 동일한 자원을 다수의 성질과 값으로 동시에 기술하는 것이 보통이다.  이와 같은 사례를 처리하기 위하여 RDF/XML에서는 주어인 자원을 식별하는 rdf:Description 요소 내에 이들 성질을 표현하는 다수의 성질 요소를 전입할 수 있다.  예를 들면 http://www.example.org/index.html에 관하여 다음과 같은 일단의 선언문을 표현하는 경우,


ex:index.html   dc:creator                     exstaff:85740 .

ex:index.html   exterms:creation-date      "August 16, 1999" .

ex:index.html   dc:language                 "en" .


이 그래프(<그림3>과 동일)는 <그림 12>와 같다:


<그림 12>: 동일 자원에 관한 복수의 선언문


RDF/XML을 예 4와 같이 작성할 수 있다:


예 4: 복수의 성질 단축형



<?xml version="1.0"?>

  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

              xmlns:dc="http://purl.org/dc/elements/1.1/"

              xmlns:exterms="http://www.example.org/terms/">


    <rdf:Description rdf:about="http://www.example.org/index.html">

     <exterms:creation-date>August 16, 1999</exterms:creation-date>

     <dc:language>en</dc:language>

     <dc:creator rdf:resource="http://www.example.org/staffid/85740"/>

    </rdf:Description>


</rdf:RDF>



앞의 두개의 예와 비교해 보면 예 4에서는 dc:creator 성질 요소가 추가되었다 (8행에).  게다가 각 선언문에 대해 별도의 rdf:Description 요소를 작성하는 대신,  http://www.example.org/index.html를 주어로 인식하는 하나의 rdf:Description 요소 내에 이 주어를 지닌 세 개의 성질에 대한 성질 요소를 전입하였다.


아울러 8행에서는 새로운 형식의 성질 요소를 도입하고 있다.  7행의 dc:language 요소는 예 2에 사용된 exterms:creation-date 요소와 유사하다.  이 두 개의 요소는 일반 리터럴을 성질 값으로 가진 성질을 표현한 것으로, 그 성질명에 대응되는 시작태그와 종료태그 안에 리터럴을 싸서 이들 요소를 표현하게 된다.


그러나 8행의 dc:creator 요소는 리터럴이 아닌 다른 자원(another resource) 을  값으로 지닌 성질을 표현한 것이다.  만약 이 자원의 URIref를 다른 요소의 리터럴 값과 동일한 방식으로 시작태그와 종료태그 사이의 일반 리터럴로 기재한 경우에는 이 dc:creator 요소의 값은 URIref로 해석되는 그 리터럴로 식별되는 자원이 아니라 http://www.example.org/staffid/85740이라는 문자열임을 말한다.  이러한 차이를 제시하기 위하여 XML에서는 공백요소 태그(empty-element tag: 별도의 종료태그가 없다)를 사용하여 dc:creator 요소를 작성하며, 이 공백요소 내의 rdf:resource 속성을 사용하여 그 성질 값을 작성하게 된다.  rdf:resource 속성은 성질 요소의 값이 URIref로 식별되는 다른 자원임을 의미한다.  URIref가 속성 값(value)으로 사용되기 때문에, 요소와속성 명(names)을 작성할 때처럼 URIref를 QName으로 축약하지 않고 URIref 전체를 다 기재하도록(절대 URIref나 상대 URIref로) RDF/XML에서는 요구하고 있다(절대 URIref와 상대 URIref에 대해서는 부록 A에서 설명하고 있다).


예 4의 RDF/XML이 간략형(abbreviation)이라는 것을 이해하는 것이 중요하다.  각 선언문을 별도로 작성한 예 5의 RDF/XML에서는 이와 동일한 RDF 그래프를 정확하게 기술하고 있다(<그림 12>의 그래프):


예 5: 별개의 선언문으로 예 4의 작성



<?xml version="1.0"?>


<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

             xmlns:dc="http://purl.org/dc/elements/1.1/"

             xmlns:exterms="http://www.example.org/terms/">


  <rdf:Description rdf:about="http://www.example.org/index.html">

        <exterms:creation-date>August 16, 1999</exterms:creation-date>

  </rdf:Description>


  <rdf:Description rdf:about="http://www.example.org/index.html">

        <dc:language>en</dc:language>

  </rdf:Description>


  <rdf:Description rdf:about="http://www.example.org/index.html">

  <dc:creator rdf:resource="http://www.example.org/staffid/85740"/>

        </rdf:Description>


</rdf:RDF>




다음 절에서는 RDF/XML의 간략형을 몇 가지 추가로 기술하게 될 것이다.  사용할 수 있는 간략형에 대한 상세한 기술은 [rdf-syntax]를 참고할 필요가 있다.


또 RDF/XML에서는 URIref가 없는 노드, 즉 2.3에서 설명한 바와 같은 공백노드(blank node)를 포함한 그래프도 표현할 수 있다.  예를 들어 ([rdf-syntax]에서 취한) <그림 13>에서 “'http://www.w3.org/TR/rdf-syntax-grammar'라는 문서는 'RDF/XML Syntax Specification (Revised)'이라는 표제와 편자가 있고, 편자의 이름은 'Dave Beckett'이며, 홈페이지는 'http://purl.org/net /dajobe/'이다”라는 그래프를 보여주고 있다:



<그림 13>: 공백노드를 포함한 그래프


이 그림은 2.3절에서 설명한 개념을 예시한 것으로, URIref는 없으나 다른 정보로 기술될 수 있는 어떤 것을 표현하기 위하여 공백 노드를 사용하는 것이다.  이 경우 공백노드는 이 문서의 편자인 사람을 표현하고 있고, 그 사람은 그의 이름과 홈페이지로 기술되어 있다.


RDF/XML에서는 공백노드가 포함된 그래프를 여러 가지 방법으로 표현한다.  이 방법에 대해서는 [rdf-syntax]에서 모두 설명하고 있다.  여기서 제시한 것은 가장 직접적인 방법으로서, 개개의 공백노드에 공백노드 식별기호(blank node identifier) 를 부여하는 것이다.  공백노드 식별기호는 특정한 RDF/XML 문서 내에 있는 공백노드를 식별하는 역할을 하지만 URIref와는 달리, 배정된 문서 외부에서는 알 수가 없다.  공백노드는 공백노드 식별기호를 값으로 가진 rdf:nodeID 속성을 사용하여 RDF/XML에서 지시된다.  그렇지 않은 경우라면 여기에는 자원의 URIref가 제시된다.  특히 rdf:about 속성 대신, rdf:nodeID 속성을 가진 rdf:Description 요소를 사용하여 공백노드를 주어(subject)로 가진 선언문을 RDF/XML에서 작성할 수 있다. 마찬가지로 공백노드를 목적어(object)로 가진 선언문을 작성하기 위해서는 rdf:resource 속성 대신 rdf:nodeID 속성을 가진 성질 요소를 사용하여 작성할 수 있다.  예 6에서는 <그림 13>에 대응되는 RDF/XML을 예시하고 있다:


예 6: 공백노드를 기술한 RDF/XML



  <?xml version="1.0"?>

  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

              xmlns:dc="http://purl.org/dc/elements/1.1/"

              xmlns:exterms="http://example.org/stuff/1.0/">


     <rdf:Description rdf:about=

                "http://www.w3.org/TR/rdf-syntax-grammar">

       <dc:title>RDF/XML Syntax Specification (Revised)</dc:title>

       <exterms:editor rdf:nodeID="abc"/>

     </rdf:Description>


     <rdf:Description rdf:nodeID="abc">

        <exterms:fullName>Dave Beckett</exterms:fullName>

        <exterms:homePage rdf:resource=

                "http://purl.org/net/dajobe/"/>

    </rdf:Description>


</rdf:RDF>




예 6의 9행에서는 공백노드 식별기호인 abc가 여러 선언문의 주어로서의 공백노드를 식별하기 위해 사용되었으며, 7행에서는 그 공백노드가 특정 자원의 exterms:editor 성질의 값임을 제시하기 위해 사용되었다. [rdf-syntax]에서 설명하고 있는 기타 접근방식에 비해서 공백노드 식별기호를 사용할 때의 장점은 공백노드 식별기호를 사용하게 되면 동일한 RDF/XML 문서의 여러 곳에서 동일한 공백노드를 지시할 수 있다는 점이다.


마지막으로 2.4절에서 설명한 유형화된 리터럴(typed literals) 을 지금까지의 예에서 사용해 온 일반 리터럴 대신 성질 값으로 사용할 수 있다.  유형화된 리터럴은 그 리터럴을 포함하고 있는 성질 요소에 데이터타입 URIref를 명시한 rdf:datatype 속성을 추가함으로써 RDF/XML에서 표현할 수 있다.


예를 들어 exterms:creation-date 성질에 대하여 일반 리터럴 대신 유형화된 리터럴을 사용하기 위하여 예 2의 선언문을 변경하게 되면 다음과 같은 트리플로 표현할 수 있다.


ex:index.html   exterms:creation-date   "1999-08-16"^^xsd:date .


이에 상응하는 RDF/XML 구문을 예 7에서 볼 수 있다:


예 7: 유형화된 리터럴을 사용한 RDF/XML



<?xml version="1.0"?>

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

             xmlns:exterms="http://www.example.org/terms/">


   <rdf:Description rdf:about="http://www.example.org/index.html">

     <exterms:creation-date rdf:datatype=

         "http://www.w3.org/2001/XMLSchema#date">1999-08-16

       </exterms:creation-date>

   </rdf:Description>


</rdf:RDF>




예 7의 5행에서는 데이터타입을 명시하기 위하여 rdf:datatype 속성을 exterms:creation-date 성질 요소의 시작태그에 추가함으로써, 유형화된 리터럴을 exterms:creation-date 성질 요소의 값으로 제시하였다.  이 속성 값은  데이터타입의 URIref이며, 이 경우 XML 스키마 date 데이터타입의 URIref이다.  이것은 속성 값이기 때문에 트리플에서 사용된 QName 단축형인 xsd:date를 사용하는 대신, 이 URIref를 완전하게 기재해야 한다.  따라서 이 데이터타입에 적절한 리터럴를 이 요소의 컨텐츠로 기재할 수 있으며, 이 경우 리터럴은 1999-08-16로서, 이것은 XML 스키마 date 데이터타입에서 1999년 8월 16일을  리터럴로 표현한 것이다.


본 서의 나머지 부분에 사용된 예에서는 리터럴 값을 어떻게 해석할 것인가에 관하여 더 많은 정보를 제공한다는 점에서 유형화된 리터럴의 값을 강조하기 위하여 일반(비유형화된) 리터럴 대신 적절한 데이터타입의 유형화된 리터럴을 사용할 것이다. (예외적으로 이들 어플리케이션에서의 용법을 정확하게 반영하기 위하여, 현재 유형화된 리터럴을 사용하지 않는 실제 어플리케이션에서 취한 예에서는 일반 리터럴을 여전히 사용할 것이다). RDF/XML에서 일반 리터럴과 유형화된 리터럴(그리고 특수한 예외사항으로서 태그)은 다양한 언어로 작성된 정보를 직접 표현할 수 있도록 유니코드 [UNICODE] 문자를 포함할 수 있다.


유 형화된 리터럴을 사용하기 위해서는 유형화된 리터럴을 값으로 가진 각 요소에 대한 데이터타입을 식별할 수 있는 URIref를 가진 rdf:datatype 속성을 작성할 필요가 있음을 예 7에서 볼 수 있다. 앞서 지적한 바와 같이 RDF/XML에서는 속성 값으로 사용된 URIref를 QName과 같이 단축하지 않고 완전하게 작성하도록 요구하고 있다.  이러한 경우, 가독성을 개선하기 위해 URIref에 대해 단축기능을 추가로 제공함으로써 XML 개체(entities) 를 RDF/XML에 사용할 수 있다.  XML 개체선언은 기본적으로 이름과 문자열을 연계하고 있다.  XML 문서 내의 어딘가에 개체명이 사용된 경우, XML 처리기는 이 개체명을 대응되는 문자열로 대치하게 된다.  예를 들어 ENTITY 선언부(RDF/XML 문서의 첫 머리에서 DOCTYPE 선언부의 일부로 명시된)가 다음과 같은 경우,


<!DOCTYPE rdf:RDF [<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">]>


는 개체 xsd가 XML 스키마 데이터타입에 대한 이름공간 URIref를 표현하는 문자열이라고 정의한다.  이 선언을 통하여 XML 문서의 어딘가에서 완전한 이름공간 URIref를 개체 참조(entity reference)인 &xsd;로 축약하게 된다.  이 단축형을 사용함으로써 예 7예 8과 같이 작성할 수도 있다:


예 8: 유형화된 리터럴과 XML 개체를 사용한 RDF/XML



<?xml version="1.0"?>

<!DOCTYPE rdf:RDF [<!ENTITY xsd

                "http://www.w3.org/2001/XMLSchema#">]>


<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

             xmlns:exterms="http://www.example.org/terms/">


   <rdf:Description rdf:about="http://www.example.org/index.html">

     <exterms:creation-date rdf:datatype="&xsd;date">1999-08-16

       </exterms:creation-date>

   </rdf:Description>


</rdf:RDF>



2행의 DOCTYPE 선언은 6행에 사용된 개체 xsd를 정의한 것이다.


단 축 방법으로서 XML 개체를 사용하는 것은 RDF/XML에서는 선택사항이며, 따라서 XML DOCTYPE 선언부의 사용 또한 RDF/XML에서 선택사항이다 (XML에 익숙한 사람들에게 있어 RDF/XML은 단지 “구문규칙을 준수한” (well-formed) XML이면 된다.  RDF/XML은 유효성 체크를 하는 XML 처리기로 DTD에 대하여 유효성 검사를 하기 위하여 설계된 것이 아니다.  이 내용은 XML에 관하여 추가정보를 제공하는 부록 B에서 더 상세히 다루고 있다).


가독성을 위하여 본서의 나머지 부분에 포함된 예에서는 방금 설명한 것과 같은 XML 개체인 &xsd;를 사용할 것이다.  XML 개체에 대해서는 부록 B에 서 더 상세하게 설명하고 있다.  부록 B에서 예시한 바와 같이, 기타 URIref(그리고 더 일반적으로 말하면 다른 문자열)도 XML 개체를 사용하여 단축이 가능하다.  그러나 XML 스키마 데이터타입에 대한 URIref는 본서에 사용된 예에서 이 방식으로 단축될 수 있는 유일한 URIref이다.


비 록 RDF/XML을 작성하기 위한 단축형식을 더 추가할 수 있지만 지금까지 설명한 기능이 RDF/XML에서 그래프를 표현하기 위한 단순하지만 일반적인 방식이다.  이러한 기능을 사용하여 RDF 그래프를 다음과 같은 RDF/XML로 작성할 수 있다.


• 모든 공백노드에는 공백노드 식별기호를 부여한다.

• 각 노드는 전입되지 않은 rdf:Description 요소의 주어로서 차례로 제시된다.  이 때 그 노드가 URIref를 가지고 있으면 rdf:about 속성을 사용하고, 그 노드가 공백이면 rdf:nodeID 속성을 사용한다. 이 노드를 주어로 가진 각 트리플에 대해서, 목적어 노드에 URIref가 있는 경우 그 트리플의 목적어를 명시한 rdf:resource 속성인 리터럴 컨텐츠(대개는 공백)나 또는 (목적어 노드가 공백인 경우) 그 트리플의 목적어를 명시한 rdf:nodeID 속성 중 하나를 사용하여 적절한 성질 요소를 작성한다.


<a href="#ref-rdf-syntax">[rdf-syntax]</a>에 제시된 여러 가지 단축기법과 비교해 보면 이 단순한 접근방법이 실제 그래프 구조를 가장 직접적으로 표현하며, 이 기법이 출력된 RDF/XML을 이후의 RDF 처리 과정에 사용하기 위한 어플리케이션에서 특히 권장되고 있다.

지금까지의 예에서는 기술대상인 자원에 이미 URIref가 부여되어 있다고 가정하였다.  예를 들어 첫 번째 예에서는 URIref가 http://www.example.org/

index.html 인 example.org의 웹 페이지에 관한 기술정보를 제시하였다.  이 자원은 이 자원의 완전한 URIref를 인용한 rdf:about 속성을 사용하여 RDF/XML에서 식별되었다.  비록 RDF에서는 URIref를 부여하는 방법을 규정하거나 제어하지 않고 있지만, 때로는 조직된 일단의 자원의 일부에 URIref를 부여하여 효과를 달성하는 것이 바람직할 수 있다. 예를 들어 example.com이라는 운동용구 회사에서 텐트와 등산화 등과 같은 자사 제품에 대하여 RDF에 기반한 제품목록을http://www.example.com/2002/04/products로 식별되는 (그리고 여기에 위치한) RDF/XML 문서로 제공하고자 한다고 생각해 보자.  이 자원에서 각 제품은 독립된 RDF 기술로 제시될 수 있다.  이 제품목록은 "Overnighter"라고 하는 하나의 텐트 모형에 대한 제품목록인 이들 기술 중의 하나와 더불어 예 9와 같이 RDF/XML로 작성될 수 있다:


예 9: example.com의 제품목록에 대한 RDF/XML



   <?xml version="1.0"?>

   <!DOCTYPE rdf:RDF [<!ENTITY xsd

                   "http://www.w3.org/2001/XMLSchema#">]>

   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

               xmlns:exterms="http://www.example.com/terms/">


     <rdf:Description rdf:ID="item10245">

       <exterms:model rdf:datatype=

                   "&xsd;string">Overnighter</exterms:model>

       <exterms:sleeps rdf:datatype="&xsd;integer">2</exterms:sleeps>

       <exterms:weight rdf:datatype="&xsd;decimal">2.4</exterms:weight>

       <exterms:packedSize rdf:datatype="&xsd;integer">784

           </exterms:packedSize>

    </rdf:Description>


        ...기타 제품 기술...


  </rdf:RDF>




예 9에 서는 기술대상인 자원(텐트)의 성질(모델, 수용인원, 무게)을 표현하는 방식에서 앞의 예들과 비슷하다(1행부터 4행까지, 그리고 11행에는 이 문서의 환경이 되는 xml, DOCTYPE, RDF, 이름공간 정보가 포함되어 있으나 이 정보는 전체 제품목록으로 한번만 제공되고 이 제품목록에 있는 각 제품별로 반복해서 제공될 필요는 없을 것이다.  비록 각종 성질 값과 관련된 데이터타입(datatypes)이 명시된 경우라도 이들 성질 값과 관련된 단위(units)는 제시되지 않았음을 유의할 필요가 있다. 비록 이러한 정보가 그 값을 적절하게 해석하는데 사용되어야 함에도 불구하고 그러하다. 단위와 이와 유사한 정보를 표현하는 문제는 4.4절에서 다루고 있는 성질 값과 관련될 수 있다. 이 예에서 exterms:sleeps의 값은 텐트에서 잘 수 있는 사람의 수이고, exterms:weight의 값은 킬로그램으로 제시되어 있으며, exterms:packedSize의 값은 평방센치로서 이 텐트가 배낭에서 차지하는 공간으로 제시되어 있다).


앞의 예와 크게 다른 점은 5행의 rdf:Description 요소가 rdf:about 속성 대신 rdf:ID 속성을 가지고 있다는 점이다. rdf:ID를 사용하면 rdf:ID 속성 값으로 제시된 단편 식별기호(fragment identifier)를 기술대상 자원의 완전한 URIref의 단축형으로 명시하게 된다(이 경우 item10245는 example.com에서 부여한 제품목록번호일 수 있다).  단편 식별기호인 item10245는 베이스 URI(base URI) 와 관련해서 해석되며, 이 경우 포함하고 있는 제품목록 문서의 URI와 관련하여 해석될 것이다. 텐트에 대한 완전한 URIref는 제품목록의 베이스 URI에 문자인 "#"를 첨부하고 (뒤에 오는 것이 단편 식별기호임을 지시하기 위하여), 그리고 나서 여기에 item10245를 추가해서, http://www.example.com/2002/04/products

#item10245이라는 절대 URIref를 만들게 된다.


rdf:ID 속성은 현재의 베이스 URI(이 예에서는 제품목록의 베이스 URI)와 관련해서 고유한 이름을 정의한다는 점에서 XML과 HTML의 ID 속성과 다소 유사하다.  이 경우 rdf:ID 속성은 이 특정한 종류의 텐트에 이름(item10245)을 배정하는 것이라고 할 수 있다.  이 제품목록에 있는 다른 어떤 RDF/XML도 http://www.example.com/2002/04/products#item10245라는 절대 URIref나 #item10245라는 상대 URIref(relative URIref) 를 사용하여 이 텐트를 지시할 수 있다.  이 상대 URIref는 제품목록의 베이스 URIref와 관련해서 정의된 URIref로 이해될 수 있다.  아울러 유사한 단축기법을 사용하여 이 텐트의 URIref를  rdf:ID="item10245" 대신, 제품목록에 있는 rdf:about="#item10245"로 지정하여(즉 상대 URIref를 직접 명시함으로써) 제시할 수도 있다.  단축기법에서 보면 이 두 형식은 본질적으로 동의어이다.  즉 RDF/XML로 작성된 완전한 URIref는 어느 경우에도  http://www.example.com/2002/04/products#item10245 와 동일하다.  그러나 rdf:ID를 사용하게 되면 일련의 고유한 이름을 배정할 때 추가로 검사 할 수 있다.  왜냐하면 rdf:ID 속성의 특정한 값은 동일한 베이스 URI(이 예에서는 제품목록)에 대하여 단 한번만 출현할 수 있기 때문이다(이 예에서는 제품목록 문서).  어느 형식을 사용하든지, example.com은 2단계 과정으로 텐트에 대한 URIref를 제시하게 된다.  첫 단계에서는 전체 제품목록에 대한 URIref를 배정하고, 그 다음에 이 특정한 종류의 텐트에 부여된 URIref를 제시하기 위하여 제품목록에 있는 이 텐트의 기술에서 상대 URIref를 사용하는 것이다.  더욱이 이렇게 상대 URIref를 사용하게 되면 RDF와는 독립적으로 그 텐트에 배정된 완전한 URIref를 단축한 것이거나 또는 제품목록에서 이 텐트에 부여한 URIref라고 생각할 수 있다.


이 제품목록 외부에(outside) 위치한 RDF는 완전한 URIref를 사용함으로써, 즉 이 텐트의 상대 URIref인 #item10245를 제품목록의 베이스 URI에 연결하여 절대 URIref인 http://www.example.com/2002/04/products#item10245를 구축함으로써 이 텐트를 지시할 수 있다.  예를 들어 실외 스포츠 웹 사이트인 exampleRatings.com에서는 RDF를 사용하여 각종 텐트에 대한 등급을 제공할 수 있다.  따라서 예 9에 기술된 텐트에 대한 등급(별 다섯 개)은 exampleRatings.com 웹 사이트에서는 <그림 1>과 같이 표현될 수 있다:


예 10: exampleRatings.com의 텐트에 대한 등급



  <?xml version="1.0"?>

  <!DOCTYPE rdf:RDF [<!ENTITY xsd

                       "http://www.w3.org/2001/XMLSchema#">]>

  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

              xmlns:sportex="http://www.exampleRatings.com/terms/">


  <rdf:Description rdf:about=

                       "http://www.example.com/2002/04/products#item10245">

         <sportex:ratingBy rdf:datatype="&xsd;string">Richard Roe                       </sportex:ratingBy>

         <sportex:numberStars rdf:datatype=

                       "&xsd;integer">5</sportex:numberStars>

    </rdf:Description>

  </rdf:RDF>




예 10의 5행에서는 rdf:Description 요소와 더불어, 이 텐트의 완전한 URIref를 값으로 지닌 rdf:about 속성을 사용하고 있다.  이 URIref를 사용하게 되면 등급으로 지시된 텐트를 정확하게 식별할 수 있다.


이들 예는 다음과 같은 몇 가지 사항을 시사하고 있다.  첫째, 비록 RDF에서는 URIref를 자원(이 경우 제품목록에 있는 각종 텐트와 기타 제품)에 배정하는

방 법을 규정하거나 제어하지는 않지만, 하나의 문서(이 경우 제품목록)를 이들 자원의 기술을 위한 정보원으로 식별하는 과정(RDF 외부에서 이루어지는) 과, 그 문서 내에 수록된 자원을 기술할 때 상대 URIref의 사용법을 결합함으로써, RDF에서 URIref를 자원에 배정하는 효과를 달성하고 있다.  예를 들어 제품번호가 이 제품목록에 항목으로 수록되어 있지 않은 경우, 그 제품은 example.com이 모르는 제품이라는 것을 이해하면서, example.com에서는 이 제품목록을 자사의 제품을 기술한 핵심 정보원으로 사용할 수 있을 것이다.  (RDF에서는 두 개의 자원의 URIref가 동일한 베이스를 가지고 있거나, 다른 면에서 유사하다는 이유만으로 이들 자원 간에 어떤 특수한 관계가 존재한다고 전제하지 않는다는 점에 유의할 필요가 있다.  이 관계를 example.com에서 알 수는 있을지라도, RDF에서는 직접적으로 이 관계를 정의하지는 않는다).


아울러 이들 예에서는 웹 구조상의 기본원리 가운데 하나를 예시하고 있는데, 그것은 누구라도 자기가 선호하는 어휘를 사용하여 기존의 자원에 관한 정보를 마음대로 추가할 수 있어야 한다는 것이다[BERNERS-LEE98]. 나아가 이들 예에서는 특정 자원을 기술한 RDF는 모두 한 자리에 위치할 필요가 없으며, 대신 웹 전체에 걸쳐 분산될 수 있음을 보여주고 있다.  이것은 한 기관이 다른 기관에서 정의한 자원에 대해 등급을 부여하거나 평가하는 이러한 상황에 적용될 뿐만 아니라, 자원을 처음 정의한 사람(혹은 다른 누구라도)이 자원과 관련된 추가정보를 제공함으로써 그 자원의 기술을 확장하고자 하는 상황에도 적용된다.  이것은 추가적인 정보를 기술하는데 필요한 성질과 값을 추가하기 위하여 자원을 처음 기술한 RDF 문서를 수정함으로써 이루어질 수도 있다.  혹은 이 예에서 보는 바와 같이, rdf:about를 사용해서 원 자료의 URIref를 통하여 원 자원을 지시하는 rdf:Description 요소에 부차적인 성질과 값을 제시하는 독립된 문서를 작성할 수도 있다.


이상의 검토를 통해 알 수 있는 것은 #item10245와 같은 상대 URIrefs는 베이스 URI(base URI)와 관련해서 해석된다는 점이다.  기본적으로 이 베이스 URI는 상대 URIref가 사용된 자원의 URI가 된다.  그렇지만 때로는 이 베이스 URI를 명시적으로 규정하는 것이 바람직할 때가 있다.  예를 들면 http://www.example.com/2002/04/products에 위치한 제품목록 이외에 example.org에서 미러 사이트, 이를테면 http://mirror.example.com/2002/04/

products에 제품목록을 복제하여 제공하고자 하는 경우를 생각해 보자. 이것은 문제가 될 수 있다.  왜냐하면 미러 사이트에서 이 제품목록에 접근하게 되면, 예로 든 텐트에 대한 URIref는 텐트를 수록한 문서의 URI에서 만들어지며, 결과적으로 http://www.example.com/2002/04/products#item10245가 아니라 http://mirror.example.com/2002/04/products#item10245 가 작성되며, 따라서 의도한 자원과는 분명히 다른 자원을 지시하게 될 것이다.  따라서 이 방법 대신 example.org는 소스 문서의 위치가 베이스를 정의하는 단일 소스문서(a single source document)를 만들지 않고, 회사 제품 세트 URIref로 베이스 URIref를 배정할 수도 있다.


이러한 경우를 처리하기 위해 RDF/XML에서는 XML 문서를 통해 그 문서 자체의 URI 대신, 베이스 URI를 규정할 수 있도록 XML 베이스(XML Base [XML-BASE])를 지원하고 있다.  예 11에서는 XML 베이스를 사용한 제품목록의 기술방법을 예시하고 있다:


예 11: example.com 제품목록에서 XML 베이스 사용법



   <?xml version="1.0"?>

   <!DOCTYPE rdf:RDF [<!ENTITY xsd

                         "http://www.w3.org/2001/XMLSchema#">]>

   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

               xmlns:exterms="http://www.example.com/terms/"

               xml:base="http://www.example.com/2002/04/products">


     <rdf:Description rdf:ID="item10245">

          <exterms:model rdf:datatype="&xsd;string">

                         Overnighter</exterms:model>

          <exterms:sleeps rdf:datatype="&xsd;integer">2</exterms:sleeps>

          <exterms:weight rdf:datatype="&xsd;decimal">

                         2.4</exterms:weight>

        <exterms:packedSize rdf:datatype="&xsd;integer"> 784                  </exterms:packedSize>

    </rdf:Description>


  ...기타 제품 기술...


  </rdf:RDF>




예 11에서 5행의 xml:base 선언부에서 rdf:RDF 요소에 있는 컨텐츠에 대한 베이스 URI는 http://www.example.com/2002/04/products이 며(다른 xml:base 속성이 명시될 때까지), 이 컨텐츠에서 인용된 모든 상대 URIref는 이를 수록한 문서의 URI가 무엇인가와는 관계없이 이 베이스 URI와 관련하여 상대적으로 해석된다는 것을 명시하고 있다.  결과적으로 이 텐트의 상대 URIref인 #item10245는 이 제품목록 문서의 실제 URI와 관계없이, 또는 베이스 URIref가 실제로 어떤 특정 문서를 식별하는지와 무관하게, 동일한 절대 URIref인 http://www.example.com/2002/04/products#item10245로 해석될 것이다.


지 금까지 이들 예에서는 example.com의 제품목록에 있는 특정한 모델의 텐트라고 하는 하나의 제품에 관한 기술을 사용하였다.  그렇지만 example.com에서는 아마도 배낭이나 등산화 등과 같은 다른 여러 제품과 더불어 다양한 모델의 텐트를 제공하게 될 것이다.  이와 같이 상이한 종류(kind)나 범주(category)로 사물을 분류한다는 생각은 상이한 타입(type)이나 클래스(class)를 지닌 객체 프로그래밍 언어개념과 유사하다.  RDF에서는 rdf:type이라고 하는 미리 정의된 성질을 제공하여 이 개념을 지원하고 있다. RDF 자원을 rdf:type 성질로 기술할 때, 이 성질의 값은 사물의 범주나 클래스(class)를 표현하는 자원으로 취급되며, 이 성질의 주어는 그 범주나 클래스에서 하나의 인스턴스(instance)로 취급된다.  예 12에서는 rdf:type을 사용하여 example.com에서 제품 기술이 바로 텐트에 관한 것임을 어떻게 제시하고 있는가를 보여준 것이다:



예 12: rdf:type을 사용한 텐트 기술



   <?xml version="1.0"?>

   <!DOCTYPE rdf:RDF [<!ENTITY xsd

                        "http://www.w3.org/2001/XMLSchema#">]>

   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

               xmlns:exterms="http://www.example.com/terms/"

               xml:base="http://www.example.com/2002/04/products">


     <rdf:Description rdf:ID="item10245">

          <rdf:type rdf:resource="http://www.example.com/terms/Tent"/>

          <exterms:model rdf:datatype="&xsd;string">

                         Overnighter</exterms:model>

          <exterms:sleeps rdf:datatype="&xsd;integer">2</exterms:sleeps>

         <exterms:weight rdf:datatype="&xsd;decimal">

                         2.4</exterms:weight>

        <exterms:packedSize rdf:datatype="&xsd;integer">

                         784</exterms:packedSize>

    </rdf:Description>


          ...기타 제품기술...


  </rdf:RDF>




예 12에서 7행의 rdf:type 성질은 기술대상 자원이 URIref http://www.example.com/terms/Tent로 식별되는 클래스의 하나의 인스턴스임을 표현한 것이다.  이것은 example.com이 다른 용어(exterms:weight 성질과 같은)를 기술하기 위해 사용한 것과 동일한 어휘의 일부로 example.com의 클래스를 기술하였고, 그래서 이 클래스의 절대 URIref를 사용하여 그 클래스를 지시하고 있다고 생각할 수 있다.  만약 example.com이 이들 클래스를 제품목록 자체의 일부로 기술했다면, 상대 URIref인 #Tent를 사용하여 이를 지시하였을 것이다.


RDF 자체는 이 예에 사용된 텐트와 같이, 사물을 어플리케이션 전용의 클래스로 정의하거나 혹은 exterms:weight와 같은 성질로 정의하는 기능을 제공하지 않는다.  그 대신 이들 클래스를 제5절에서 다룬 RDF 스키마(RDF Schema) 언어를 사용하여 RDF 스키마(RDF schema)로 기술하게 된다.  <a href="#richerschemas">5.5절</a>에서 다룬 DAML+OIL언어와 OWL 언어와 같이, 클래스를 기술하기 위한 기타 기능에 대해서도 정의할 수 있다.


RDF에서는 자원이 그 자원을 특정한 타입이나 클래스의 인스턴스로 기술하는 rdf:type 성질을 가지는 것은 아주 흔한 일이다.  이러한 자원을 그래프에서는 유형화된 노드(typed nodes), 혹은 RDF/XML에서는 유형화된 노드요소(typed node element) 라고 한다.  RDF/XML에서는 이들 유형화된 노드를 기술하기 위하여 특수한 단축형을 제공하고 있다. 이 단축형 중에서 rdf:type 성질과 그 값이 삭제되고, 이 노드에 대한 rdf:Description 요소는 삭제된 rdf:type 성질(클래스를 지칭하는 URIref) 값에 대응되는 QName이라는 이름을 가진 요소로 대체된다.  이 단축형을 사용함으로써 예 12의 example.com의 텐트는 예 13과 같이 기술될 수도 있다.


예 13: 텐트의 종류 단축형



   <?xml version="1.0"?>

   <!DOCTYPE rdf:RDF [<!ENTITY xsd

                        "http://www.w3.org/2001/XMLSchema#">]>

   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

               xmlns:exterms="http://www.example.com/terms/"

               xml:base="http://www.example.com/2002/04/products">


     <exterms:Tent rdf:ID="item10245">

          <exterms:model rdf:datatype=

                        "&xsd;string">Overnighter</exterms:model>

          <exterms:sleeps rdf:datatype="&xsd;integer">2</exterms:sleeps>

          <exterms:weight rdf:datatype="&xsd;decimal">

                        2.4</exterms:weight>

        <exterms:packedSize rdf:datatype="&xsd;integer">

                       784</exterms:packedSize>

    </exterms:Tent>


  ...기타 제품 기술...


  </rdf:RDF>




자 원은 복수의 클래스에서 각각 하나의 인스턴스로 기술될 수 있기 때문에 자원은 복수의 rdf:type 성질을 가질 수 있다. 그러나 이들 rdf:type 성질 중 단 하나만이 이 방식으로 단축될 수 있다.  나머지 성질은 rdf:type 성질을 사용하여, 예 12의 rdf:type 성질로 예시된 방식에 따라, 완전하게 기술되어야 한다.


exterms:Tent 와 같이 이용자가 정의한 클래스의 인스턴스를 기술할 때 유형화된 노드 단축형를 사용하는 것 이외에, 제4절에서 설명하고 있는, 이미 정의된 RDF 클래스(rdf:Bag과 같은)와 제5절에서 설명한 바 있는, 이미 정의된 RDF 스키마 클래스(rdfs:Class와 같은)의 인스턴스를 기술할 때에도 RDF/XML에서는 유형화된 노드 단축형을 공동으로 사용하고 있다.


예 12예 13에 서는 직접 XML(RDF가 아닌)로 작성할 수 있는 기술과 아주 유사한 방법으로, RDF/XML에서 RDF 선언문을 작성할 수 있음을 보여주고 있다.  이것은 정보의 구조화 방식에 커다란 변화를 주지 않고도 어플리케이션에서 RDF를 사용하도록 제안하고 있기 때문에, 모든 종류의 어플리케이션에서 XML의 사용이 늘어나고 있는 것을 생각할 때 중요한 고려사항이다.

위 의 예에서는 RDF/XML 구문의 배경에 있는 기본 개념 중 일부를 예시한 것이다.  이들 예는 유용한 RDF/XML을 작성하기 시작하기에 충분한 정보를 제공하고 있다.  RDF 선언문을 XML로 모델링하는 데 있어 배경이 되는 원리에 대해 보다 더 철저한 검토내용은(스트라이핑이라고 한다) 이용 가능한 기타 RDF/XML 단축 표현 및 XML에서 RDF 작성에 관한 구체적인 사항과 용례와 더불어 (규범적) RDF/XML 구문 명세서 (RDF/XML Syntax Specification <a href="#ref-rdf-syntax">[rdf-syntax]</a>)에 제시되어 있다.

11 16, 2009 14:07 11 16, 2009 14:07
─ tag  이올린 태그검색올블로그 태그검색테크노라티 태그검색태그스토리 태그검색티스토리 태그검색
Trackback URL : http://emm386.net/ts/trackback/131
[Login][OpenID?]