This is an archive of an inactive wiki and cannot be modified.

Design patterns for the representation of "annotations".

N-Ary Relation Pattern

link to this pattern

Here is a design pattern for the representation of annotations on concepts and/or on one or more literals. In this case the annotation is represented as an n-ary relation between 0 or more concepts, 0 or more literals, and the content of the annotation.

First declare necessary vocabulary (assume conventional namespace prefixes) ...

# main annotation class
skos:Annotation a rdfs:Class.

# specific annotation types
skos:ScopeNote a rdfs:Class; rdfs:subClassOf skos:Annotation.
# etc. for other annotation types

# property to link resources to annotations
skos:annotation a rdf:Property; rdfs:range skos:Annotation.

# property to link annotations to literals
skos:annotatesLiteral a rdf:Property; rdfs:domain skos:Annotation; rdfs:range rdfs:Literal.

# property to give text content to annotation
skos:annotationContent a rdf:Property; rdfs:domain skos:Annotation; rdfs:range rdfs:Literal.

Now apply, e.g. ...

@prefix eg: <http://example.org/concepts#> .

eg:A a skos:Concept;
  skos:prefLabel "foo"@en;
  skos:altLabel "bar"@en;
  skos:annotation [
    a skos:Annotation;
    skos:annotatesLiteral "bar"@en;
    skos:annotationContent "The label 'bar' is only used on tuesdays."@en;
  ];
.

This framework can be extended to support multiple annotation scenarios, for example ...

@prefix x: <http://example.org/skos-extensions#>.

# extended annotation type
x:AcronymRelationship a rdfs:Class; rdfs:subClassOf skos:Annotation.

# extended annotation links
x:acronymForm a rdf:Property; rdfs:subPropertyOf skos:annotatesLiteral.
x:fullForm a rdf:Property; rdfs:subPropertyOf skos:annotatesLiteral.

# now use the extensions ...

eg:B a skos:Concept;
  skos:prefLabel "toilet"@en;
  skos:altLabel "water closet"@en;
  skos:altLabel "WC"@en;
  skos:annotation [
    a x:AcronymRelationship;
    x:acronymForm "WC"@en;
    x:fullForm "water closet"@en;
    skos:annotationContent "'WC' is an acronym for 'water closet'."@en;
  ];
.

... or e.g. ...

x:LiteralTranslation a rdfs:Class; rdfs:subClassOf skos:Annotation.

eg:C a skos:Concept;
  skos:prefLabel "cat"@en;
  skos:altLabel "feline"@en;
  skos:prefLabel "chat"@en;
  skos:altLabel "féline"@fr;
  skos:annotation [
    a x:LiteralTranslation;
    skos:annotatesLiteral "cat"@en;
    skos:annotatesLiteral "chat"@fr;
  ];
  skos:annotation [
    a x:LiteralTranslation;
    skos:annotatesLiteral "feline"@en;
    skos:annotatesLiteral "féline"@fr;
  ];
.

MIME Annotations

link to this pattern

The above pattern only accounts for annotations that have plain text content. A framework to support annotations with content according to an arbitrary MIME type would be preferable. Assuming the following vocabulary has been declared somewhere ...

@prefix mime: <http://www.w3.org/somebodyshoulddothis/mime#>.

mime:Message a rdfs:Class.
mime:content a rdf:Property; rdfs:domain mime:Message; rdfs:range rdfs:Literal.
mime:type a rdf:Property; rdfs:domain mime:Message; rdfs:range rdfs:Literal.
mime:language a rdf:Property; rdfs:domain mime:Message; rdfs:range rdfs:Literal.

... this would allow the annotations pattern above to be modified slightly as follows ...

# declare range of annotation content as a MIME message
skos:annotationContent a rdf:Property; rdfs:domain skos:Annotation; rdfs:range mime:Message.

... and then used as in e.g. ...

eg:D a skos:Concept;
  skos:prefLabel "The theory of general relativity"@en;
  skos:annotation [
    a skos:ScopeNote;
    skos:annotationContent [
      mime:content "As embodied by the well known equation E=MC^2.";
      mime:type "text/plain";
      mime:language "en";
    ];
    skos:annotationContent [
      mime:content """
        As embodied by the well known equation <em>E</em> = <em>MC</em><sup>2</sup>.
      """^^rdfs:XMLLiteral;
      mime:type "application/xhtml+xml";
      mime:language "en";
    ];
  ];
.

N.B. The above example invents an RDF vocabulary for describing MIME messages, which [AlistairMiles: AFAIK] does not exist. There is however an RDF vocabulary for describing HTTP messages. Rewriting the examples above using the HTTP vocab might give ...

@prefix http: <http://www.w3.org/2006/12/http#>.

# declare range of annotation content as a MIME message
skos:annotationContent a rdf:Property; rdfs:domain skos:Annotation; rdfs:range http:Response.

... and then used as in e.g. ...

eg:D a skos:Concept;
  skos:prefLabel "The theory of general relativity"@en;
  skos:annotation [
    a skos:ScopeNote;
    skos:annotationContent [
      http:body "As embodied by the well known equation E=MC^2.";
      http:content-type "text/plain";
      http:content-language "en";
    ];
    skos:annotationContent [
      http:body """
        As embodied by the well known equation <em>E</em> = <em>MC</em><sup>2</sup>.
      """^^rdfs:XMLLiteral;
      http:content-type "application/xhtml+xml";
      http:content-language "en";
    ];
  ];
.