W3C

SKOS Core Guide

Editor's Draft 22 October 2004

This version:
http://www.w3.org/2004/02/skos/core/guide/2004-10-22
Latest version:
http://www.w3.org/2004/02/skos/core/guide/
Previous version:
http://www.w3.org/2004/02/skos/core/guide/2004-09-07
Editors:
Alistair Miles, CCLRC
Dan Brickley, W3C

Abstract

This document is a guide to using the SKOS Core vocabulary. SKOS Core is an RDF vocabulary for describing thesauri, terminologies, controlled vocabularies and similar types of knowledge organisation systems.

The 'Quick Start' section of this guide introduces the basic features of SKOS Core, including how to declare concepts and concept schemes, label concepts, declare semantic relationships, and publish your scheme on the semantic web.

The 'Advanced Features' section of this guide includes a description of how to extend SKOS Core to create your own labelling or semantic relation properties, how to define ordered and/or labelled collections of concepts, how to describe scheme versions, and how to connect a SKOS concept scheme to an ontology.


Status of this Document

This section describes the status of this document at the time of its publication.

This document is an Editor's Draft for review by the Semantic Web Best Practices and Deployment Working Group (hereafter 'the Working Group') and the participants of the public-esw-thes@w3.org mailing list and is subject to change without notice. This document has no formal standing within W3C. Please consult the Working Group's home page and the W3C technical reports index for information about the latest publications by this group. This document may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This document is published by the Semantic Web Best Practices and Deployment Working Group, part of the W3C Semantic Web Activity. The Working Group intends the SKOS Core Guide to become a W3C Working Group Note. However, other outcomes are possible within the framework of the W3C process and will be considered in response to deployment experience and feedback from the W3C membership. The Working Group has discussed the potential for SKOS Core to evolve into possible future W3C Recommendation Track work items, and would value feedback on the level of formal standardization that is appropriate.

We encourage public comments. Please send comments to public-esw-thes@w3.org [archive] and start the subject line of the message with "comment:".

Publication as a Working Draft does not imply endorsement by the W3C Membership.


Contents

@@TODO


Introduction

What is SKOS Core ?

SKOS Core is an RDF vocabulary for describing ...

It can also be used for ...

Thesauri, taxonomies, classification schemes etc. are collectively known as 'knowledge organisation systems' or 'KOS' ... which is the root of the name 'SKOS'.

Why Publish in RDF?

If you publish your KOS on the web in a human-readable form, other people will be able to use it for manual tasks. If you publish your KOS on the web in a machine-readable form, other people will be able to use within their computer programs and applications.

Publishing structured information on the web in a machine-readable form is the fundamental principle of the 'semantic web'.

The Resource Description Framework (RDF) is the W3C recommended standard for publishing structured information on the web.

What is an RDF Vocabulary?

An RDF vocabulary is a set of 'classes' and 'properties' that allow you create an 'RDF description' of something. For example, the Dublin Core element set is an RDF vocabulary for describing document metadata. The Friend of a Friend (FOAF) vocabulary is an RDF vocabulary for describing people and social networks.

This guide will introduce you to creating RDF descriptions of knowledge organisation systems, using the SKOS Core vocabulary.

Do I Need to Know RDF to Read This Guide?

To use the 'quick start' section of this guide, you do not need to understand the abstract model underlying RDF, but it helps.

To use the 'advanced features' section of this guide, you do need at least a basic understanding of the graph data model, and the use of RDF schema to declare new classes and properties.

The RDF Primer [ref] is a good place to start with RDF, links to other tutorials can be found on DBRP [ref].

RDF and XML?

RDF has an abstract model [ref], which is based on the 'directed labelled graph'.

Because RDF has an abstract model, it can be serialised (i.e. written down) in several alternative ways.

The three most commonly used syntaxes for serialising RDF data are:

The examples in this guide are all written in the RDF/XML syntax, for consistency. But bear in mind that SKOS Core is NOT an XML syntax for knowledge organisation systems - it is an RDF vocabulary for describing knowledge organisation systems ... that can of course be serialised using any of the RDF syntaxes.

Understanding the RDF statements that a snippet of RDF/XML or N3 represents is the key to unlocking the power of RDF.


Part 1 - Quick Start


Declaring Concepts

The 'concept' is the fundamental unit you can describe using SKOS Core.

An RDF description of a concept begins with something like the following:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#">
  
  <skos:Concept rdf:about="http://my.example.org/biology/evolution#concept"/>

</rdf:RDF>

It is worth noting that the above snippet of RDF/XML is the equivalent shorthand form of the following:

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
 
  <rdf:Description rdf:about="http://my.example.org/biology/evolution#concept">
    <rdf:type rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdf:Description>
  
</rdf:RDF>

In this guide, the shorthand form is used throughout for clarity.

Also note that the URI http://my.example.org/knowledgebase/biology#evolution is here an identifier for an abstract concept. It is not the URL of a document fragment.

For more on URIs for concepts, see the later section [ref concept URIs].


Labelling Concepts

To describe the preferred and alternative labels for a concept, do for example the following:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#">
  
  <skos:Concept rdf:about="http://my.example.org/bloggers/topics#102">
    <skos:prefLabel>Semantic Web</skos:prefLabel>
    <skos:altLabel>SemWeb</skos:altLabel>
    <skos:altLabel>SW</skos:altLabel>
  </skos:Concept>

</rdf:RDF>

Another example, adapted from the UK Government Category List [ref], would be:

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

  <skos:Concept rdf:about="http://my.example.org/GCL/492#concept">
    <skos:prefLabel>Equal opportunities and diversity</skos:prefLabel>
    <skos:altLabel>Positive discrimination (equal opportunities)</skos:altLabel>
    <skos:altLabel>Racial discrimination (education opportunities)</skos:altLabel>
    <skos:altLabel>Racial discrimination (employment opportunities)</skos:altLabel>
    <skos:altLabel>Racial equality</skos:altLabel>
    <skos:altLabel>Religious discrimination (education and employment)</skos:altLabel>
    <skos:altLabel>Sexual discrimination (education opportunities)</skos:altLabel>
    <skos:altLabel>Sexual discrimination (employment opportunities)</skos:altLabel>
    <skos:altLabel>Discrimination by sex, race, religion, etc</skos:altLabel>
    <skos:altLabel>Diversity (equal opportunities)</skos:altLabel>
    <skos:altLabel>Affirmative action (equal opportunities)</skos:altLabel>
  </skos:Concept>
  
</rdf:RDF>

Note that a concept may have no more than one preferred label per language (see also the section [multilingual concept schemes]).


Notes, Definitions, Examples, Depictions ...

There are eight note properties in SKOS Core, explained with simple examples below.

See also the section [advanced notes] later in this guide.

Scope Notes

A scope note is a piece of text that helps to clarify the meaning of a concept.

For example (adapted from the GCL [ref] and AAT [ref] respectively):

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

  <skos:Concept rdf:about="http://my.example.org/GCL/702#concept">
    <skos:prefLabel>Competitiveness</skos:prefLabel>
    <skos:scopeNote>The ability of businesses to compete in local, national or international markets.</skos:scopeNote>
  </skos:Concept>

  <skos:Concept rdf:about="http://my.example.org/AAT/300020656#concept">
    <skos:prefLabel>European</skos:prefLabel>
    <skos:scopeNote>Refers to the cultures of the continent of Europe, which is in the northern hemisphere,
    is bounded by the Arctic Ocean, the Atlantic Ocean, and the Mediterranean Sea, and is generally considered 
    to be delimited on the east by the Ural Mountains.</skos:scopeNote>
  </skos:Concept>

</rdf:RDF>

Definitions

A definition is an attempt to make a complete explanation of the meaning of a concept.

For example (adapted from CALD [ref]):

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

  <skos:Concept rdf:about="http://my.example.org/banana#concept">
    <skos:prefLabel>banana</skos:prefLabel>
    <skos:definition>A long curved fruit with a yellow skin and soft, sweet white flesh inside.</skos:definition>
  </skos:Concept>

  <skos:Concept rdf:about="http://my.example.org/bananarepublic#concept">
    <skos:prefLabel>banana republic</skos:prefLabel>
    <skos:definition>A small country, especially in South and Central America, that is poor and often badly 
    and immorally ruled.</skos:definition>
  </skos:Concept>

</rdf:RDF>

Examples

An example is any instance of the use of a concept, that helps to illustrate its meaning and intended usage. For example:

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

  <skos:Concept rdf:about="http://my.example.org/banana#concept">
    <skos:prefLabel xml:lang="en">banana</skos:prefLabel>
    <skos:example xml:lang="en">a bunch of bananas</skos:example>
    <skos:example xml:lang="en">banana milkshake</skos:example>
  </skos:Concept>

</rdf:RDF>

History Notes

A history note describes information about the past form, meaning and/or use of a concept. For example:

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

  <skos:Concept rdf:about="http://my.example.org/electricalgoods/878#concept">
    <skos:prefLabel>notebook computers</skos:prefLabel>
    <skos:historyNote>Before 1999 the preferred label for this concept was “laptop computersâ€_.</skos:historyNote>
  </skos:Concept>

</rdf:RDF>

Editorial Notes

An editorial note is any note intended for the internal use of the editor and/or editorial team. For example:

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

  <skos:Concept rdf:about="http://my.example.org/electricalgoods/878#concept">
    <skos:prefLabel>notebook computers</skos:prefLabel>
    <skos:editorialNote>Scope has been queried by Mr Smith. To be reviewed at meeting on 2004-10-20.</skos:editorialNote>
  </skos:Concept>

</rdf:RDF>

Change Notes

A change note is a note describing a change made to a concept. For example:

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

  <skos:Concept rdf:about="http://my.example.org/electricalgoods/878#concept">
    <skos:prefLabel xml:lang="en">notebook computers</skos:prefLabel>
    <skos:changeNote xml:lang="en">The preferred label for this concept changed from 'laptop computers' to 'notebook computers' on 23 Jan 1999.</skos:changeNote>
  </skos:Concept>

</rdf:RDF>

Whereas a history note is intended for public consumption, change notes are usually private notes used to document fine grained changes to concepts, primarily to support the work of the editorial team.

Public Notes

A public note is a general note intended for public consumption. The skos:publicNote property may be used directly, but it is primarily intended to be used as the root of a property hierarchy: skos:scopeNote, skos:definition, skos:example, skos:historyNote are all sub-properties of skos:publicNote.

See the section [extended note properties] for more information on creating custom extensions of the SKOS Core note properties.

Private Notes

A private note is a general note NOT intended for public consumption. The skos:privateNote property may be used directly, but it is primarily intended to be used as the root of a property hierarchy: skos:editorialNote and skos:changeNote are sub-properties of skos:privateNote.

See the section [extended note properties] for more information on creating custom extensions of the SKOS Core note properties.

Depictions

To describe a link between a concept, and an image depicting that concept, you can use the foaf:depiction property. For example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">

  <skos:Concept rdf:about="http://my.example.org/biology/spottedbowerbird#concept">
    <skos:prefLabel>Spotted Bowerbird</skos:prefLabel>
    <skos:altLabel>Chlamydera maculata</skos:altLabel>
    <foaf:depiction rdf:resource="http://my.example.org/depictions/spottedbowerbird1.jpg"/>
  </skos:Concept>
  
</rdf:RDF>

The Friend of a Friend (FOAF) vocabulary [ref] is another RDF vocabulary, with classes and properties for describing people and social networks. The foaf:depiction property is a general purpose property for describing a link between a resource and an image depicting that resource, and so is suitable for the purpose described here.

The SKOS Core vocabulary tries not to duplicate classes or properties already present in other well established RDF vocabularies.


Concept Hierarchies and Associative Relationships

This section describes how to declare relationships between concepts.

See also the section [custom semantic relation properties].

Hierarchies

To describe the fact that one concept is 'broader' in sense than another (i.e. is more general in scope), do for example (adapted from GCL [ref]):

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

   <skos:Concept rdf:about="http://my.example.org/GCL/462#concept">
      <skos:prefLabel>Tourism</skos:prefLabel>
      <skos:broader rdf:resource="http://my.example.org/GCL/616#concept"/>
      <skos:broader rdf:resource="http://my.example.org/GCL/705#concept"/>
   </skos:Concept>

   <skos:Concept rdf:about="http://my.example.org/GCL/616#concept">
      <skos:prefLabel>Arts, recreation and travel</skos:prefLabel>
   </skos:Concept>

   <skos:Concept rdf:about="http://my.example.org/GCL/705#concept">
      <skos:prefLabel>Distribution and service industries</skos:prefLabel>
   </skos:Concept>

</rdf:RDF>

To describe the fact that one concept is 'narrower' in sense than another (i.e. is more specific in scope), do for example (adapted from PACS [ref]):

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

  <skos:Concept rdf:about="http://my.example.org/PACS/40.#concept">
    <skos:prefLabel>ELECTROMAGNETISM, OPTICS, ACOUSTICS, HEAT TRANSFER, CLASSICAL MECHANICS, AND FLUID DYNAMICS</skos:prefLabel>
    <skos:narrower rdf:resource="http://my.example.org/scheme/concept/PACS41."/>
  </skos:Concept>

  <skos:Concept rdf:about="http://my.example.org/PACS/41.#concept">
    <skos:prefLabel>Electromagnetism; electron and ion optics</skos:prefLabel>
    <skos:narrower rdf:resource="http://my.example.org/PACS/41.50.+h#concept"/>
  </skos:Concept>

  <skos:Concept rdf:about="http://my.example.org/PACS/41.50.+h#concept">
    <skos:prefLabel>X-ray beams and x-ray optics</skos:prefLabel>
  </skos:Concept>

</rdf:RDF>

Note that skos:narrower and skos:broader should be implementated as each other's inverse.

Associative Relationships

To describe the fact that one concept is 'related' in sense to another, do for example (adapted from AAT [ref]):

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

  <skos:Concept rdf:about="http://my.example.org/AAT/300185689#concept">
    <skos:prefLabel xml:lang="en">armed conflicts</skos:prefLabel>
    <skos:related rdf:resource="http://my.example.org/AAT/300230820#concept"/>
    <skos:related rdf:resource="http://my.example.org/AAT/300055312#concept"/>
  </skos:Concept>          

  <skos:Concept rdf:about="http://my.example.org/AAT/300230820#concept">
    <skos:prefLabel xml:lang="en">jousts</skos:prefLabel>
    <skos:related rdf:resource="http://my.example.org/AAT/300185689#concept"/>
  </skos:Concept>          

  <skos:Concept rdf:about="http://my.example.org/AAT/300055312#concept">
    <skos:prefLabel xml:lang="en">revolutions</skos:prefLabel>
    <skos:related rdf:resource="http://my.example.org/AAT/300185689#concept"/>
  </skos:Concept>

</rdf:RDF>

Note that skos:related should be implementated as a symmetric property.


Describing a Concept Scheme

To describe the basic properties of a concept scheme, do for example the following:

<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
          xmlns:skos="http://www.w3.org/2004/02/skos/core#"
          xmlns:dc="http://purl.org/dc/elements/1.1/"
          xmlns:foaf="http://xmlns.com/foaf/0.1/">
         
  <skos:ConceptScheme rdf:about="http://my.example.org/thesaurus">
    <dc:title xml:lang="en">My Example Thesaurus</dc:title>
    <dc:description xml:lang="en">An example thesaurus invented for the SKOS Core guide.</dc:description>
    <!-- Unqualified-style use of Dublin Core: -->
    <dc:creator>Alistair Miles</dc:creator>
    <!-- Qualified-style use of Dublin Core with FOAF: -->
    <dc:creator>
      <foaf:Person>
        <foaf:name>Alistair Miles</foaf:name>
        <foaf:mbox rdf:resource="mailto:a.j.miles@rl.ac.uk"/>
      </foaf:Person>
    </dc:creator>
    <dc:rights xml:lang="en">Copyright © 2004 Alistair Miles. All rights reserved.</dc:rights>
  </skos:ConceptScheme>

</rdf:RDF>

Note that in the example above, Dublin Core properties have been used. In fact any properties from any RDF vocabulary may be used in a description of a concept scheme ... this is the nature of RDF. However, it is generally a good idea to use properties from well-established vocabularies, wherever possible.

Both the Dublin Core element set [ref] and the Dublin Core terms vocabulary [ref] have a number of properties suitable for describing the basic properties of a concept scheme (e.g. dc:publisher, dcterms:audience, dcterms:issued etc.)

If your concept scheme has some structure (i.e. is not just a flat list of concepts) then the top level concepts in the scheme should be identified within the description of the concept scheme. The top level concepts are the concepts that sit at the top of the broader/narrower hierarchies. This means extending the description of the concept scheme to include, for example, the following:

<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
          xmlns:skos="http://www.w3.org/2004/02/skos/core#"
          xmlns:dc="http://purl.org/dc/elements/1.1/"
          xmlns:foaf="http://xmlns.com/foaf/0.1/">
         
  <skos:ConceptScheme rdf:about="http://my.example.org/thesaurus">
    <!-- Other properties of the concept scheme ... -->
    <skos:hasTopConcept rdf:resource="http://my.example.org/thesaurus/activities#concept"/>
    <skos:hasTopConcept rdf:resource="http://my.example.org/thesaurus/processes#concept"/>
    <skos:hasTopConcept rdf:resource="http://my.example.org/thesaurus/objects#concept"/>
    <skos:hasTopConcept rdf:resource="http://my.example.org/thesaurus/periods#concept"/>
    <skos:hasTopConcept rdf:resource="http://my.example.org/thesaurus/materials#concept"/>
  </skos:ConceptScheme>

</rdf:RDF>

Once you have identified and described your concept scheme, you will want to include an extra statement in the description of each of your concepts:

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

  <skos:Concept rdf:about="http://my.example.org/thesaurus/materials#concept">
    <!-- Other properties of the concept ... -->
    <skos:inScheme rdf:resource="http://my.example.org/thesaurus"/>
  </skos:Concept>

</rdf:RDF>

This extra statement expresses the fact that the concept is a part of the given concept scheme. See also the section [concepts on the semantic web/ multiple schemes].


Multilingual Concept Schemes

To describe the languages covered by a multilingual concept scheme, you can use the dc:language property, for example:

<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
          xmlns:skos="http://www.w3.org/2004/02/skos/core#"
          xmlns:dc="http://purl.org/dc/elements/1.1/"
          xmlns:dcterms="http://purl.org/dc/terms/">
         
  <skos:ConceptScheme rdf:about="http://my.example.org/thesaurus">
    <!-- Other properties of the concept scheme ... -->
    <dc:language>
      <dcterms:RFC1766>
        <rdf:value>EN</rdf:value>
        <rdfs:label>English</rdfs:label>
      </dcterms:RFC1766>
    </dc:language>
    <dc:language>
      <dcterms:RFC1766>
        <rdf:value>FR</rdf:value>
        <rdfs:label>French</rdfs:label>
      </dcterms:RFC1766>
    </dc:language>
    <!-- Other languages etc. -->
  </skos:ConceptScheme>

</rdf:RDF>

Multilingual Labelling

A concept may be assigned labels from more than one language. For example (adapted from HPMULTI [ref]):

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

  <skos:Concept rdf:about="http://my.example.org/thesaurus/advertising#concept">
    <skos:prefLabel xml:lang="en">Advertising</skos:prefLabel>
    <skos:altLabel xml:lang="en">Publicity</skos:altLabel>
    <skos:prefLabel xml:lang="fr">Publicité</skos:prefLabel>
    <skos:prefLabel xml:lang="da">Annoncering</skos:prefLabel>
    <skos:prefLabel xml:lang="ne">Reclame</skos:prefLabel>
    <skos:prefLabel xml:lang="fi">Mainonta</skos:prefLabel>
    <skos:prefLabel xml:lang="ge">Werbung</skos:prefLabel>
  </skos:Concept>

</rdf:RDF>

The xml:lang attribute can be used as defined by [ref].

Note that the multilingual labelling method ignores the subtle (and sometimes not so subtle) distinctions in meaning that are embedded in a particular language. If you want to capture these subtleties, you will need to use the inter-lingual mapping method [ref], where a separate set of concepts is defined for each language component of the thesaurus, and mappings are defined between the components.


Symbolic Concept Schemes

To describe the preferred and alternative symbolic labels for a concept, do for example:

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

   <skos:Concept rdf:about="http://example.org/scheme/concept#banana">
      <skos:prefSymbol rdf:resource="http://example.org/scheme/symbol/banana1.jpg"/>
      <skos:altSymbol rdf:resource="http://example.org/scheme/symbol/banana2.jpg"/>
      <skos:altSymbol rdf:resource="http://example.org/scheme/symbol/banana3.jpg"/>
   </skos:Concept>   

</rdf:RDF>

Note that skos:prefSymbol and skos:altSymbol allow you to state the preferred and alternative symbolic labels for a concept, which is different from a depiction of a concept. E.g. the set of UK road traffic signs could be modelled as a set of symbolic labels for road safety concepts; some of the signs depict the concept they represent (e.g. 'slippery road') and some don't (e.g. 'no entry').


Publishing Concepts on the Semantic Web

The simplest way to publish your concepts is:

Whether the serialization uses the RDF/XML, N3 N-Triples RDF syntax doesn't matter ... all RDF toolkits can parse these syntaxes.

Note that the RDF description of your concept scheme does not necessarily have to be contained in a single file. It is perfectly acceptable to have concepts declared in one file referencing concepts or a concept scheme declared in another.

Resolving URIs

If you have used an HTTP URI to identify your concept scheme, then you can set up your web server so that the URI identifying the concept scheme resolves to an HTML or RDF (or ideally content-negotiable) description of the scheme itself.

If you have used HTTP URIs to identify your concepts, then you can set up your web server so that each concept URI resolves to an HTML or RDF (or ideally content-negotiable) description of that concept.

Having scheme and concept URIs resolve to useful resources can make your scheme much more accessilbe to new users.

See the section [concept URIs] for further discussion of options here.


Subject-Based Indexing with SKOS Concepts

To declare that a concept is the 'subject' of a document, do for example:

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

  <rdf:Description rdf:about="http://my.example.org/aDocument.html">
    <skos:subject rdf:resource="http://my.example.org/GCL/462#concept"/>
  </rdf:Description>

</rdf:RDF>

The skos:subject property is a sub-property of dc:subject, and carries the same meaning.

Alternatively, you can state for example:

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

  <rdf:Description rdf:about="http://my.example.org/GCL/462#concept">
    <skos:isSubjectOf rdf:resource="http://my.example.org/aDocument.html"/>
  </rdf:Description>

</rdf:RDF>

The skos:subject and skos:isSubjectOf properties are each other's inverse.

A document may have any number of subjects. To express the fact that some concept is the primary subject of a document, do for example:

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

  <rdf:Description rdf:about="http://my.example.org/aDocument.html">
    <skos:primarySubject rdf:resource="http://my.example.org/GCL/701#concept"/>
  </rdf:Description>

</rdf:RDF>

A document should have only one skos:primarySubject property per concept scheme.

The property skos:isPrimarySubjectOf is the inverse of skos:primarySubject.

Additionally, the following rule applies to skos:subject:

(?document skos:subject ?y) (?y skos:broader ?z)
->
(?document skos:subject ?z)


Part 2 - Advanced Features


Ordered/Labelled Collections of Concepts

Some concept schemes collect groups of concepts under a label, where the label does not denote a concept in its own right. These labels are often called 'node labels' or 'guide terms'. For example:

@@TODO extract from AAT or THA

To represent this kind of structure, do for example:

@@TODO example of using skos:Collection with skos:member

Collections may also be nested, for example:

@@TODO example of nested collections.

In the above examples, the order of the members of a collection is not significant. To represent an ordered collection, do for example:

@@TODO example of ordered collection

An ordered collection may have an rdfs:label property, but it is not necessary.

Below is an example of nested ordered labelled collections:

@@TODO nested ordered labelled collections.

Note that, for ordered collections, the following rule applies:

list rule for skos:member

Note also that, for all properties of type skos:CollectableProperty e.g. skos:narrower the following rule applies:

collectable property rule


Advanced Notes

This section describes more advanced ways of using the SKOS Core note properties.

The SKOS Core note properties can be used in three ways:

  1. Simple Literal
  2. Structured
  3. URL Reference

Simple Literal Notes

A simple literal note as an RDF literal as the value of the note property, e.g.:

e.g.

Note that RDF literals may have language tags, so you could have e.g.:

e.g. with language tag

The section [basic notes] illustrates only the simple literal style usage of the SKOS Core note properties.

Structured Notes

A structured note takes a blank node as the value of the note property, e.g.:

e.g.

This style allows you to express additional information about the note in a structured way, such as the date of a history note. As always, any RDF vocabulary such as Dublin Core may be used to describe the properties of a structured note.

URL Reference Notes

A URL reference note takes the URL of a web resource as the value of the note property, e.g.:

e.g.

This style allows you to refer to definitions, examples etc. contained in published web resources.

Note that in the above example additional metadata about the note has been included in the description of the note. This is not compulsory, but is often valuable.


Extending SKOS Core

Because SKOS Core is an RDF vocabulary, it can be extended. This means you can create more specific classes and properties to describe your concept scheme, but still have a description that is compatible with other SKOS descriptions.

An RDF vocabulary is extended by declaring new RDF classes and/or properties, and linking them to classes/properties in the parent vocabulary via rdfs:subClassOf and rdfs:subPropertyOf.

The sections below illustrate how this can be done, to satisfy some common requirements.

Extended Labelling Properties

The SKOS Core vocabulary includes two properties for assigning labels to concepts: skos:prefLabel and skos:altLabel.

You may, however, want a richer set of labelling propeties.

For example, you might want to express the fact that one term is the scientific name for a concept, and another term is the common name for the same concept. To do this, you would declare two new properties, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  
  <rdf:Property rdf:about="http://my.example.org/schema#scientificName">
    <rdfs:comment>A scientific name for the concept.</rdfs:comment>
    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2004/02/skos/core#prefLabel"/>
  </rdf:Property>

  <rdf:Property rdf:about="http://my.example.org/schema#commonName">
    <rdfs:comment>A common (non-scientific) name for the concept.</rdfs:comment>
    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2004/02/skos/core#altLabel"/>
  </rdf:Property>

</rdf:RDF>

These new properties could then be used as in:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:my="http://my.example.org/schema#">

  <skos:Concept rdf:about="http://my.example.org/biology/spottedbowerbird#concept">
    <my:scientificName>Chlamydera maculata</my:scientificName>
    <my:commonName>Spotted bowerbird</my:commonName>
  </skos:Concept>

</rdf:RDF>

Which of the two SKOS Core labelling properties you extend is a matter of choice, but bear in mind that a concept may have at most only one value of the property skos:prefLabel per language, so the same will apply for any sub-property of skos:prefLabel.

Extended Semantic Relation Properties

SKOS Core has three built-in properties for expressing relationships between concepts: skos:broader, skos:narrower and skos:related.

You may, however, require a richer set of properties for expressing relationships between concepts.

For example, you might want to express the fact one concept represents something that is a part of another concept. This is also known as a partitive relationship.

To do this, define two new properties, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:owl="http://www.w3.org/2002/07/owl#">
  
  <rdf:Property rdf:about="http://my.example.org/schema#isPartOf">
    <rdfs:comment>Expresses a partitive relationship between two concepts.</rdfs:comment>
    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2004/02/skos/core#broader"/>
    <owl:inverseOf rdf:resource="http://my.example.org/schema#hasPart"/>
  </rdf:Property>

  <rdf:Property rdf:about="http://my.example.org/schema#hasPart">
    <rdfs:comment>Expresses a partitive relationship between two concepts.</rdfs:comment>
    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2004/02/skos/core#narrower"/>
    <owl:inverseOf rdf:resource="http://my.example.org/schema#isPartOf"/>
  </rdf:Property>

</rdf:RDF>

Note that these two properties have been declared as each other's inverse via a statement using the owl:inverseOf property.

Note also that these two properties extend skos:broader and skos:narrower respectively. This means that partitive relationships between concepts will be rendered as part of the concept hierarchy by generic SKOS applications. An alternative would be to extend skos:related instead, in which case the partitive relationship would be rendered alongside other associative relationships by generic SKOS applications.

Whether you choose to extend skos:broader, skos:narrower or skos:related will depend on how you want these relationships to be handled by generic SKOS applications.

These two properties can now be used as in e.g.:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:my="http://my.example.org/schema#">

  <skos:Concept rdf:about="http://my.example.org/geography#UK">
    <skos:prefLabel>United Kingdom of Great Britain and Northern Ireland</skos:prefLabel>
    <my:isPartOf rdf:resource="http://my.example.org/geography#Europe"/>
  </skos:Concept>
  
  <skos:Concept rdf:about="http://my.example.org/geography#Europe">
    <skos:prefLabel>Europe</skos:prefLabel>
    <my:hasPart rdf:resource="http://my.example.org/geography#UK"/>
  </skos:Concept>

</rdf:RDF>

N.B. the SKOS Extensions RDF vocabulary [ref] has a set of standard semantic relation property extensions, such as 'broader-instantive' 'broader-generic' and 'broader-partitive'.

Extended Concept Types

This section describes how to extend the skos:Concept class to create more specific classes of concept.

An example of an extension of skos:Concept is below:

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

  <rdfs:Class rdf:about="http://my.example.org/schema#BiologicalConcept">
    <rdfs:comment>A concept from the domain of biology.</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

</rdf:RDF>

Once this new class has been declared, it can be used as in:

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:my="http://my.example.org/schema#">

  <my:BiologicalConcept rdf:about="http://my.example.org/biology#evolution">
    <skos:prefLabel>Evolution</skos:prefLabel>
    <skos:scopeNote>Refers to Darwin's theory of evolution by natural selection of inherited characteristics.</skos:scopeNote>
  </my:BiologicalConcept>

</rdf:RDF>

I.e. you can use the new class my:BiologicalConcept exactly as you would normally use skos:Concept.

Fundamental Facets

An important use case for this type of extension is in the representation of fundamental facets within a concept scheme.

In a concept scheme ordered according to fundamental facets, each fundamental facet contains a homogeneous class of concepts, the members of which share characteristics that distinguish them from members of other classes [ref AAT].

So, for example, the Art & Architecture Thesaurus [ref] declares the following fundamental facets:

ASSOCIATED CONCEPTS
PHYSICAL ATTRIBUTES
STYLES AND PERIODS
AGENTS
ACTIVITIES
MATERIALS
OBJECTS

To represent fundamental facets in RDF, declare an extension of skos:Concept for each facet, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  
  <rdfs:Class rdf:about="http://my.example.org/schema#AssociatedConcept">
    <rdfs:comment>???</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

  <rdfs:Class rdf:about="http://my.example.org/schema#PhysicalAttributesConcept">
    <rdfs:comment>???</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

  <rdfs:Class rdf:about="http://my.example.org/schema#StylesAndPeriodsConcept">
    <rdfs:comment>???</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

  <rdfs:Class rdf:about="http://my.example.org/schema#AgentsConcept">
    <rdfs:comment>???</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

  <rdfs:Class rdf:about="http://my.example.org/schema#ActivitiesConcept">
    <rdfs:comment>???</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

  <rdfs:Class rdf:about="http://my.example.org/schema#MaterialsConcept">
    <rdfs:comment>???</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

  <rdfs:Class rdf:about="http://my.example.org/schema#ObjectsConcept">
    <rdfs:comment>???</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/>
  </rdfs:Class>

</rdf:RDF>

Each of these new classes can be used to declare concepts, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:my="http://my.example.org/schema#">

  <my:StylesAndPeriodsConcept rdf:about="http://my.example.org/concept#prehistoric">
    <skos:prefLabel>Prehistoric</skos:prefLabel>
    <skos:scopeNote>Refers to the period antecedent to the first contemporary written accounts of a people. The time span for this period varies according to specific local habitation patterns and in different scholarly disciplines.</skos:scopeNote>
  </my:StylesAndPeriodsConcept>

</rdf:RDF>

To support stronger validation of your faceted concept scheme, you can use OWL to explicitly declare that a concept may not be a member of more than one fundamental facet, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:owl="http://www.w3.org/2002/07/owl#">
  
  <rdfs:Class rdf:about="http://my.example.org/schema#AssociatedConcept">
    <owl:disjointWith rdf:resource="http://my.example.org/schema#PhysicalAttributesConcept"/>
    <owl:disjointWith rdf:resource="http://my.example.org/schema#StylesAndPeriodsConcept"/>
    <owl:disjointWith rdf:resource="http://my.example.org/schema#AgentsConcept"/>
    <owl:disjointWith rdf:resource="http://my.example.org/schema#ActivitiesConcept"/>
    <owl:disjointWith rdf:resource="http://my.example.org/schema#MaterialsConcept"/>
    <owl:disjointWith rdf:resource="http://my.example.org/schema#ObjectsConcept"/>
  </rdfs:Class>

</rdf:RDF>

Obviously a similar declaration must be made for each of the concept classes you intend to use as a fundamental facet.

Extended Note Properties

SKOS Core has eight built-in note properties: skos:publicNote, skos:definition, skos:example, skos:scopeNote, skos:historyNote, skos:privateNote, skos:changeNote and skos:editorialNote.

The basic use of these properties is described in [section notes]. The advanced use of these properties is described in [section advnaced notes].

These properties, as with all SKOS Core properties, can be extended to define more specific note types.

So, for example, you might want to have a specific note type for describing the move (relocation) of a concept from one part of the hierarchy to another. To do this, describe a new property e.g.:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  
  <rdf:Property rdf:about="http://my.example.org/knowledgebase/schema#relocationNote">
    <rdfs:comment>A note about the relocation of the concept within the hierarchy.</rdfs:comment>
    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/2004/02/skos/core#historyNote"/>
  </rdf:Property>

</rdf:RDF>

This property can now be used in exactly the same way as the built-in SKOS Core note properties.

Note that this example property is an extension of skos:historyNote, which is an appropriate choice as it represents some sort of historical information about the concept. However, the choice of which SKOS note property to extend is entirely open. Typically, you will want to extend either skos:publicNote or skos:privateNote depending on whether you want your note to be published.


Concepts on the Semantic Web

Concepts in Multiple Schemes

The skos:inScheme property is used to declare of which concept scheme a concept is a part. E.g.

[inScheme example]

It is perfectly reasonable for a concept to be a member of any number of concept schemes. E.g.

[inScheme multiple example]

This is the mechanism by which you can handle discrete scheme versions, essentially treating each scheme version as a distinct scheme. (See also section on versioning) E.g.

[inScheme versioning example]

Linking Concept Schemes

It is perfectly reasonable for you to make statements linking your concepts to concepts in other schemes. E.g.

[concepts in different schemes related]

This can be used to handle, for example, the situation where you would like to link a high granularity scheme to a low granularity scheme, as illustrated by the diagram:

[diagram scheme linking]

I.e. multiple, linked schemes can be described within the same RDF model, and applications can for example display each scheme individually, or a linked 'super-scheme'.

Building Schemes With Concepts From Multiple Sources

@@TODO


Scheme Versioning

Discrete Scheme Versions

This section describes how discrete versioning of SKOS concept schemes may be represented in RDF, using properties from OWL and Dublin Core vocabularies.

It is recommended that you assign a URI to the base scheme and to each scheme version. For example:

Base scheme URI:

http://my.example.org/thesaurus

Scheme versions URIs:

http://my.example.org/thesaurus/1.0
http://my.example.org/thesaurus/1.1
http://my.example.org/thesaurus/1.2
http://my.example.org/thesaurus/1.3

For all concepts you publish, declare that they are a part of the base scheme:

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

  <skos:Concept rdf:about="http://my.example.org/thesaurus/102#concept">
    <skos:inScheme rdf:resource="http://my.example.org/thesaurus"/>
  </skos:Concept>

</rdf:RDF>

Then, for each concept, you may additionally declare that they are a part of one or more of the scheme versions, for example:

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

  <skos:Concept rdf:about="http://my.example.org/thesaurus/102#concept">
    <skos:inScheme rdf:resource="http://my.example.org/thesaurus/1.0"/>
    <skos:inScheme rdf:resource="http://my.example.org/thesaurus/1.1"/>
    <skos:inScheme rdf:resource="http://my.example.org/thesaurus/1.2"/>
  </skos:Concept>

</rdf:RDF>

N.B. We recommend that you do not change the URI for a concept with each scheme version. The more stable your concept URIs are, the more consistently they will be applied.

Scheme Version Metadata

Some properties from OWL and Dublin Core allow you to describe the relationships between versions of a scheme. For example:

<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
          xmlns:skos="http://www.w3.org/2004/02/skos/core#"
          xmlns:dc="http://purl.org/dc/elements/1.1/"
          xmlns:dcterms="http://purl.org/dc/terms/">
         
  <skos:ConceptScheme rdf:about="http://my.example.org/thesaurus">
    <dc:title xml:lang="en">My Example Thesaurus</dc:title>
    <dc:description xml:lang="en">An example thesaurus invented for the SKOS Core guide.</dc:description>
    <dcterms:hasVersion rdf:resource="http://my.example.org/thesaurus/1.0"/>
    <dcterms:hasVersion rdf:resource="http://my.example.org/thesaurus/1.1"/>
    <dcterms:hasVersion rdf:resource="http://my.example.org/thesaurus/1.2"/>
    <dcterms:hasVersion rdf:resource="http://my.example.org/thesaurus/1.3"/>
  </skos:ConceptScheme>

  <skos:ConceptScheme rdf:about="http://my.example.org/thesaurus/1.3">
    <dc:title xml:lang="en">My Example Thesaurus Version 1.3</dc:title>
    <dc:description xml:lang="en">An example thesaurus invented for the SKOS Core guide.</dc:description>
    <dcterms:isVersionOf rdf:resource="http://my.example.org/thesaurus"/>
    <dcterms:issued>2004-10-05</dcterms:issued>
    <dcterms:modified>2004-10-08</dcterms:modified>
    <owl:priorVersion rdf:resource="http://my.example.org/thesaurus/1.2"/>
    <owl:priorVersion rdf:resource="http://my.example.org/thesaurus/1.1"/>
    <owl:priorVersion rdf:resource="http://my.example.org/thesaurus/1.0"/>
    <owl:versionInfo>13 new concepts, 6 concept changes from version 1.2</owl:versionInfo>
  </skos:ConceptScheme>

</rdf:RDF>

Tracking Changes to Concepts

Some basic housekeeping of concepts can be done with Dublin Core properties, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:dcterms="http://purl.org/dc/terms/">

  <skos:Concept rdf:about="http://my.example.org/thesaurus/102#concept">
    <dcterms:issued>2004-10-05</dcterms:issued>
    <dcterms:modified>2004-10-08</dcterms:modified>
  </skos:Concept>

</rdf:RDF>

Changes to a concept can be recorded via change notes. A structured value change note captures the most information, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:dcterms="http://purl.org/dc/terms/">

  <skos:Concept rdf:about="http://my.example.org/thesaurus/102#concept">
    <skos:changeNote rdf:parseType="Resource">
      <rdf:value>The preferred label was changed from 'pink' to 'pink (colour)'.</rdf:value>
      <dc:date>2004-10-08</dc:date>
      <dc:creator>John Smith</dc:creator>
      <!-- Other properties of the note ... -->
    </skos:changeNote>
  </skos:Concept>

</rdf:RDF>

See also the section [advnaced notes].

Concept Stability, Deprecation and Replacement

@@TODO concept is candidate, concept is deprecated.

@@TODO

The replacement of one concept by another can be represented using properties from Dublin Core, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:dcterms="http://purl.org/dc/terms/">

  <skos:Concept rdf:about="http://my.example.org/thesaurus/102#concept">
    <dcterms:isReplacedBy rdf:resource="http://my.example.org/thesaurus/6077#concept"/>
  </skos:Concept>

  <skos:Concept rdf:about="http://my.example.org/thesaurus/6077#concept">
    <dcterms:replaces rdf:resource="http://my.example.org/thesaurus/102#concept"/>
  </skos:Concept>

</rdf:RDF>

@@TODO replacement with combinations ???

@@TODO

Concept Identity

This section describes issues relating to establishing identity of resources of type skos:Concept.

Identity and Mapping

Here 'identity' is taken to mean:

Two resources of type skos:Concept are identical iff they represent the same concept as defined by a specified concept scheme.

Here 'equivalence' is taken to mean:

Two resources of type skos:Concept are equivalent iff they intend the same meaning.

Identical resources of type skos:Concept may be merged in an RDF graph.

Equivalent but not identical resources of type skos:Concept may NOT be merged in an RDF graph.

To put this in plain speak: for two concepts that mean the same thing, if they belong to different concept schemes then they should always be represented as two distinct resources in an RDF graph.

Or, in other words: identical concepts should be merged; equivalent but not identical concepts should be mapped.

Concept Identifiers

URI Identifiers

The simplest way to work with concepts in an RDF context is to refer to them using URIs.

There are a number of issues relating to assignment of URIs to concepts - for a full discussion see the VM TF note [ref].

Here are a couple of issues briefly stated as an introduction to the options.

HTTP URIs

@@TODO

INFO URIs

@@TODO

Other URIs

@@TODO

Non-URI Identifiers

If you already have an identifier scheme for your concepts that is not based on the URI, you will probably want to include these identifiers in the description of your concepts, and may want to use them instead of URIs for referring to the concepts.

To include non-URI identifiers in a description of a concept, we recommend you define your own property. So for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  
  <rdf:Property rdf:about="http://my.example.org/schema#identifier">
    <rdfs:comment>An identifier for a concept within my scheme.</rdfs:comment>
    <rdfs:subPropertyOf rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#value"/>
    <rdfs:subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/identifier"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#InverseFunctionalProperty"/>
  </rdf:Property>

</rdf:RDF>

You can then use this new property in concept descriptions, for example:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:my="http://my.example.org/schema#">

  <skos:Concept rdf:about="http://my.example.org/biology/spottedbowerbird#concept">
    <!-- Other properties of the concept ... -->
    <my:identifier>14H87</my:identifier>
  </skos:Concept>

</rdf:RDF>

There are three things to note about the definition of the new property.

First, it is a sub-property of dc:identifier. This helps to establish that the intended use of the new property is to specify an identifier for the given concept. I.e. generic applications can deduce the semantics of the property.

Second, it is a sub-property of rdf:value. This is to support interoperability with qualified dublin core usage of the dc:subject property (see below).

Third, it is an owl:InverseFunctionalProperty. This means that two concepts with the same value for this property will be deemed identical. In practise, this means that you can do things like:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:my="http://my.example.org/knowledgebase/schema#">

  <skos:Concept>
    <skos:prefLabel>Spotted bowerbird</skos:prefLabel>
    <my:identifier>14H87</my:identifier>
    <skos:broader rdf:parseType="Resource">
      <my:identifier>12L47</my:identifier>
    </skos:broader>
    <skos:narrower rdf:parseType="Resource">
      <my:identifier>42U43</my:identifier>
    </skos:narrower>
    <!-- Other properties of the concept ... -->
  </skos:Concept>

</rdf:RDF>

I.e. you can have a complete RDF description of a concept scheme, without needing URIs.

Published Subject Indicators

@@TODO

Concept Identity Rules (Smushing)

Strong Identity Rules

The following rules may be used as a reliable basis for merging of graphs of concepts.

1. If two resources have the same URI, then they are identical (RDF identity).

2. If two resources have the same literal value (including language tag) for a skos:prefLabel property AND the same resource value for a skos:inScheme property, then they are identical (SKOS identity).

3. If two resources have the same value for a property of type owl:InverseFunctionalProperty then they are identical (OWL identity).

Weak Identity Rules

The following rules may be applied to attempt graph merging:

1. If two resources have the same value for an rdf:value property AND the same value for an rdf:isDefinedBy property, then they are candidates for identity.

2. If two resources have the same value for an rdf:value property AND the same value for an rdf:type property where the value is not skos:Concept, then they are candidates for identity.

3. If two resources have the same value for an rdfs:label property AND the same value for an rdf:isDefinedBy property, then they are candidates for identity.

4. If two resources have the same value for an rdfs:label property AND the same value for an rdf:type property where the value is not skos:Concept, then they are candidates for identity.

Note these rules are included to support interoperability with Qualified Dublin Core style use of the dc:subject property. For example, the dqc spec [ref] recommends usage such as:

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/">

  <Description rdf:about="http://somewhere.org/someDoc.html">
    <dc:subject>
      <Description>
         <value>19D10</value>
         <rdfs:label>Algebraic K-Theory of spaces</rdfs:label>
         <rdfs:isDefinedBy rdf:resource="URI2"/>
      </Description>
    </dc:subject>
  </Description>

</RDF>

Compare this to a hypothetical description of a concept using SKOS Core:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#">
  
  <skos:Concept rdf:about="http://my.example.org/mathematics#ktheory">
    <skos:prefLabel>Algebraic K-Theory of spaces</skos:prefLabel>
    <skos:inScheme rdf:resource="URI2"/>
  </skos:Concept>

</rdf:RDF>

Because skos:prefLabel is a sub-property of rdfs:label, and skos:inScheme is a sub-property of rdfs:isDefinedBy, the concept described in the second snippet is a candidate for identity with the blank node defined in the first snippet, under weak rule 3.

Or this description of a concept:

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:skos="http://www.w3.org/2004/02/skos/core#"
  xmlns:my="http://my.example.org/knowledgebase/schema#identifier">
  
  <skos:Concept rdf:about="http://my.example.org/mathematics#ktheory">
    <my:identifier>19D10</my:identifier>
    <skos:inScheme rdf:resource="URI2"/>
  </skos:Concept>

</rdf:RDF>

Here, because my:identifier is a sub-property of rdf:value (see above), and skos:inScheme is a sub-property of rdfs:isDefinedBy, the concept described in this snippet is a candidate for identity with the blank node defined in the first snippet, under weak rule 1.


References

@@TODO


Acknowledgements

@@TODO