# I want to ensure that tags are treated somewhat differently to mere
# "subjects"; they don't necessarily denote the subject of something per se.
# skos:Concept isn't far off, so for interoperability's sake :Tag and
# :taggedWithTag are tied in to skos:Concept and skos:subject.
# There are two ways to use this ontology.
# 1. Link resources to Tags through :taggedWithTag. Tags use :tagNames to name
# themselves; if you wish you can additionally use skos:prefLabel.
#
# 2. Link resource to Tags via :Tagging reifications. This allows a tagger,
# date, etc. to play a part in the interaction, but is less tied to SKOS.
#
# (2) is more thorough, but not so simple. Comments are welcome on all aspects
# of this draft, but particularly welcome on things labelled as "testing".
#
# Many thanks go to Danny Ayers (http://dannyayers.com) and Seth Russell
# (http://bozofaust.blogspot.com) for their already-invaluable insight.
#
# Richard Newman (http://www.holygoat.co.uk), 2005-03-23
# Update 2005-05-19: rename tagName to name.
# Update 2005-11-27: undo that change!
# Update 2005-12-21: add property inverse and Tagging subclass.
# This ontology.
@prefix : .
@prefix tags: .
# Stock imports.
@prefix rdf: .
@prefix rdfs: .
@prefix owl: .
@prefix dc: .
@prefix dct: .
@prefix skos: .
@prefix foaf: .
@prefix vs: .
# Might come in handy.
@prefix del: .
# This is where I put my tags.
@prefix tag: .
: a owl:Ontology;
dc:title "Tag ontology"@en ;
rdfs:label "An ontology for tags."@en ;
dc:description "An ontology that describes tags, as used in the popular del.icio.us and Flickr systems, and allows for relationships between tags to be described."@en ;
dct:issued "2005-03-23" ;
dct:modified "2005-12-21" , "2005-05-19" , "2005-11-27";
dc:creator "Richard Newman" ;
dc:contributor "Seth Russell" , "Danny Ayers" ;
foaf:maker .
:Tag a owl:Class ;
rdfs:subClassOf skos:Concept ;
skos:definition "A natural-language concept which is used to annotate another resource."@en ;
rdfs:label "Tag"@en .
:taggedWithTag a owl:ObjectProperty ;
rdfs:subPropertyOf skos:subject ;
rdfs:range :Tag ;
rdfs:label "tagged with tag"@en ;
rdfs:comment "Indicates that the subject has been tagged with the object tag. This does not assert by who, when, or why the tagging occurred. For that information, use a reified Tagging resource."@en .
:isTagOf a owl:ObjectProperty ;
owl:inverseOf :taggedWithTag ;
rdfs:domain :Tag ;
rdfs:label "is tag of"@en ;
rdfs:comment "Indicates that the subject tag applies to the object resource. This does not assert by who, when, or why the tagging occurred. For that information, use a reified Tagging resource."@en .
:Tagging a owl:Class ;
rdfs:label "tagging"@en ;
vs:term_status "testing" ;
rdfs:comment "A reified class which defines an instance of a tagging by an agent of a resource with one or more tags."@en .
:RestrictedTagging a owl:Class ;
rdfs:label "restricted tagging"@en ;
rdfs:comment "A Tagging which has precisely one associated resource, and one associated tag."@en ;
# We don't use equivalentClass here because we might allow extension or
# open-world things to apply.
rdfs:subClassOf :Tagging ,
[ a owl:Restriction ;
owl:cardinality 1 ;
owl:onProperty :taggedResource ] ,
[ a owl:Restriction ;
owl:cardinality 1 ;
owl:onProperty :associatedTag ] .
:tag a owl:ObjectProperty ;
rdfs:range :Tagging ;
rdfs:label "tag"@en ;
rdfs:comment "The relationship between a resource and a Tagging. Note, of course, that this allows us to tag tags and taggings themselves..."@en .
:taggedResource a owl:ObjectProperty ;
rdfs:domain :Tagging ;
vs:term_status "testing" ;
rdfs:label "tagged resource"@en ;
rdfs:comment "The object is a resource which plays a role in the subject Tagging."@en .
:associatedTag a owl:ObjectProperty ;
rdfs:domain :Tagging ;
rdfs:range :Tag ;
vs:term_status "testing" ;
rdfs:label "associated tag" ;
rdfs:comment "The object is a Tag which plays a role in the subject Tagging."@en .
:name a owl:DatatypeProperty ;
rdfs:domain :Tag ;
rdfs:subPropertyOf rdfs:label, dc:title ;
rdfs:label "tag name"@en ;
rdfs:comment "The name of a tag. Note that we can't relate this to skos:prefLabel because we cannot guarantee that tags have unique labels in a given conceptual scheme. Or can we?"@en .
:tagName a owl:DatatypeProperty ;
rdfs:domain :Tag ;
rdfs:subPropertyOf rdfs:label, dc:title ;
rdfs:label "tag name"@en ;
rdfs:comment "The name of a tag. Note that we can't relate this to skos:prefLabel because we cannot guarantee that tags have unique labels in a given conceptual scheme. Or can we? DEPRECATED 2005-05-19: redundant 'tag'."@en .
:taggedBy a owl:ObjectProperty ;
rdfs:domain :Tagging ;
rdfs:range foaf:Agent ;
vs:term_status "testing" ;
rdfs:label "tagged by"@en ;
rdfs:comment "The object plays the role of the tagger in the subject Tagging."@en .
:taggedOn a owl:DatatypeProperty ;
rdfs:subPropertyOf dc:date ;
rdfs:domain :Tagging ;
vs:term_status "testing" ;
rdfs:label "tagged on"@en ;
rdfs:comment "The subject Tagging occurred at the subject time and date."@en .
:relatedTag a owl:ObjectProperty ;
rdfs:subPropertyOf skos:semanticRelation ;
rdfs:domain :Tag ;
rdfs:range :Tag ;
vs:term_status "testing" ;
rdfs:label "related tag"@en ;
rdfs:comment "The two tags are asserted as being related. This might be symmetric, but it certainly isn't transitive."@en .
:equivalentTag a owl:ObjectProperty ;
rdfs:subPropertyOf owl:sameAs ;
rdfs:domain :Tag ;
rdfs:range :Tag ;
vs:term_status "testing" ;
rdfs:label "equivalent tag"@en ;
rdfs:comment "The two tags are asserted to be equivalent --- that is, that whenever one is associated with a resource, the other tag can be logically inferred to also be associated. Be very careful with this. I'm not sure if this should be a subproperty of owl:sameAs."@en .