Copyright ©2005 W3C ® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
SKOS Core provides a model for expressing the basic structure and content of concept schemes (thesauri, classification schemes, subject heading lists, taxonomies, terminologies, glossaries and other types of controlled vocabulary).
The SKOS Core Vocabulary is an application of the Resource Description Framework (RDF), that can be used to express a concept scheme as an RDF graph. Using RDF allows data to be linked to and/or merged with other RDF data by semantic web applications.
This guide describes SKOS Core for readers who already have a basic understanding of RDF concepts. It accompanies the SKOS Core Vocabulary Specification.
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.
SKOS stands for Simple Knowledge Organisation System. The name SKOS was chosen to emphasise the goal of providing a simple yet powerful framework for expressing knowledge organisation systems in a machine-understandable way.
SKOS Core provides a model for expressing the basic structure and content of concept schemes.
A 'concept scheme' is defined here as: a set of concepts, optionally including statements about semantic relationships between those concepts. Thesauri, classification schemes, subject heading lists, taxonomies, terminologies, glossaries and other types of controlled vocabulary are all examples of concept schemes.
The SKOS Core Vocabulary is a set of RDF properties and RDFS classes, that can be used to express the content and structure of a concept scheme as an RDF graph. For example, below is an extract from the UK Archival Thesaurus (UKAT) [UKAT]:
Term: Economic cooperation Used For: Economic co-operation Broader terms: Economic policy Narrower terms: Economic integration European economic cooperation European industrial cooperation Industrial cooperation Related terms: Interdependence Scope Note: Includes cooperative measures in banking, trade, industry etc., between and among countries.
This extract, expressed as an RDF graph using the SKOS Core Vocabulary, looks like:
Each of the blue circles represents a concept from the UKAT.
If your controlled vocabulary (concept scheme) has a similar structure, you will be interested in reading this guide, because it will tell you how to express your concept scheme as an RDF graph using the SKOS Core Vocabulary. Using RDF will allow your data to be linked to and/or merged with other RDF data by semantic web applications.
SKOS Core is an application of the Resource Description Framework (RDF). RDF provides a simple data formalism for talking about things, their properties, inter-relationships, and categories (classes). See [RDF Concepts] for an overview of RDF, [RDF Semantics] for its formal mathematical basis, and [RDF Syntax] for details of the RDF/XML document format used to exchange RDF data. For more about the relationship between SKOS Core and other RDF applications, see the Relationship to RDFS/OWL Ontologies section below.
Together, the latest versions of this document [SKOS Core Guide] and the SKOS Core Vocabulary Specification [SKOS Core Spec] replace the earlier SKOS Core 1.0 Guide [SKOS Core 1.0] published by the SWAD-Europe Thesaurus Activity. The SKOS Core 1.0 Guide is now deprecated. In a departure from the policy implied by the version number '1.0', the SKOS Core Vocabulary is no longer versioned as a whole. The current versioning policy is described in the SKOS Core Vocabulary Specification.
Most of the examples in this guide are given as a visualisation of the RDF graph, e.g.
An RDF graph can be serialised (i.e. encoded as a series of characters) according to any of three currently defined RDF syntaxes: RDF/XML [RDF Syntax], N3/Turtle [Turtle][N3], N-Triple [N-Triple]. All examples in this guide use the RDF/XML syntax for consistency. Examples serialised as RDF/XML appear in boxes such as:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ex="http://www.example.com/concepts#"> <rdf:Description rdf:about="http://www.example.com/concepts#aSubject"> <ex:aPredicate rdf:resource="http://www.example.com/concepts#anObject"/> </rdf:Description> </rdf:RDF>
Inference rules are part of SKOS Core. Inference rules are described in prose, and where appropriate are expressed using the Jena 2 rule syntax [Jena Inference], or as RDF statements using the OWL vocabulary [OWL]. Inference rules appear in boxes such as:
An example rule.
(ex:a ex:p ex:c) -> (ex:a ex:q ex:c) prefix ex: <http://www.example.com/#>
This document uses the following terminology defined in [RDF Concepts]:
This document uses the following terminology defined in [Willpower Glossary]:
This document uses the following terminology defined in [WEBARCH]:
This document uses the following terminology defined in [DCMIMODEL]:
This document uses the following terminology defined in [OWL]:
skos:Concept
ClassThe skos:Concept
class allows you to assert that a resource is a conceptual resource. That is, the resource is itself a concept. For example:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="http://www.example.com/concepts#love"> <rdf:type rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"/> </rdf:Description> </rdf:RDF>
Note that, for triples involving the rdf:type
property, the RDF/XML syntax allows a shortened form:
<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://www.example.com/concepts#love"/> </rdf:RDF>
This shortened form is used throughout this guide, wherever possible.
See also the section HTTP URIs for Concepts.
This section describes the SKOS Core labelling properties: skos:prefLabel
, skos:altLabel
, skos:hiddenLabel
, skos:prefSymbol
and skos:altSymbol
. Here labelling means assigning some sort of token to a resource, where the token is intended to be used to denote (label) the resource in natural language discourse and/or in representations intended for human consumption.
The skos:prefLabel
and skos:altLabel
properties allow you to assign preferred and alternative lexical labels to a resource. 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://www.example.com/concepts#animals"> <skos:prefLabel>animals</skos:prefLabel> <skos:altLabel>creatures</skos:altLabel> <skos:altLabel>fauna</skos:altLabel> </skos:Concept> </rdf:RDF>
The labels in the above example, 'animals' 'creatures' and 'fauna', would under normal circumstances be considered synonyms of each other. However, when labelling resources of type skos:Concept
, it is not necessary to restrict preferred and alternative lexical labels to precise synonyms. The following are all valid:
<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://www.example.com/concepts#wetness"> <skos:prefLabel>wetness</skos:prefLabel> <skos:altLabel>dryness</skos:altLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#shrubs"> <skos:prefLabel>shrubs</skos:prefLabel> <skos:altLabel>bushes</skos:altLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#rocks"> <skos:prefLabel>rocks</skos:prefLabel> <skos:altLabel>basalt</skos:altLabel> <skos:altLabel>granite</skos:altLabel> <skos:altLabel>slate</skos:altLabel> </skos:Concept> </rdf:RDF>
Abbreviations and acronyms may also be used to label concepts, and the choice of whether to use them as preferred or alternative terms is unconstrained. However, misspelled words are normally included among the hidden labels (see see hidden labels below).
The properties skos:prefLabel
and skos:altLabel
are both sub-properties of rdfs:label
.
A hidden lexical label is a lexical label for a resource, where you would like that character string to be accessible to applications performing text-based indexing and search operations, but you would not like that label to be visible otherwise. To assign a hidden lexical label to a resource, use the skos:hiddenLabel
property.
The most common use of hidden labels is to include misspelt variants of other lexical labels. 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://www.example.com/concepts#abattoirs"> <skos:prefLabel>abattoirs</skos:prefLabel> <skos:hiddenLabel>abatoirs</skos:hiddenLabel> <skos:hiddenLabel>abbatoirs</skos:hiddenLabel> <skos:hiddenLabel>abbattoirs</skos:hiddenLabel> </skos:Concept> </rdf:RDF>
The property skos:hiddenLabel
is a sub-property of rdfs:label
.
The value of the properties skos:prefLabel
and skos:altLabel
should be a plain literal. A plain literal is a character string with optional language tag, and the language tag may be used to restrict the scope of a lexical label to a particular language, 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://www.example.com/concepts#shrubs"> <skos:prefLabel xml:lang="en">shrubs</skos:prefLabel> <skos:altLabel xml:lang="en">bushes</skos:altLabel> <skos:prefLabel xml:lang="fr">arbuste</skos:prefLabel> <skos:altLabel xml:lang="fr">buisson</skos:altLabel> </skos:Concept> </rdf:RDF>
The values permissable as language tags are given by [XMLLANG].
When labelling a concept in more than one language, bear in mind that subtle differences in the common meaning of translated words or phrases between languages may result in differing interpretations of a concept by different language communities.
Symbolic labelling means labelling a concept with an image.
To assign preferred and alternative symbolic labels to a concept, use the skos:prefSymbol
and skos:altSymbol
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#"> <skos:Concept rdf:about="http://www.example.com/concepts#love"> <skos:prefSymbol rdf:resource="http://www.example.com/symbols/love1.jpg"/> <skos:altSymbol rdf:resource="http://www.example.com/symbols/love2.jpg"/> </skos:Concept> </rdf:RDF>
The FOAF [FOAF] vocabulary includes the property foaf:depiction
. This property may be used to assert a link between a concept, and an image depicting that 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#" xmlns:foaf="http://xmlns.com/foaf/0.1/"> <skos:Concept rdf:about="http://www.example.org/concepts#spottedbowerbird"> <skos:prefLabel>spotted bowerbird</skos:prefLabel> <skos:altLabel>Chlamydera maculata</skos:altLabel> <foaf:depiction rdf:resource="http://www.mangoverde.com/birdsound/images/00000005589.jpg"/> </skos:Concept> </rdf:RDF>
The properties skos:prefSymbol
and skos:altSymbol
are not sub-properties of foaf:depiction
. This is because a symbolic label for a concept is not necessarily a depiction of that concept. For example, the image ...
... is the preferred symbolic label for the concept 'government' in the Blisssymbolics dictionary [BLISS]. However, the image looks like a (highly stylised) depiction of a flag.
This section describes the SKOS Core documentation properties. These are 8 properties you can use to add human-readable documentation to the description of a concept. The properties are:
skos:publicNote
skos:privateNote
skos:definition
skos:scopeNote
skos:example
skos:historyNote
skos:editorialNote
skos:changeNote
The SKOS Core documentation properties are arranged as a property hierarchy descending from rdfs:comment
as follows:
rdfs:comment | +-- skos:publicNote | | | +-- skos:definition | | | +-- skos:scopeNote | | | +-- skos:example | | | +-- skos:historyNote | +-- skos:privateNote | +-- skos:editorialNote | +-- skos:changeNote
Thus a skos:definition
is also a skos:publicNote
, a skos:editorialNote
is also a skos:privateNote
and so on.
To clarify the difference between skos:definition
and skos:scopeNote
, a definition should be an attempt to completely explain the meaning of a concept, whereas a scope note may consist of partial information about what is or is not included within the meaning ('scope') of a concept.
To clarify the difference between a skos:historyNote
and a skos:changeNote
, a history note is a piece of information intended for users of the scheme, documenting significant changes to the meaning/form/state of a concept, whereas a change note is intended for documenting fine-grained changes to a concept for the purposes of administration and management.
There are three recommended usage patterns for the SKOS Core documentation properties:
The sub-sections below explain these patterns.
This is the simplest pattern for using the SKOS Core documentation properties, where the property value (i.e. the object of the triple) is an RDF literal.
An example of this pattern is below:
<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://www.example.org/concepts#bananarepublic"> <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>
Note that an plain literal may include a language tag. Where a concept is labelled in more than one language, documentation may also be provided in multiple languages, 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://www.example.com/concepts#pineapples"> <skos:prefLabel xml:lang="en">pineapples</skos:prefLabel> <skos:definition xml:lang="en">The fruit of plants of the family Bromeliaceae.</skos:definition> <skos:prefLabel xml:lang="fr">ananas</skos:prefLabel> <skos:definition xml:lang="fr">Le fruit de la plante herbacée de la famille des broméliacées.</skos:definition> </skos:Concept> </rdf:RDF>
This pattern allows you to structure documentation as a related resource description.
An example of this pattern is below:
<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:Concept rdf:about="http://www.example.org/concepts#laptops"> <skos:prefLabel>notebook computers</skos:prefLabel> <skos:changeNote rdf:parseType="Resource"> <rdf:value>The preferred label for this concept changed from 'laptop computers' to 'notebook computers' on 23 Jan 1999.</rdf:value> <dc:creator> <foaf:Person> <foaf:name>John Smith</foaf:name> <foaf:mbox rdf:resource="mailto:jsmith@example.org"/> </foaf:Person> </dc:creator> <dc:date>1999-01-23</dc:date> </skos:changeNote> </skos:Concept> </rdf:RDF>
See FOAF [FOAF] and DC [DCMITERMS] specifications for more properties to use with related resource descriptions and usage guidelines.
This pattern allows you to refer to documentation that is itself a document, via the URI of that document.
A specific examples of this pattern is below:
<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://www.example.com/concepts#zoology"> <skos:prefLabel>zoology</skos:prefLabel> <skos:scopeNote rdf:resource="http://www.example.com/notes/zoology.txt"/> </skos:Concept> </rdf:RDF>
Note that it is possible to include metaproperties of this document within the same RDF graph, 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: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/" xmlns:foaf="http://xmlns.com/foaf/0.1/"> <skos:Concept rdf:about="http://www.example.com/concepts#botany"> <skos:prefLabel>botany</skos:prefLabel> <skos:scopeNote> <foaf:Document rdf:about="http://www.example.com/notes/botany.txt"> <dc:creator> <foaf:Person> <foaf:name>John Smith</foaf:name> <foaf:mbox rdf:resource="mailto:jsmith@example.org"/> </foaf:Person> </dc:creator> <dc:language> <dcterms:RFC1766> <rdf:value>EN</rdf:value> <rdfs:label>English</rdfs:label> </dcterms:RFC1766> </dc:language> </foaf:Document> </skos:scopeNote> </skos:Concept> </rdf:RDF>
The SKOS Core Vocabulary includes the following properties for asserting semantic (paradigmatic) relationships between concepts: skos:semanticRelation
, skos:broader
, skos:narrower
and skos:related
.
Thes properties are arranged in a property hierarchy, as follows:
skos:semanticRelation | +-- skos:broader | +-- skos:narrower | +-- skos:related
The domain and range of the property skos:semanticRelation
is the class skos:Concept
, therefore the use of any of the SKOS Core semantic relation properties implies that both the subject and the object of the triple is a resource of type skos:Concept
.
To assert that one concept is broader in meaning (i.e. more general) than another, where the scope (meaning) of one falls completely within the scope of the other, use the skos:broader
property. To assert the inverse, that one concept is narrower in meaning (i.e. more specific) than another, use the skos:narrower
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#"> <skos:Concept rdf:about="http://www.example.com/concepts#mammals"> <skos:prefLabel>mammals</skos:prefLabel> <skos:broader rdf:resource="http://www.example.com/concepts#animals"/> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#animals"> <skos:prefLabel>animals</skos:prefLabel> <skos:narrower rdf:resource="http://www.example.com/concepts#mammals"/> </skos:Concept> </rdf:RDF>
The properties skos:broader
and skos:narrower
are each other's inverse.
Both the properties skos:broader
and skos:narrower
are transitive properties.
See also section on hierarchies in [BS8723].
To assert an associative relationship between two concepts, use the skos:related
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#"> <skos:Concept rdf:about="http://www.example.com/concepts#birds"> <skos:prefLabel>birds</skos:prefLabel> <skos:related rdf:resource="http://www.example.com/concepts#ornithology"/> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#ornithology"> <skos:prefLabel>ornithology</skos:prefLabel> <skos:related rdf:resource="http://www.example.com/concepts#birds"/> </skos:Concept> </rdf:RDF>
The property skos:related
is a symmetric property.
See also the section on associative relationships in [BS8723].
N.B. the features of SKOS Core described in this section are unstable.
This section describes the features of SKOS Core that allow you to define meaningful groupings ('collections') of concepts. Such groupings are normally rendered in thesauri as e.g.
<milk by source animal> .buffalo milk .cow milk .goat milk .sheep milk
In thesaurus terminology, these collections are known as 'arrays', and the term 'milk by source animal' is a 'node label' [Willpower Glossary]. There is consensus that a 'node label' does not represent a label for a concept in its own right, and therefore correctly modelling this kind of structure in RDF requires careful consideration.
SKOS Core has special vocabulary to handle collections, and this is described below. However, RDF has some generic vocabulary (rdf:Bag
and rdf:Seq
) to handle ordered/unordered groups of resources, and there has been extended discussion as to whether these should be used. The choice has been made provisionally not to use rdf:Bag
and rdf:Seq
for this purpose, for reasons outlined in [Collections and Arrays].
To define a meaningful collection of concepts, use the skos:Collection
class and the skos:member
property. To assign a lexical label to a collection, use the rdfs:label
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:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <skos:Collection> <rdfs:label>milk by source animal</rdfs:label> <skos:member rdf:resource="http://www.example.com/concepts#buffalomilk"/> <skos:member rdf:resource="http://www.example.com/concepts#cowmilk"/> <skos:member rdf:resource="http://www.example.com/concepts#goatmilk"/> <skos:member rdf:resource="http://www.example.com/concepts#sheepmilk"/> </skos:Collection> <skos:Concept rdf:about="http://www.example.com/concepts#buffalomilk"> <skos:prefLabel>buffalo milk</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#cowmilk"> <skos:prefLabel>cow milk</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#goatmilk"> <skos:prefLabel>goat milk</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#sheepmilk"> <skos:prefLabel>sheep milk</skos:prefLabel> </skos:Concept> </rdf:RDF>
Note that in the example above the collection was defined as a blank node, i.e. no URI was allocated. URIs may be allocated to collections, but usually this is not necessary.
The most common use of a labelled collection such as the above is to enhance a hierarchical display. You can describe narrower and broader relationships between a concept and a collection, 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:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <skos:Concept rdf:about="http://www.example.com/concepts#milk"> <skos:prefLabel>milk</skos:prefLabel> <skos:narrower> <skos:Collection> <rdfs:label>milk by source animal</rdfs:label> <skos:member rdf:resource="http://www.example.com/concepts#buffalomilk"/> <skos:member rdf:resource="http://www.example.com/concepts#cowmilk"/> <skos:member rdf:resource="http://www.example.com/concepts#goatmilk"/> <skos:member rdf:resource="http://www.example.com/concepts#sheepmilk"/> </skos:Collection> </skos:narrower> </skos:Concept> </rdf:RDF>
The usual rendering of this structure in a thesaurus is:
milk .<milk by source animal> ..buffalo milk ..cow milk ..goat milk ..sheep milk
The class skos:CollectableProperty
supports a generic mechanism by which collections can be involved in semantic relationships (and other sorts of statement). For this class the following rule applies:
(?x ?p ?c) (?c skos:member ?m) (?p rdf:type skos:CollectableProperty) -> (?x ?p ?m)
The properties skos:narrower
, skos:broader
and skos:related
are all declared to be collectable properties.
This rule means that the example from the section above implies the following graph:
<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://www.example.com/concepts#milk"> <skos:narrower rdf:resource="http://www.example.com/concepts#buffalomilk"/> <skos:narrower rdf:resource="http://www.example.com/concepts#cowmilk"/> <skos:narrower rdf:resource="http://www.example.com/concepts#goatmilk"/> <skos:narrower rdf:resource="http://www.example.com/concepts#sheepmilk"/> </rdf:Description> </rdf:RDF>
To define an ordered collection of concepts, use the skos:OrderedCollection
class with the skos:memberList
property. An ordered collection may also have a label (use rdfs:label
). 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:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <skos:OrderedCollection> <rdfs:label>people by age</rdfs:label> <skos:memberList rdf:parseType="Collection"> <skos:Concept rdf:about="http://www.example.com/concepts#infants"/> <skos:Concept rdf:about="http://www.example.com/concepts#children"/> <skos:Concept rdf:about="http://www.example.com/concepts#adults"/> </skos:memberList> </skos:OrderedCollection> <skos:Concept rdf:about="http://www.example.com/concepts#infants"> <skos:prefLabel>infants</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#children"> <skos:prefLabel>children</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#adults"> <skos:prefLabel>adults</skos:prefLabel> </skos:Concept> </rdf:RDF>
Ordered collections can be used with semantic relation properties in the same way as unordered collections (skos:OrderedCollection
is a sub-class of skos:Collection
) 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:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <skos:Concept rdf:about="http://www.example.com/concepts#people"> <skos:prefLabel>people</skos:prefLabel> <skos:narrower> <skos:OrderedCollection> <rdfs:label>people by age</rdfs:label> <skos:memberList rdf:parseType="Collection"> <skos:Concept rdf:about="http://www.example.com/concepts#infants"/> <skos:Concept rdf:about="http://www.example.com/concepts#children"/> <skos:Concept rdf:about="http://www.example.com/concepts#adults"/> </skos:memberList> </skos:OrderedCollection> </skos:narrower> </skos:Concept> </rdf:RDF>
This structure could be rendered for display as:
people .<people by age> ..infants ..children ..adults
For ordered collections the following rule applies:
(?c skos:memberList ?l) elementOfList(?e,?l) -> (?c skos:member ?e)
... where 'elementOfList' is a function that returns true if the first argument is an element of the RDF list for which the second argument is the head.
This rule, in combination with the collectable properties rule, means that the example above implies the following graph:
<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://www.example.com/concepts#people"> <skos:narrower rdf:resource="http://www.example.com/concepts#infants"/> <skos:narrower rdf:resource="http://www.example.com/concepts#children"/> <skos:narrower rdf:resource="http://www.example.com/concepts#adults"/> </rdf:Description> </rdf:RDF>
Collections may also be nested inside other collections, 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:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <skos:Concept rdf:about="http://www.example.com/concepts#chairs"> <skos:prefLabel>chairs</skos:prefLabel> <skos:narrower> <skos:Collection> <rdfs:label>chairs by form</rdfs:label> <skos:member rdf:resource="http://www.example.com/concepts#armchairs"/> <skos:member rdf:resource="http://www.example.com/concepts#easychairs"/> <skos:member> <skos:Collection> <rdfs:label>chairs by form: back form</rdfs:label> <skos:member rdf:resource="http://www.example.com/concepts#heartbackchairs"/> <skos:member rdf:resource="http://www.example.com/concepts#ovalbackchairs"/> </skos:Collection> </skos:member> </skos:Collection> </skos:narrower> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#armchairs"> <skos:prefLabel>armchairs</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#easychairs"> <skos:prefLabel>easy chairs</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#heartbackchairs"> <skos:prefLabel>heart-back chairs</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#ovalbackchairs"> <skos:prefLabel>oval-back chairs</skos:prefLabel> </skos:Concept> </rdf:RDF>
This structure could be rendered for display as:
chairs .<chairs by form> ..armchairs ..easy chairs ..<chairs by form: back form> ...heart-back chairs ...oval-back chairs
This example adapted from the AAT [AAT].
Ordered collections may also be nested, 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:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <skos:Concept rdf:about="http://www.example.com/concepts#people"> <skos:prefLabel>people</skos:prefLabel> <skos:narrower> <skos:OrderedCollection> <rdfs:label>people by age</rdfs:label> <skos:memberList rdf:parseType="Collection"> <skos:OrderedCollection> <rdfs:label>infants by age</rdfs:label> <skos:memberList rdf:parseType="Collection"> <skos:Concept rdf:about="http://www.example.com/concepts#babies"/> <skos:Concept rdf:about="http://www.example.com/concepts#toddlers"/> </skos:memberList> </skos:OrderedCollection> <skos:Concept rdf:about="http://www.example.com/concepts#children"/> <skos:Concept rdf:about="http://www.example.com/concepts#adults"/> </skos:memberList> </skos:OrderedCollection> </skos:narrower> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#babies"> <skos:prefLabel>babies</skos:prefLabel> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#toddlers"> <skos:prefLabel>toddlers</skos:prefLabel> </skos:Concept> </rdf:RDF>
This structure could be rendered for display as:
people .<people by age> ..<infants by age> ...babies ...toddlers ..children ..adults
Also ordered collections may be nested inside unordered collections, and vice versa.
Usually, concepts are defined in relation to other concepts, as part of an internally coherent concept scheme. As mentioned in the introduction, a 'concept scheme' is defined here as: a set of concepts, optionally including statements about semantic relationships between those concepts.
The skos:ConceptScheme
class allows you to assert that a resource is a concept 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#"> <skos:ConceptScheme rdf:about="http://www.example.com/conceptscheme"/> </rdf:RDF>
Concepts do not have to be a part of a concept scheme, concepts may be defined and declared as stand-alone resources. However, where you would like to assert that a concept is a part of a particular concept scheme, use the skos:inScheme
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#"> <skos:Concept rdf:about="http://www.example.com/concepts#love"> <skos:inScheme rdf:resource="http://www.example.com/conceptscheme"/> </skos:Concept> </rdf:RDF>
A concept may participate in any number of concept schemes.
For concept schemes where the concepts are arranged in a broader/narrower generalisation hierarchy, use the skos:hasTopConcept
property to assert a link between the concept scheme and the concepts that are the top-level concepts in the generalisation hierarchy. 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:ConceptScheme rdf:about="http://www.example.com/conceptscheme"> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#biology"/> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#geology"/> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#agriculture"/> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#culturalheritage"/> </skos:ConceptScheme> </rdf:RDF>
It is recommended that you use the skos:hasTopConcept
property, as this gives applications an efficient way of locating the top level concepts for a given scheme.
When declaring a concept scheme you can of course use properties from other RDF vocabularies such as DCMI Terms [DCMITERMS] to describe meta-properties of the 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: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/" xmlns:foaf="http://xmlns.com/foaf/0.1/"> <skos:ConceptScheme rdf:about="http://www.example.com/conceptscheme"> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#biology"/> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#geology"/> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#agriculture"/> <skos:hasTopConcept rdf:resource="http://www.example.com/concepts#culturalheritage"/> <dc:title>The example.com concept scheme</dc:title> <dc:description>An concept scheme for the SKOS Core guide.</dc:description> <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>Free to all.</dc:rights> <dcterms:issued>2004-11-25</dcterms:issued> <dcterms:modified>2005-02-06</dcterms:modified> </skos:ConceptScheme> </rdf:RDF>
Consult the DCMI Terms [DCMITERMS] specification for other useful properties and usage guidelines.
This section introduces the properties skos:subject
, skos:isSubjectOf
, skos:primarySubject
and skos:isPrimarySubjectOf
. These properties can be used for subject indexing of information resources on the web. Here 'subject indexing' means the same as 'indexing' as defined by [Willpower Glossary].
To assert that a concept is a subject (i.e. topic) of an information resource, use the skos:subject
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/"> <foaf:Document rdf:about="http://www.publish.csiro.au/paper/MU00039.htm"> <skos:subject rdf:resource="http://www.example.com/concepts#ornithology"/> </foaf:Document> <skos:Concept rdf:about="http://www.example.org/concepts#ornithology"> <skos:prefLabel>ornithology</skos:prefLabel> </skos:Concept> </rdf:RDF>
You can use the skos:isSubjectOf
property to make the same assertion in the other direction, 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/"> <foaf:Document rdf:about="http://www.publish.csiro.au/paper/MU00039.htm"/> <skos:Concept rdf:about="http://www.example.org/concepts#ornithology"> <skos:prefLabel>ornithology</skos:prefLabel> <skos:isSubjectOf rdf:resource="http://www.publish.csiro.au/paper/MU00039.htm"/> </skos:Concept> </rdf:RDF>
The properties skos:subject
and skos:isSubjectOf
are each other's inverse.
The property skos:subject
is a sub-property of dc:subject
.
The following rule applies to the interaction of skos:subject
and skos:broader
:
(?i skos:subject ?x) (?x skos:broader ?y) -> (?i skos:subject ?y)
An information resource may have any number of subjects. To state that one of these subjects is the primary subject of the document, use the skos:primarySubject
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/"> <foaf:Document rdf:about="http://www.publish.csiro.au/paper/MU00039.htm"> <skos:primarySubject rdf:resource="http://www.example.com/concepts#spottedbowerbird"/> </foaf:Document> <skos:Concept rdf:about="http://www.example.org/concepts#spottedbowerbird"> <skos:prefLabel>spotted bowerbird</skos:prefLabel> </skos:Concept> </rdf:RDF>
The property skos:isPrimarySubjectOf
is the inverse of skos:primarySubject
.
The property skos:primarySubject
is the sub-property of skos:subject
. The property skos:isPrimarySubjectOf
is the sub-propety of skos:isSubjectOf
.
N.B. the features of SKOS Core described in this section are unstable.
The property skos:subjectIndicator
allows you to assert a link between a concept and a human-readable document that provides a complete description of that 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> <skos:prefLabel>ornithology</skos:prefLabel> <skos:subjectIndicator rdf:resource="http://www.example.com/psi/ornithology.html"/> </skos:Concept> </rdf:RDF>
The referenced document should conform to the requirements of a published subject indicator as defined by [PSI].
The skos:subjectIndicator
property is an owl:InverseFunctionalProperty
, which means that if any two nodes in an RDF graph have the same value for this property, then they are the same resource [OWL]. Therefore you can use the skos:subjectIndicator
property to indirectly identify a concept by reference to the URI of the document that is the published subject indicator for that concept.
Below is an example of referring to a concept via the value of the skos:subjectIndicator
property:
<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/"> <foaf:Document rdf:about="http://www.publish.csiro.au/paper/MU00039.htm"> <skos:primarySubject rdf:parseType="Resource"> <skos:subjectIndicator rdf:resource="http://www.example.com/psi/ornithology.html"/> </skos:primarySubject> </foaf:Document> </rdf:RDF>
This section describes some open issues, where no firm consensus has been reached.
This section attempts to describe the relationship between SKOS Core and other RDF applications such as FOAF.
RDFS refers to the RDF vocabulary description language [RDF Schema] and OWL refers to the Web Ontology Language [OWL].
There is a subtle difference between SKOS Core and other RDF applications like FOAF [FOAF], in terms of what they allow you to model. SKOS Core allows you to model a set of concepts as an RDF graph. Other RDF applications, such as FOAF, allow you to model things like people, organisations, places etc. as an RDF graph. Technically, SKOS Core introduces a layer of indirection into the modelling.
To understand this indirection better, consider the following two graphs, both involving the dc:creator
property:
The above graph describes a relationship between a concept, and the person who is the creator of that concept. This graph should be interpreted as saying, "the person named 'Alistair Miles' is the creator of the concept denoted by the URI http://www.example.com/concepts#henry8
. This concept was modified on 2005-02-06." This graph should probably not be interpreted as saying, "the person named 'Alistair Miles' is the creator of King Henry VIII," or that, "King Henry VIII was modified on 2005-02-06".
Contrast this with the graph below:
This second graph should probably be interpreted as saying, "the persons named 'King Henry VII' and 'Elizabeth of York' are the creators of the person named 'King Henry VIII'."
So, for a resource of type skos:Concept
, any properties of that resource (such as creator, date of modification, source etc.) should be interpreted as properties of a concept, and not as properties of some 'real world thing' that that resource may be a conceptualisation of.
This layer of indirection allows thesaurus-like data to be expressed as an RDF graph. The conceptual content of any thesaurus can of course be remodelled as an RDFS/OWL ontology. However, this remodelling work can be a major undertaking, particularly for large and/or informal thesauri. A SKOS Core representation of a thesaurus maps fairly directly onto the original data structures, and can therefore be created without expensive remodelling and analysis.
SKOS Core is intended to provide both a stable encoding of thesaurus-like data within the RDF graph formalism, as well as a migration path for exploring the costs and benefits of moving from thesaurus-like to RDFS/OWL-like modelling formalisms.
The property owl:sameAs
should not be used to express the fact that two conceptual resources (i.e. resources of type skos:Concept
) share the same meaning. The property owl:sameAs
implies that two resources are identical in every way (they are in fact the same resource). Although two conceptual resources may have the same meaning, they may have different owners, different labels, different documentation, different history, and of course a different future.
Any party may, however, assert a mapping relationship between any two conceptual resources. The SKOS Mapping vocabulary [SKOSMAP] contains a number of RDF properties for expressing mapping relationships between conceptual resources.
SKOS Core assumes that the meaning of a conceptual resource is not affected by any RDF or natural language statements made about it. The concept's owner determines the meaning of a concept, and statements about the concept serve only to explain the meaning of the concept to others. It is up to the concept's owner to provide an informative set of statements about the concept, to ensure that other people will correctly interpret the meaning, and so share the same understanding.
In practise, this means that a concept may be used in any context, and the meaning of the concept will remain unchanged. However, bear in mind that the set of semantic relationships that a concept is involved in are an important part of the explanation of the meaning of that concept, and will influence the interpretation made by other people. Where a concept has little documentation, people will rely heavily on the semantic context of the concept to form an idea of meaning. Therefore the extent to which the meaning a concept is effectively explained via labels and documentation will determine how usable that concept is outside of the originally anticipated context.
This section suggests how properties from the OWL [OWL] and DCMI Terms [DCMITERMS] vocabularies could be used to assert information about concept scheme versioning.
For example, if I allocated the URI http://www.example.com/conceptscheme
to a concept scheme (in its current state), and then allocated the URIs http://www.example.com/conceptscheme/1
and http://www.example.com/conceptscheme/2
to specific versions of the scheme, I could declare that:
<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/" xmlns:owl="http://www.w3.org/2002/07/owl#"> <skos:ConceptScheme rdf:about="http://www.example.com/conceptscheme"> <dcterms:hasVersion rdf:resource="http://www.example.com/conceptscheme/1"/> <dcterms:hasVersion rdf:resource="http://www.example.com/conceptscheme/2"/> </skos:ConceptScheme> <skos:ConceptScheme rdf:about="http://www.example.com/conceptscheme/1"> <dcterms:isVersionOf rdf:resource="http://www.example.com/conceptscheme"/> </skos:ConceptScheme> <skos:ConceptScheme rdf:about="http://www.example.com/conceptscheme/2"> <dcterms:isVersionOf rdf:resource="http://www.example.com/conceptscheme"/> <owl:priorVersion rdf:resource="http://www.example.com/conceptscheme/1"/> </skos:ConceptScheme> </rdf:RDF>
I could then use the skos:inScheme
property to declare which scheme versions a concept is included in, 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:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dcterms="http://purl.org/dc/terms/"> <skos:Concept rdf:about="http://www.example.com/concepts#bananas"> <skos:prefLabel>bananas</skos:prefLabel> <skos:altLabel>plantains</skos:altLabel> <skos:inScheme rdf:resource="http://www.example.com/conceptscheme"/> <skos:inScheme rdf:resource="http://www.example.com/conceptscheme/1"/> <skos:inScheme rdf:resource="http://www.example.com/conceptscheme/2"/> <dcterms:replaces rdf:resource="http://www.example.com/plantains#concept"/> <skos:changeNote rdf:parseType="Resource"> <rdf:value>The scope of this concept modified to include plantains also after version 1; 'plantains' added as an altLabel.</rdf:value> <dc:date>2004-11-20</dc:date> </skos:changeNote> </skos:Concept> <skos:Concept rdf:about="http://www.example.com/concepts#plantains"> <skos:prefLabel>plantains</skos:prefLabel> <skos:inScheme rdf:resource="http://www.example.com/conceptscheme"/> <skos:inScheme rdf:resource="http://www.example.com/conceptscheme/1"/> <dcterms:isReplacedBy rdf:resource="http://www.example.com/concepts#bananas"/> </skos:Concept> </rdf:RDF>
Consult the OWL [OWL] and Dublin Core [DCMITERMS] specifications for full usage guidelines with respect to properties in those vocabularies.
Whether or not it is good practice to allocate HTTP URIs, or certain types of HTTP URIs, to conceptual resources remains an open question. This is an open issue for the W3C Technical Architecture Group (TAG), see [HTTP Range 14]. See also [VMTF Note].