Search results

'RDF'에 해당하는 글들

  1. 2009년 11월 16일  [RDF Primer]W3C Proposed Recommendation-5

[RDF Primer]W3C Proposed Recommendation-5


다음 절에서는 RDF 스키마의 기본 자원과 성질을 예시할 것이다.

모든 기술(記述)처리의 기본단계는 기술 대상인 다양한 종류의 사물을 식별하는 일이다.  RDF 스키마에서는 이러한 “사물의 종류”를 “클래스”라고 부른다.  RDF 스키마에서 클래스는 하나의 타입(Type) 또는 범주(Category)와 같은 일반 개념에 해당하며, Java와 같은 객체지향 프로그램 언어의 클래스 개념과 다소 유사하다.  RDF 클래스는 웹 페이지나 사람, 문서형태, 데이터베이스 또는 추상적 개념 등 거의 모든 범주의 사물을 표현하는데 사용될 수 있다.  클래스는 RDF 스키마 자원인 rdfs:Class와 rdfs:Resource, 그리고 성질인 rdf:type와 rdfs:subClassOf를 사용하여 기술된다.


예 를 들면 example.org에서 RDF를 사용하여 다양한 종류의 자동차에 관한 정보를 제공하려 한다고 가정하자. example.org는 먼저 RDF 스키마에서 자동차라는 사물의 범주를  표현하기 위한 클래스를 필요로 한다.  클래스에 속하는 자원을 그 클래스의 인스턴스(instances)라고 한다.  이 경우 example.org는 자동차라는 자원을 이 클래스의 인스턴스로 사용할 것이다.RDF 스키마에서 클래스란 rdf:type 성질과 그 성질 값으로 rdfs:Class라는 자원을 가진 어떤 자원을 의미한다.  따라서 자동차 클래스를 기술하기 위해서는 이 클래스에 URIref를 부여하고, 이를테면 ex:MotorVehicle (ex:는 URIref 인 http://www.example.org/schemas/vehicles를 표현한 것이며, 이것은 example.org의 어휘의 URIref에 대한 접두사로 사용된다), 자원인 rdfs:Class를 성질 값으로 지닌 rdf:type 성질을 가진 해당 자원을 기술하면 된다.  즉 example.org는 다음과 같은 RDF 선언문을 작성하게 될 것이다.


ex:MotorVehicle   rdf:type   rdfs:Class .


3.2 절에서 설명한 바와 같이, rdf:type 성질을 사용하여 하나의 자원이 특정 클래스의 인스턴스임을 알리게 된다.  따라서 일단 ex:MotorVehicle 을 하나의 클래스로 기술하고 나면, 자원인 exthings:companyCar는 다음과 같은 RDF 선언문에 의하여 하나의 자동차로 기술될 것이다.


exthings:companyCar   rdf:type   ex:MotorVehicle .


(이 선언문에서는 일반 관례에 따라 성질과 인스턴스명의 첫 자를 소문자로 기재한 반면, 클래스명의 첫 자를 대문자로 기재하였다. 그러나 이 관례는 RDF 스키마에서 요구하는 사항은 아니다.  아울러 이 선언문에서는 example.org가 사물의 클래스와 인스턴스에 대해 각각 별도의 어휘를 정의한 것으로 가정한다.)


자원인 rdfs:Class 자체는 rdfs:Class의 rdf:type을 가진다.  자원은 복수 클래스의 인스턴스가 될 수 있다.


ex:MotorVehicle 클래스를 기술한 후, example.org에서는 승용차, 밴, 미니밴 등 다양하면서도 특수한 종류의 자동차를 표현할 수 있는 클래스를 추가로 기술하기 원할 수 있다. 이 추가된 클래스도 ex:MotorVehicle 클래스와 동일한 방법으로 기술되는데, 이를 위해 새로운 클래스별로 URIref를 부여하고, 이들 자원을 클래스로 기술한 RDF 선언문을 작성하면 된다. 예를 들면 다음과 같다.


ex:Van     rdf:type   rdfs:Class .

ex:Truck   rdf:type   rdfs:Class .


그 러나 이들 선언문 자체는 단지 개별 클래스만을 기술한 것이다.  example.org에서는 ex:MotorVehicle 클래스와의 개별 클래스와의 특수한 관계를 표현하길 원할 수도 있다. 즉 위의 클래스들이 MotorVehicle의 특수한 종류라는 것을 표현하고자 하는 경우이다.


이 와 같이 두 클래스 간의 특수한 관계를 기술하기 위해 미리 정의된 rdfs:subClassOf 성질을 사용하여 이 두 클래스를 연결하게 된다.  예를 들면ex:Van이 ex:MotorVehicle의 특수한 유형이라는 것을 표현하기 위하여 example.org에서는 다음과 같은 RDF 선언문을 작성하게 된다.


ex:Van   rdfs:subClassOf   ex:MotorVehicle .


이 rdfs:subClassOf 관계가 의미하는 바는 클래스 ex:Van의 어떤 인스턴스는 클래스 ex:MotorVehicle의 인스턴스이기도 하다는 것이다.  따라서 만약 자원 exthings:companyVan이 ex:Van의 하나의 인스턴스라면 이미 선언된 rdfs:subClassOf 관계에 기반하여, RDF 스키마 어휘를 이해할 수 있도록 작성된 RDF 소프트웨어는 exthings:companyVan이 ex:MotorVehicle의 인스턴스이기도 하다는 정보를 추가로 추론하게 된다.


이 exthings:companyVan의 예는 확장언어를 정의한 RDF 스키마에 관해서 앞에서 지적한 점을 보여주고 있다.  RDF 자체는 rdfs:subClassOf 같은 RDF 스키마 어휘의 용어에 대하여 특수한 의미를 규정하지 않고 있다.  따라서 만약 RDF 스키마에서 ex:Van과 ex:MotorVehicle 간의 rdfs:subClassOf 관계를 정의한다면, 이 RDF 스키마 용어를 이해하지 못하는 RDF 소프트웨어는 위 선언문을 rdfs:subClassOf 라는 술어를 가진 트리플로 인식할 뿐, rdfs:subClassOf의 특수한 의미를 이해하지 못하며, 결과적으로 exthings:companyVan은 ex:MotorVehicle의 인스턴스가 된다는 사실도 추가로 추론할 수 없을 것이다.


rdfs:subClassOf 성질은 이행적(移行的)이다.  예를 들어 이것은 다음과 같은 RDF 선언문을 의미한다.


ex:Van         rdfs:subClassOf   ex:MotorVehicle .

ex:MiniVan   rdfs:subClassOf   ex:Van .


RDF 스키마에서는 ex:MiniVan도 ex:MotorVehicle의 하위클래스로 정의한다.  결과적으로 RDF 스키마는 클래스 ex:MiniVan의 인스턴스이면서 동시에 클래스 ex:MotorVehicle 의 인스턴스인(또한 클래스 ex:Van의 인스턴스인) 자원을 정의하는 것이다.  하나의 클래스는 복수 클래스의 하위 클래스가 될 수 있다 (예를 들면 ex:MiniVan은 ex:Van과 ex:PassengerVehicle 이라는 두 클래스의 하위 클래스일 수 있다).  RDF 스키마는 모든 클래스를 클래스 rdfs:Resource의 하위 클래스로 정의한다 (왜냐하면 모든 클래스에 속하는 인스턴스는 자원이기 때문이다).


<그림 18>은 위의 예에서 다루었던 클래스의 전체 계층을 보여주고 있다.

<그림 18>: 자동차 클래스의 계층


(그림을 단순화하기 위하여 <그림 18> 에서는 개별 클래스를 rdfs:Class로 연결하는 rdf:type 성질은 생략되어있다.  사실 RDF 스키마는 성질rdfs:subClassOf를 타입 rdfs:Class의 자원으로 사용한 선언문의 주어와 목적어 두 가지를 정의하므로 이러한 사실을 추론할 수 있다.  그러나 실제 스키마를 작성할 때는 이러한 정보를 명확히 제시하는 것이 바람직하다).


이 스키마를 트리플로 표현하면 다음과 같다.


ex:MotorVehicle              rdf:type          rdfs:Class .

ex:PassengerVehicle         rdf:type          rdfs:Class .

ex:Van                         rdf:type          rdfs:Class .

ex:Truck                      rdf:type          rdfs:Class .

ex:MiniVan                   rdf:type          rdfs:Class .

ex:PassengerVehicle         rdfs:subClassOf   ex:MotorVehicle .

ex:Van                         rdfs:subClassOf   ex:MotorVehicle .

ex:Truck                      rdfs:subClassOf   ex:MotorVehicle .

ex:MiniVan                   rdfs:subClassOf   ex:Van .

ex:MiniVan                   rdfs:subClassOf   ex:PassengerVehicle .


예 23에서는 위의 스키마를 RDF/XML로 작성한 것임을 볼 수 있다.


예 23: 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:rdfs="http://www.w3.org/2000/01/rdf-schema#"

  xml:base="http://example.org/schemas/vehicles">


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

  <rdf:type rdf:resource=

        "http://www.w3.org/2000/01/rdf-schema#Class"/>

</rdf:Description>


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

  <rdf:type rdf:resource=

        "http://www.w3.org/2000/01/rdf-schema#Class"/>

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdf:Description>


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

  <rdf:type rdf:resource=

        "http://www.w3.org/2000/01/rdf-schema#Class"/>

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdf:Description>


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

  <rdf:type rdf:resource=

        "http://www.w3.org/2000/01/rdf-schema#Class"/>

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdf:Description>


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

  <rdf:type rdf:resource=

        "http://www.w3.org/2000/01/rdf-schema#Class"/>

  <rdfs:subClassOf rdf:resource="#Van"/>

  <rdfs:subClassOf rdf:resource="#PassengerVehicle"/>

</rdf:Description>


</rdf:RDF>




3.2절에서 예 13과 연관하여 설명한 바와 같이, RDF/XML에서는 rdf:type 성질(타입 노드)을 가진 자원을 기술하기 위한 단축형을 제시하고 있다.  RDF 스키마 클래스는 RDF 자원이므로 이 단축형을 적용하여 클래스를 기술할 수 있다.  이 단축형을 사용하게 되면 스키마를 예 24와 같이 기술할 수도 있다.


예 24: 타입 노드 단축형을 사용한 자동차 클래스의 계층



<?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:rdfs="http://www.w3.org/2000/01/rdf-schema#"

  xml:base="http://example.org/schemas/vehicles">


<rdfs:Class rdf:ID="MotorVehicle"/>


<rdfs:Class rdf:ID="PassengerVehicle">

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdfs:Class>


<rdfs:Class rdf:ID="Truck">

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdfs:Class>


<rdfs:Class rdf:ID="Van">

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdfs:Class>


<rdfs:Class rdf:ID="MiniVan">

  <rdfs:subClassOf rdf:resource="#Van"/>

  <rdfs:subClassOf rdf:resource="#PassengerVehicle"/>

</rdfs:Class>


</rdf:RDF>





위와 유사한 타입 노드 단축형이 이 절 이후 전체에 사용될 것이다.


예 23예 24의 RDF/XML은 3.2절에 기술된 바와 같이 스키마 문서와 관련하여 URIref를 “부여”하는 효과를 제시하기 위해 rdf:ID를 사용하여 기술한 자원(클래스)에 MotorVehicle과 같은 이름을 도입하고 있다. 여기서 rdf:ID는 두 가지 측면에서 유용하다.  첫째는 URIref를 축약하고, 둘째는 rdf:ID 속성 값이 현재의 베이스 URI (주로 그 문서의 URI)와 대비해서 고유한 것인지를 추가로 점검할 수도 있다. 이를 통해 RDF 스키마에서 클래스명과 성질명을 정의할 때 반복된 rdf:ID 값을 발견할 수 있다.  따라서 이와 같이 명칭에 기반한 상대 URIrefs는 동일 스키마 내에 있는 다른 클래스를 정의할 때 사용될 수 있다 (예를 들어 다른 클래스의 기술에 #MotorVehicle이 사용되었듯이).  스키마 자체가 http://example.org/schemas/vehicles라는 자원이라는 가정 하에, 이 클래스의 완전한 URIref는 http://example.org/schemas/vehicles#MotorVehicle이 될 것이다 (<그림 18> 에서 보는 바와 같이). 3.2절에서 지적한 바와 같이, 비록 그 스키마가 재배치되고 복제되었다 할지라도 이 스키마 클래스에 대한 참조를 일관되게 유지하기 위해서는(혹은 스키마 클래스가 특정 위치로 발행되었다고 가정하지 않고, 단지 베이스 URIref를 부여하기 위하여),  클래스 기술은 xml:base=“http://example.org/schemas/vehicles”와 같은 명시적 선언을 포함할 수도 있다.  명시적 xml:base 선언을 사용하는 것은 효과적인 방법이며, 이 선언은 위의 두 예에서 모두 사용되고 있다.


어 디에도 존재하는 RDF 인스턴스 데이터(예를 들어 이들 클래스에 속하는 개별 자동차를 기술한 데이터)에서 이들 클래스를 참조하기 위하여 , example.org는 다음 세 가지 중 하나의 방법으로 클래스를 식별할 필요가 있다: 첫째, 절대 URIref를 작성하거나 둘째, 적절한 xml:base 선언과 더불어 상대 URIref를 사용하거나 셋째, QName을 적절한 URIref로 확장해주는 적절한 이름공간 선언과 더불어 QName을 사용하는 것이다.  예를 들면 자원 exthings:companyCar는 예 24의 스키마에 기술된 ex:MotorVehicle 클래스의 인스턴스로 기술되는데, 예 25의 RDF/XML로 제시되되어 있다.


예 25: ex:MotorVehicle의 인스턴스



<?xml version="1.0"?>

<rdf:RDF  

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

  xmlns:ex="http://example.org/schemas/vehicles#"

  xml:base="http://example.org/things">


    <ex:MotorVehicle rdf:ID="companyCar"/>


</rdf:RDF>





QName인 ex:MotorVehicle은 이름공간 선언부인  xmlns:ex=http://example.org/schemas/vehicles#를 사용하여 확장하면 완전한 URIref인 http://example.org/schemas/vehicles#MotorVehicle가 된다는 점에 유의해야 한다.  이것이 <그림 18>에서 보는 바와 같이 MotorVehicle 클래스에 대한 정확한 URIref이다.  xml:base 선언인 xml:base=“http://example.org/things”를 사용하여 rdf:ID="companyCar"를 적절한 exthings:companyCar URIref로 확장하게 한다(왜냐하면 QName은 rdf:ID 성질의 값으로 사용될 수 없기 때문이다).

이용자 집단은 사물의 특정 클래스를 기술하는 것 이외에 이들 사물의 클래스를 특징짓는 특정한 성질을 기술할 필요도 있다 (승용차를 기술하기 위한 rearSeatLegRoom과 같이).  RDF 스키마에서 성질은 RDF 클래스인 rdf:Property와 RDF 스키마 성질인 rdfs:domain와 rdfs:range, rdfs:subPropertyOf를 사용하여 기술된다.


RDF 의 모든 성질은 rdf:Property 클래스의 인스턴스로 기술된다.  따라서 exterms:weightInKg과 같은 새로운 성질은 이 성질에 URIref를 부여하고, 그리고  rdf:type 성질과 자원인 rdf:Property를 성질 값으로 지닌 자원을 기술함으로써 이 새로운 성질을 기술할 수 있다.  예를 들면 다음과 같은 RDF 선언문을 작성할 수 있다.


exterms:weightInKg   rdf:type   rdf:Property .


RDF 스키마 역시 RDF 데이터에서 함께 사용되는 성질과 클래스의 용법을 기술한 어휘를 제공하고 있다.  이와 같이 아주 중요한 정보는 특정 어플리케이션에서만 사용되는 성질을 상세히 기술하기 위하여 rdfs:range와 rdfs:domain과 같은 RDF 스키마 성질을 사용하여 제공된다.


rdfs:range 성질은 특정 성질의 값이 지정된 클래스의 인스턴스임을 나타내는데 사용된다.  예를 들어 만약 example.org에서 성질 ex:author는 클래스인 ex:Person의 인스턴스를 그 값으로 가지고 있다는 것을 표현하려면, RDF 선언문은 다음과 같게 될 것이다.


ex:Person    rdf:type       rdfs:Class .

ex:author     rdf:type       rdf:Property .

ex:author     rdfs:range    ex:Person .


이들 선언문에서는 ex:Person은 클래스이고, ex:author는 성질임을 제시하고 있으며, 그리고 ex:author 성질을 사용한 RDF 선언문은 ex:Person의 인스턴스를 목적어로 가지고 있다는 것을 나타낸 것이다.


예 를 들어 ex:hasMother와 같은 성질은 0이나 1, 또는 복수의 범위 성질을 가질 수 있다.  만약 ex:hasMother가 범위 성질을 가지지 않는 경우라면 ex:hasMother 성질의 값에 대해서 말할 수 있는 것은 아무것도 없다.  만약 ex:hasMother가 하나의 범위 성질을 가진다면, 예를 들어 ex:Person을 그 범위로 지정하게 되면 이것은 ex:hasMother 성질 값이 ex:Person 클래스의 인스턴스라는 것을 의미한다.  만약 ex:hasMother가 복수의 범위 성질을 가지게 되면. 예를 들어 하나는 ex:Person을, 다른 하나는 ex:Female을 그 범위로 지정한 경우, 이것은 ex:hasMother 성질 값은 범위로 지정된 모든 클래스의 인스턴스인 자원이다. 즉 ex:hasMother 성질의 값은 ex:Female 클래스와 그리고  ex:Person 클래스 양쪽의 값이라는 것을 말하는 것이다.


이 마지막 부분은 명확하지 않을 수도 있다.  그러나 ex:hasMother 성질이 ex:Female과 ex:Person이라는 두개의 범위를 가진다고 하는 것은 두 개의 독립된 선언문을 작성하는 것과 관련되어 있다.


ex:hasMother   rdfs:range   ex:Female .

ex:hasMother   rdfs:range   ex:Person .


예를 들어 이 성질을 사용한 어떤 특정한 선언문이 다음과 같다.


exstaff:frank   ex:hasMother   exstaff:frances .


위의 두 개의 rdfs:range 선언문 모두가 정확하기 위해서는 exstaff:frances가 ex:Female과 ex:Person이라는 두 개의 범위의 인스턴스가 되어야 한다는 점이다.


rdfs:range 성질은 2.4절에서 검토한 바와 같이, 유형화된 리터럴로 제시된 성질의 값을 제시하기 위해서도 사용될 수 있다.  예를 들어 example.org에서 ex:age 성질은 XML 스키마의 데이터타입인 xsd:integer의 값을 가지고 있다는 것을 제시하고자 한다면, 다음과 같은 RDF 선언문을 작성하게 될 것이다.


ex:age         rdf:type       rdf:Property .

ex:age         rdfs:range    xsd:integer .


데이터타입 xsd:integer는 이 데이터타입의 URIref로 식별된다 (완전한 URIref는 http://www.w3.org/2001/XMLSchema#integer임). 이 URIref는 데이터타입을 식별한다고 스키마에 명시적으로 선언되지 않고도 사용될 수 있다.  그러나 대개는 특정 URIref가 데이터타입을 식별한다고 명백히 선언하는 것이 바람직하다.  이는 RDF 스키마의 rdfs:Datatype 클래스를 사용하면 된다.  xsd:integer가 하나의 데이터타입임을 선언하기 위하여, example.org에서는 다음과 같은 RDF 선언문을 작성하게 된다.

xsd:integer   rdf:type   rdfs:Datatype .


이 선언문은 xsd:integer가 데이터타입의 URIref라는 것을 말하는 것이다 (이것은 [RDF-CONCEPTS]에 기술된 RDF 데이터타입에 대한 요구사항을 준수하는 것으로 간주된다).  즉 example.org에서 새로운 데이터타입을 정의하고 있다는 의미에서, 이러한 선언문이 데이터타입을 정의하는 것은 아니다.  RDF 스키마에서 데이터타입을 정의할 수 있는 방법은 없다.  2.4절에 지적한 바와 같이, 데이터타입은 RDF (그리고 RDF 스키마) 외부에서 정의되며, 그 URIref를 통하여 RDF 선언문에서 지시된다.  이 선언문은 단순히 해당 데이터타입의 존재를 기록하고, 이 스키마에서 해당 데이터타입이 사용되고 있음을 명시적으로 나타내는 역할을 한다. 


rdfs:domain 성질은 특정 성질이 지정된 클래스에 적용된다는 것을 지시하기 위해 사용된다.  예를 들어 만약 example.org에서 ex:author 성질을 ex:Book 클래스의 인스턴스에 적용된다는 것을 표현하고 싶다면, RDF 선언문은 다음과 같이 될 것이다.


ex:Book      rdf:type       rdfs:Class .

ex:author     rdf:type       rdf:Property .

ex:author     rdfs:domain  ex:Book .


이들 선언문은 ex:Book이 클래스이고, ex:author는 성질이며, ex:author 성질을 사용한 RDF 선언문은 ex:Book의 인스턴스를 주어로 가진다는 것을 의미한다.


예 를 들어 exterms:weight와 같은 특정 성질은 0과 1, 또는 복수의 영역성질을 가질 수 있다.  만약 exterms:weight가 영역성질을 가지고 있지 않다면 exterms:weight성질과 함께 사용되는 자원에 대해 말할 수 있는 것은 아무 것도 없다(어떤 자원도 exterms:weight 성질을 가질 수 있다).  만약 exterms:weight이 하나의 영역성질을 가지게 되면, 예를 들어 ex:Book을 영역성질로 지정하게 되면, 이것은 exterms:weight성질이 ex:Book클래스의 인스턴스가 되는 것을 의미하는 것이다.  만약 exterms:weight가 복수의 영역 성질을 가지고 있다면, 예를 들어 ex:Book과 ex:MotorVehicle이라는 두 가지를 영역으로 지정하게 되면, 이것은 exterms:weight성질을 가진 모든 자원은 이 영역으로 지정된 모든 클 래스의 인스턴스라는 것을 의미하는 것이다. 즉 exterms:weight 성질을 가진 모든 자원은 ex:Book 과 ex:MotorVehicle 라는두 개의 자원이다 (이것은 영역과 범위를 명시하는데 주의가 필요함을 입증하는 것이다).


rdfs:range 의 설명에서와 마찬가지로, 이 마지막 부분은 분명하지 않을 수도 있다.  그러나 exterms:weight 성질이 ex:Book과 ex:MotorVehicle이라는 두 영역을 가지고 있다고 하는 것은 다음과 같은 두 개의 독립된 선언문을 작성하는 것과 관련되어 있다.


exterms:weight   rdfs:domain   ex:Book .

exterms:weight   rdfs:domain   ex:MotorVehicle .


예를 들어 이 성질을 사용하여 다음과 같은 선언문을 작성할 수 있다.


exthings:companyCar   exterms:weight   "2500"^^xsd:integer .


두개의 rdfs:domain 선언문이 정확한 것이 되기 위해서는 exthings:companyCar가 ex:Book과 ex:MotorVehicle라는 영역의 인스턴스가 되어야만 한다.


자 동차 스키마(vehicle schema)를 확장하고, ex:registeredTo와 ex:rearSeatLegRoom이라는 두 개의 성질과 새로운 클래스인 ex:Person를 추가하고, 또 데이터타입인 xsd:integer를 하나의 데이터타입으로 명시적으로 기술함으로써 이들 범위와 영역을 기술(記述)한 사례를 볼 수 있다.  ex:registeredTo 성질은 모든 ex:MotorVehicle에 적용되며 그 값은 ex:Person이다.  이 예에서 ex:rearSeatLegRoom은 ex:PassengerVehicle 클래스의 인스턴스에만 적용된다.  그 값은 xsd:integer로서, 뒷좌석 다리공간의 길이를 센티미터로 표시한 것이다.  이것을 기술하면 다음의 예 26과 같다.


예 26: 자동차 스키마(Vehicle Schema)의 성질 기술 일부



<rdf:Property rdf:ID="registeredTo">

  <rdfs:domain rdf:resource="#MotorVehicle"/>

  <rdfs:range rdf:resource="#Person"/>

</rdf:Property>


<rdf:Property rdf:ID="rearSeatLegRoom">

  <rdfs:domain rdf:resource="#PassengerVehicle"/>

  <rdfs:range rdf:resource="&xsd;integer"/>

</rdf:Property>


<rdfs:Class rdf:ID="Person"/>


<rdfs:Datatype rdf:about="&xsd;integer"/>


<rdf:RDF> 요소가 예 26에 사용되지 않았음을 주목할 필요가 있다.  왜냐하면 이 RDF/XML은 예 24에 기술된 자동차 스키마에 추가되는 것으로 가정하기 때문이다.  이와 동일한 가정 하에 이 스키마의 다른 클래스를 참조하기 위하여 #MotorVehicle과 같은 상대 URIref를 사용할 수 있다.


RDF 스키마에서는 클래스는 물론 성질을 한정하는 방법을 제시하고 있다.  이와 같이 두 성질 간의 한정관계는 미리 정의된 rdfs:subPropertyOf 성질을 사용하여 기술된다.  예를 들어 만약 ex:primaryDriver와 ex:driver가 모두 성질이라면, example.org는 이들 성질을 기술하고, 아울러 ex:primaryDriver는 ex:driver를 한정한 것이라는 사실을 다음과 같은 RDF 선언문을 작성하여 기술할 수 있다.


ex:driver          rdf:type             rdf:Property .

ex:primaryDriver   rdf:type             rdf:Property .

ex:primaryDriver   rdfs:subPropertyOf   ex:driver .


rdfs:subPropertyOf 관계가 의미하는 것은, 만약 인스턴스 exstaff:fred가  인스턴스 ex:companyVan의 ex:primaryDriver라면, RDF 스키마는 exstaff:fred를 ex:companyVan의 ex:driver로도 정의하게 된다는 것이다.  이러한 성질을 기술한 RDF/XML은 (예 24에 기술된 자동차 스키마에 추가되는 것을 반대하여) 예 27과 같다.


예 27: 자동차 스키마(Vehicle Schema)에 대한 추가 성질


<rdf:Property rdf:ID="driver">

  <rdfs:domain rdf:resource="#MotorVehicle"/>

</rdf:Property>


<rdf:Property rdf:ID="primaryDriver">

  <rdfs:subPropertyOf rdf:resource="#driver"/>

</rdf:Property>




성 질은 0이나 1, 또는 그 이상의 성질의 하위성질일 수 있다.  RDF 성질에 적용되는 모든 RDF 스키마인 rdfs:range와 rdfs:domain 성질은 각각의 하위 성질에도 마찬가지로 적용된다.  따라서 위 예에서 RDF 스키마는 ex:primaryDriver가 ex:MotorVehicle의 rdfs:domain 성질도 역시 갖는다고 정의하고 있는데, 왜냐하면 ex:primaryDriver가 ex:driver에 대하여 하위성질 관계를 가지기 때문이다.

예 28에서는 위에 언급한 모든 기술을 포함한 자동차 스키마(vehicle schema) 전체의 RDF/XML를 보여주고 있다.


예 28: 자동차 스키마(Vehicle Schema) 전체



<?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:rdfs="http://www.w3.org/2000/01/rdf-schema#"

  xml:base="http://example.org/schemas/vehicles">


<rdfs:Class rdf:ID="MotorVehicle"/>


<rdfs:Class rdf:ID="PassengerVehicle">

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdfs:Class>


<rdfs:Class rdf:ID="Truck">

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdfs:Class>


<rdfs:Class rdf:ID="Van">

  <rdfs:subClassOf rdf:resource="#MotorVehicle"/>

</rdfs:Class>


<rdfs:Class rdf:ID="MiniVan">

  <rdfs:subClassOf rdf:resource="#Van"/>

  <rdfs:subClassOf rdf:resource="#PassengerVehicle"/>

</rdfs:Class>


<rdfs:Class rdf:ID="Person"/>


<rdfs:Datatype rdf:about="&xsd;integer"/>


<rdf:Property rdf:ID="registeredTo">

  <rdfs:domain rdf:resource="#MotorVehicle"/>

  <rdfs:range rdf:resource="#Person"/>

</rdf:Property>


<rdf:Property rdf:ID="rearSeatLegRoom">

  <rdfs:domain rdf:resource="#PassengerVehicle"/>

  <rdfs:range rdf:resource="&xsd;integer"/>

</rdf:Property>


<rdf:Property rdf:ID="driver">

  <rdfs:domain rdf:resource="#MotorVehicle"/>

</rdf:Property>


<rdf:Property rdf:ID="primaryDriver">

  <rdfs:subPropertyOf rdf:resource="#driver"/>

</rdf:Property>


</rdf:RDF>




RDF 스키마를 사용한 클래스와 성질의 기술방법을 설명했으므로, 이제 이 클래스와 성질을 사용한 인스턴스를 설명할 수 있을 것이다.  예를 들어 예 29에서는 예 28에 기술된 ex:PassengerVehicle 클래스의 인스턴스를 기술하고 있는데, 여기에는 이 클래스의 성질에 대한 몇 가지 가상의 값을 함께 기술하고 있다.


예 29: ex:PassengerVehicle의 인스턴스



<?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:ex="http://example.org/schemas/vehicles#"

            xml:base="http://example.org/things">


  <ex:PassengerVehicle rdf:ID="johnSmithsCar">

       <ex:registeredTo rdf:resource=

          "http://www.example.org/staffid/85740"/>

       <ex:rearSeatLegRoom

            rdf:datatype="&xsd;integer">127</ex:rearSeatLegRoom>

       <ex:primaryDriver rdf:resource=

          "http://www.example.org/staffid/85740"/>

  </ex:PassengerVehicle>

</rdf:RDF>




이 예에서는 인스턴스가 스키마와는 별개의 문서로 기술된다고 가정하고 있다.  이 스키마는 http://example.org/schemas/vehicles라는 xml:base를 가지고 있기 때문에 이름공간 선언부 xmlns:ex=http://example.org/schemas/vehicles#를 제 시하여 인스턴스 데이터에서 ex:registeredTo와 같은 QName을 이 스키마에 기술된 클래스와 성질의 URIref로 적절히 확장할 수 있다.  xml:base 선언부도 이 인스턴스에 대하여 제시되는데, 이를 통하여 rdf:ID="johnSmithsCar"를 실제 문서의 위치와는 무관하게 적절한 URIref로 전개하게 한다.


ex:PassengerVehicle 이 ex:MotorVehicle의 하위 클래스이므로 ex:registeredTo  성질을 사용하여 ex:PassengerVehicle의 이 인스턴스를 기술할 수 있음을 주목할 필요가 있다.  이 인스턴스의 ex:rearSeatLegRoom 성질 값으로 일반 리터럴이 아닌 (즉 <ex:rearSeatLegRoom>127</ex:rearSeatLegRoom>과 같은 값으로 기술하지 않고) 유형화된 리터럴이 사용되고 있음도 주목할 필요가 있다.  이 스키마가 이 성질의 범위를 xsd:integer로 기술하고 있기 때문에, 범위 기술과 일치되도록 이 성질 값은 이 데이터 타입의 유형화된 리터럴이어야 한다(즉 범위 선언부는  일반 리터럴에 자동으로 데이터타입을 “부여”하지는 않는다.  따라서 적절한 데이터타입의 유형화된 리터럴이 명시적으로 제시되어야만 한다). 4.4절에서 검토한 바와 같이 ex:rearSetLegRoom 성질의 단위 (센치미터)를 명시적으로 제시하기 위하여 스키마나 기타 부차적인 인스턴스 데이터로 된 추가 정보도 제시될 수 있다.

앞서 언급한 바와 같이, RDF 스키마 타입시스템은 어느 면에서는 Java와 같은 객체지향 프로그램 언어의 타입시스템과 유사하다.  그렇지만 RDF는 대부분 프로그램 언어의 타입시스템과는 몇 가지 중요한 면에서 다르다.


한 가지 중요한 차이는 RDF 스키마에서는 클래스를 특정 성질의 집합이라고 기술하는 대신, 영역(domain)범위(range) 성 질을 사용하여 자원의 특정 클래스에 적용하는 것으로 성질을 기술하고 있다.  예를 들면 전형적인 객체지향 프로그램 언어에서는 Book이라는 클래스를 Person이라는 타입 값을 가진 author라는 속성으로 정의할 수 있다.  이에 대응되는 RDF 스키마에서는 ex:Book 클래스를  기술하고, 다시 별도의 기술에서 ex:author 성질을 ex:Book이라는 영역과 ex:Person이라는 범위를 가진 것으로 기술하게 된다.


위의 두 가지 방법에서 차이는 단지 구문적인 문제로 보일 수 있으나, 사실 여기에는 중요한 차이점이 있다.  프로그래밍 언어의 클래스 기술에서, 속성 author는 Book 클래스 기술의 일부이며 단지 Book 클래스의 인스턴스에만 적용된다.  또 다른 클래스(예를 들어 softwareModule)도 역시 author라는 속성을 가질 수 있으나 이것은 다른 속성이라고 할 수 있다.  다시 말하여 대부분의 프로그래밍 언어에서 속성기술의 범위(scope)는 그 속성이 정의된 클래스나 타입으로 한정된다.  반면 RDF의 성질기술은 기본적으로 클래스 정의와는 독립적이며, 역시 기본적으로 전역(global) 범위에 해당된다 (비록 영역 지정(domain specifications)을 하여 특정 클래스에만 적용되도록 선택적으로 선언될 수도 있으나).


결 과적으로 RDF 스키마는 영역을 명시하지 않고도 exterms:weight라는 성질을 기술할 수 있다.  따라서 이 성질을 사용하여 무게를 가진 모든 클래스의 인스턴스를 기술할 수 있다.  RDF 성질기반 접근방법의 장점 중 하나는 최초 기술 시에 미처 예상 못했던 상황에 성질 정의를 확장하여 사용하는 것이 훨씬 용이하다는 것이다.  동시에, 이 "장점"은 성질이 부적절한 상황에 잘못 적용되지 않도록 각별히 주의하여 사용되어야 한다.


RDF 성질 기술의 전역 범위의 또 다른 결과로, RDF 스키마에서는 특정 성질을 그 성질이 적용되는 자원의 클래스마다 개별적으로 그 범위를 달리하여 정의하는 것은 불가능하다.  예를 들면 ex:hasParent 성질을 정의할 때, 만약 이 성질을 사용하여 ex:Human 클래스의 자원을 기술한다면, 이 성질의 범위 역시 ex:Human 클래스의 자원이라고 해석하는 것이 바람직할 것이다.  한편 동일한 성질을 사용하여 ex:Tiger 클래스의 자원을 기술한다면, 이 성질의 범위 역시 ex:Tiger 클래스의 자원이라고 해석하는 것이다. 이런 종류의 정의를 RDF 스키마에서는 할 수 없다.  그 대신 RDF 성질로 정의된 어떤 범위든 그 성질을 사용하는 모든 경 우에 적용되므로 범위를 신중히 정의해야 한다.  그러나 이와 같이 RDF 스키마에서는 개별적으로 다른 범위를 정의할 수 없지만, <a href="#richerschemas">5.5절</a>에서 지적하고 있는 고급 스키마 언어 중 일부에서는 이와 같은 정의가 가능하기도 하다.