SKOS ISSUE-33: "Bundles" Proposal
This is a proposal for resolution of SKOS [http://www.w3.org/2006/07/SWD/track/issues/33 ISSUE-33: GroupingConstructs].
0. Summary
This proposal deprecates all current features of SKOS relating to "collections" http://www.w3.org/TR/2005/WD-swbp-skos-core-guide-20051102/#seccollections SKOS-GUIDE-SEC-COLLECTIONS, because of a number of serious issues, and introduces new features in replacement, where these issues are resolved.
In addition to the basic contradiction captured in ISSUE-33, other issues resolved are:
- Overloaded naming - the name "collection" is used in RDF to mean a list, and is used in DCMI to mean a set of objects such as library or museum artefacts.
- Ordering information - being able to explicitly state a lack of order in a grouping.
Redundancy and closure in vocabulary for describing members of a group (i.e. skos:member and skos:memberList).
- Unecessary use of rules.
1. Vocabulary
The following vocabulary is required by this proposal:
skos:Bundle skos:bundleMembers skos:bundleIsOrdered |
The following vocabulary is deprecated by this proposal:
skos:Collection skos:OrderedCollection skos:member skos:memberList |
2. Axiomatic Triples
The following triples are axiomatic for this proposal:
skos:bundleMembers rdfs:domain skos:Bundle.BRskos:bundleMembers rdfs:range rdf:List.BRskos:bundleIsOrdered rdfs:domain skos:Bundle.BRskos:bundleIsOrdered rdfs:range xsd:boolean.BRskos:Bundle owl:disjointWith skos:Concept. |
3. Semantic Conditions
There are no further semantic conditions.
4. Consistent Examples
An example of an unordered bundle with a label:
@prefix ex: <http://www.example.com/eg#> . # conventional prefixes ex:buffalomilk rdf:type skos:Concept; skos:prefLabel "buffalo milk"@en. ex:cowmilk rdf:type skos:Concept; skos:prefLabel "cow milk"@en. ex:goatmilk rdf:type skos:Concept; skos:prefLabel "goat milk"@en. ex:sheepmilk rdf:type skos:Concept; skos:prefLabel "sheep milk"@en. [] rdf:type skos:Bundle; rdfs:label "milk by source animal"@en; skos:bundleIsOrdered "false"^^xsd:boolean; skos:bundleMembers (ex:buffalomilk ex:cowmilk ex:goatmilk ex:sheepmilk).
An example of an ordered bundle with a label:
ex:infants rdf:type skos:Concept; skos:prefLabel "infants"@en. ex:children rdf:type skos:Concept; skos:prefLabel "children"@en. ex:adults rdf:type skos:Concept; skos:prefLabel "adults"@en. [] rdf:type skos:Bundle; rdfs:label "people by age"@en; skos:bundleIsOrdered "true"^^xsd:boolean; skos:bundleMembers (ex:infants ex:children ex:adults).
5. Inconsistent Examples
Because skos:Bundle and skos:Concept are declared as disjoint classes, the following example is inconsistent.
ex:milk rdf:type skos:Concept; skos:prefLabel "milk"@en; skos:narrower [ rdf:type skos:Bundle; rdfs:label "milk by source animal"@en; skos:bundleIsOrdered "false"^^xsd:boolean; skos:bundleMembers (ex:buffalomilk ex:cowmilk ex:goatmilk ex:sheepmilk). ].
6. Entailment Rules
There are no additional entailment rules.
7. Syntactic Constraints
There are no syntactic constraints.
8. Discussion
There are several issues concerning the current support in SKOS for "meaningful groupings of concepts". The most serious of these is the self-contradiction within the SKOS specs, which is capture in ISSUE-33. There are other issues also.
The first of these is that it is not possible to explicitly state that a grouping is not ordered. An unordered group is the default assumption, given a lack of any explicit ordering information. SKOS applications, therefore, are required to perform a kind of default reasoning, which adds some complexity to both specifications and implementation.
The second of these is that there is a logical dependency between the skos:member and skos:memberList properties, which is stated in http://www.w3.org/TR/2005/WD-swbp-skos-core-guide-20051102/#seccollections SKOS-GUIDE-SEC-COLLECTIONS as a rule, using the Jena rule syntax. This dependency is complicated and unnecessary.
The third issue is non-technical, and concerns naming. The name "Collection" is used in RDF to denote lists; it is also used in library, museum and archives communities to denote a set of objects such as a collection of books or art works. It has been argued that URIs should be treated as opaque, and therefore it doesn't matter what the URI is. However, from a practical point of view, the choice of name does affect the ease of writing clear specifications. There is, clearly, an overlap between the use of "Bundle" as proposed here, and the use of "bundles" to informally denote groups of "tags" in a folksonomy, although this may not be inappropriate.
Because of these issues, this proposal suggests a fresh start. Although proposals that have the smallest impact for current implementations would normally be favoured, in this case all implementations will have to make a fundamental change anyway in order to resolve the fundamental contradiction in ISSUE-33, so the additional changes proposed do not call for much extra effort. It also makes it very simple to identify deprecated usage, because all the old URIs are deprecated.
In order to show the label of a bundle as part of a hierarchical display, this proposal assumes the use of a simple algorithm. This algorithm is the same as that described in SkosDesign/GroupingConstructs/ProposalOne.
Take for example the following snippet from a thesaurus that uses "node labels":
milk .<milk by source animal> ..buffalo milk ..cow milk ..goat milk ..sheep milk
Under this proposal, the concepts and their paradigmatic relationships must first be explicitly stated, i.e.:
<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 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"/> </skos:Concept> <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>
A labelled bundle can then be declared also:
<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:Bundle> <rdfs:label xml:lang="en">milk by source animal</rdfs:label> <skos:bundleIsOrdered rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</skos:bundleIsOrdered> <skos:bundleMembers rdf:parseType="Collection"> <skos:Concept rdf:about="http://www.example.com/concepts#buffalomilk"/> <skos:Concept rdf:about="http://www.example.com/concepts#cowmilk"/> <skos:Concept rdf:about="http://www.example.com/concepts#goatmilk"/> <skos:Concept rdf:about="http://www.example.com/concepts#sheepmilk"/> </skos:bundleMembers> </skos:Bundle> </rdf:RDF>
The thesaurus hierarchy (i.e. tree) can then be constructed from these graphs, by using a simple algorithm.
Informally, the algorithm starts from the milk concept, and constructs a tree node labelled "milk". Then, all narrower concepts are considered. For each concept which is not a member of a bundle, a tree node is constructed and added as a direct child of "milk". However, if some or all of the narrower concepts are members of a labelled bundle, then a child tree node is first added with the bundle label (in this case all concepts are members of the bundle labelled "milk by source animal"). Tree nodes are then constructed for all members of the bundle, and added as children of the group node.
Note that it is not specified how the algorithm should handle situations where concepts have multiple broader concepts (i.e. "polyhierarchies"). The algorithm might therefore lead to the spurious introduction of bundle labels in multiple locations in a hierarchy - this needs some test cases.
It is also not clear how this algorithm handles nested bundles.
N.B. Under this proposal, applications can safely be written that completely ignore the grouping constructs. This is a significant advantage of this proposal.
[http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/ [RDF Concepts]] http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/
[http://www.w3.org/TR/2004/REC-rdf-mt-20040210/ [RDF Semantics]] http://www.w3.org/TR/2004/REC-rdf-mt-20040210/
[http://www.ietf.org/rfc/rfc2119.txt [RFC 2199]] http://www.ietf.org/rfc/rfc2119.txt
http://www.w3.org/TR/2005/WD-swbp-skos-core-guide-20051102/#seccollections SKOS-GUIDE-SEC-COLLECTIONS http://www.w3.org/TR/2005/WD-swbp-skos-core-guide-20051102/#seccollections