Copyright ©2004 W3C ® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
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.
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.
@@TODO
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'.
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.
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.
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 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.
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].
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]).
There are eight note properties in SKOS Core, explained with simple examples below.
See also the section [advanced notes] later in this guide.
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>
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>
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>
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>
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>
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.
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.
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.
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.
This section describes how to declare relationships between concepts.
See also the section [custom semantic relation properties].
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.
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.
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].
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>
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.
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').
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.
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.
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)
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
This section describes more advanced ways of using the SKOS Core note properties.
The SKOS Core note properties can be used in three ways:
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.
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.
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.
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.
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.
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'.
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.
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.
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.
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]
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'.
@@TODO
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.
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>
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].
@@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
This section describes issues relating to establishing identity of resources of type skos:Concept.
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.
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
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.
@@TODO
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).
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.
@@TODO
@@TODO