RDF Schema
Ableitungsregeln
Type/subclass O a C1 .
C1 rdfs:subClassOf C2 .
# Es folgt:
O a C2 .
subClass-transitiv C1 rdfs:subClassOf C2 .
C2 rdfs:subClassOf C3 .
C1 rdfs:subClassOf C3 .
subClass-reflexiv O a C .
C rdfs:subClassOf C .
Property O1 p O2 .
p a rdf:Property .
subProperty p1 rdfs:subPropertyOf p2 .
O1 p1 O2 .
O1 p2 O2 .
subProperty-Transitivität p1 rdfs:subPropertyOf p2 .
p2 rdfs:subPropertyOf p3 .
p1 rdfs:subPropertyOf p3 .
Domain & Range p rdf:type C1 .
a p b .
a rdf:type C1 .
p rdf:type C2 .
a p b .
b rdf:type C2 .
Membership p rdf:type rdfs:ContainerMembershipProperty .
a p b .
a rdfs:member b .
Properties
Domain & Range
:Scientist
Grafische Darstellung Ableitung Domain & Range
rdfs:domain

rdfs:domain legt den Definitionsbereich einer Property fest.

P rdfs:domain C

P ist eine Instanz der Klasse rdf:Property, C ist eine Instanz der Klasse rdfs:Class. Das bedeutet, dass Ressourcen welche als Subjekt P haben, Instanzen von C sind.

:studies rdfs:domain :Scientist .
:RainerKuhlen :studies :InformationScience .

In diesem Beispiel folgt → :RainerKuhlen ist vom rdf:type :Scientist

rdfs:range

rdfs:range legt den Wertebereich einer Property fest.

P rdfs:range C

P ist eine Instanz der Klasse rdf:Property, C ist eine Instanz der Klasse rdfs:Class. Das bedeutet, dass Ressourcen welche als Objekt P haben, Instanzen von C sind.

:studies rdfs:range :ScientificField .
:RainerKuhlen :studies :InformationScience .

In diesem Beispiel folgt → :InformationScience ist vom rdf:type :ScientificField

Reifikation (rdf:Statement)

Dient dazu Aussagen über Aussagen zu machen.

Beispiel 1

Rainer Kuhlen definiert, dass Information durch einen Neuigkeitswert gekennzeichnet ist.

@prefix : <http://example.com/> .
@prefix rdf: <https://www.w3.org/TR/1999/REC-rdf-syntax-19990222/>

:RainerKuhlen :definiert [
   a rdf:Statement ;
   rdf:subject :Information ;
   rdf:predicate :hatEigenschaft ;
   rdf:object :Neuigkeitswert
] .
Namespaces: http://example.com/ rdf: https://www.w3.org/TR/1999/REC-rdf-syntax-19990222/ rdf:Statement http://www.w3.org/1999/02/22-rdf-syntax-ns#type Information rdf:subject hatEigenschaft rdf:predicate Neuigkeitswert rdf:object RainerKuhlen definiert

Beispiel 2

Ferdinand glaubt, dass Charles weiss, dass er seine Theorie kennt.

@prefix : <http://example.com/> .
@prefix rdf: <https://www.w3.org/TR/1999/REC-rdf-syntax-19990222/> .

:Ferdinand :glaubt [
   a rdf:Statement ;
   rdf:subject :Charles ;
   rdf:predicate :weiss ;
   rdf:object [
      a rdf:Statement ;
      rdf:subject :Ferdinand ;
      rdf:predicate :kennt ;
      rdf:object :TheorieVonCharles
   ]
] .
Namespaces: http://example.com/ rdf: https://www.w3.org/TR/1999/REC-rdf-syntax-19990222/ rdf:Statement http://www.w3.org/1999/02/22-rdf-syntax-ns#type Ferdinand rdf:subject kennt rdf:predicate TheorieVonCharles rdf:object glaubt rdf:object http://www.w3.org/1999/02/22-rdf-syntax-ns#type Charles rdf:subject weiss rdf:predicate
Terse RDF Triple Language (Turtle)

Turtle ist eine Syntax um RDF Graphen textlich abzubilden. Ein RDF Graph besteht aus den zwei Knoten über eine gerichtete Kante verbunden (Subjekt, Prädikat, Objekt).

Objekt Subjekt Prädikat
Visuelle Darstellung eines RDF Graphen.

Beispiel eines Turtle Dokuments

@prefix ex: <http://example.org/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .

ex:Bibliothek ex:bibliotheksTyp ex:HochschuleBibliothek .
dc:creator rdf:label "Ferdinand de Saussure"@de ;
   :ex:born "2020-02-02"^^xsd:date .
Simples Tripel (x y z .)

Ein simple Aussage besteht aus der Abfolge von Subjekt, Prädikat, Objekt jeweils durch ein Leerzeichen getrennt und abgeschlossen mit einem «.».

<http://example.org/#FerdinandDeSaussure> <http://example.org/#hatBeruf> <http://example.org/#Sprachwissenschaftler> .
Liste Prädikaten (;)

Oftmals wird das gleiche Subjekt mehrmals wiederholt und mit verschiedenen Prädikaten versehen. Für die Kurzschreibweise kann ein «;» verwendet werden. Dadurch wird das Subjekt wiederholt.

Folgende Beispiele sind in den Aussagen identisch:

<http://example.org/#FerdinandDeSaussure> <http://example.org/#hatBeruf> <http://example.org/#Sprachwissenschaftler> ;
<http://example.org/#geboren> "1857-11-26" .
<http://example.org/#FerdinandDeSaussure> <http://example.org/#hatBeruf> <http://example.org/#Sprachwissenschaftler> .
<http://example.org/#FerdinandDeSaussure> <http://example.org/#geboren> "1857-11-26" .
Liste Objekte (,)

Oftmals wird das gleiche Objekt mehrmals mit dem gleichen Subjekt und Prädikate wiederholt. Für die Kurzschreibweise kann ein «,» verwendet werden. Dadurch werden Subjekt und Prädikat wiederholt.

Folgende Beispiele sind in den Aussagen identisch:

<http://example.org/#FerdinandDeSaussure> <http://example.org/#name> "Ferdinand de Saussuere", "弗迪南·德·索緒爾" . <http://example.org/#FerdinandDeSaussure> <http://example.org/#name> "Ferdinand de Saussuere" .
<http://example.org/#FerdinandDeSaussure> <http://example.org/#name> "弗迪南·德·索緒爾" .
IRI (Internationalized Resource Identifier)

Eine IRI kann absolut, relativ oder mit einem präfix geschrieben werden. Absolute und relative IRIs sind in «<» und «>» eingeschlossen (z.B. <http://example.org/#name> oder <#name>).

Präfix (@prefix)

Initialisiert wird ein Präfix mittels «@prefix». Das «:» verbindet das Präfix Label und den lokalen Teil.

Folgende Beispiele sind in den Aussagen identisch:

@prefix ex: <http://www.example.org/#> .
ex:FerdinandDeSaussure ex:name "Ferdinand de Saussuere" .
<http://www.example.org/#FerdinandDeSaussure> <http://www.example.org/#name> "Ferdinand de Saussuere" .
http://www.w3.org/1999/02/22-rdf-syntax-ns#type (a)

Wird an der Prädikatsposition «a» geschrieben steht dies für den IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type.

Folgende Beispiele sind in den Aussagen identisch:

:FerdinandDeSaussure a :Person . :FerdinandDeSaussure <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> :Person . @prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
:FerdinandDeSaussure rdf:type :Person .
Basis IRI (@base)

Mittels «@base» wird die Basis IRI festgelegt welche sich darauf auswirkt wie lokale IRIs aufgelöst werden.

@base <http://my.example.org/> .
<FerdinandDeSaussure> <name> "Ferdinand de Saussuere" .
# Wird aufgelöst zu <http://my.example.org/FerdinandDeSaussure> <http://my.example.org/name> "Ferdinand de Saussuere" .
Literale

Literale enthalten Werte wie Zeichenketten, Zahlen oder Daten.

Literale werden mit Anführungszeichen gekennzeichnet. Zusätzlich kann dem Literal ein Sprachen-Tag mittels «@» oder ein Datentyp IRI mittels «^^» erweitert werden

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

:FerdinandDeSaussure rdfs:label "Ferdinand de Saussure"^^xsd:string .
:FerdinandDeSaussure :name "Ferdinand de Saussuere"@de, "弗迪南·德·索緒爾"@zh .
Leere Knoten
Leerer Knoten mit Label (_)

Ein leerer Knoten wird mittels «_:» initialisert gefolgt von einer Zeichenfolge aus Buchstaben und Zahlen.

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:deSaussure foaf:knows _:faesch .
_:faesch foaf:knows _:deSaussure .
Leerer Knoten ohne Label ([])

Ein anonymer Knoten wird mittels «[]» initialisiert.

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

[] foaf:knows [ foaf:name "Ferdinand de Saussure" ] .

Leere anonyme Knoten können auch verschachtelt werden.

@prefix foaf: . [ foaf:name "Ferdinand de Saussure" ] foaf:knows [
   foaf:name "Marie Faesch" ;
   foaf:knows [
      foaf:name "Jules Faesch" ] ;
   foaf:mbox <marie.faesch@example.com> ] .

Das obere Beispiel kann auch so geschrieben werden.

_:a <http://xmlns.com/foaf/0.1/name> "Ferdinand de Saussure" .
_:a <http://xmlns.com/foaf/0.1/knows> _:b .
_:b <http://xmlns.com/foaf/0.1/name> "Marie Faesch" .
_:b <http://xmlns.com/foaf/0.1/knows> _:c .
_:c <http://xmlns.com/foaf/0.1/name> "Jules Faesch" .
_:b <http://xmlns.com/foaf/0.1/mbox> <marie.faesch@example.com> .
Collections ( (:a :b :c) )

Eine Collections wird mittels «()» initialisiert. Eine Collection ist eine «abgeschlossene» Liste von Elementen. Das heisst nach der Definition können ihr keine zusätzlichen Elemente angefügt werden.

@prefix : <http://example.org/foo> .
# Das Objekt dieses Tripels ist das RDF collection blank node.
:subject :predicate ( :a :b :c ) .

# Eine leere Collection (rdf:nil)
:subject :predicate2 () .

Beispiel

:ListOfPhilosophers a ("Ferdinand de Saussure" "Ludwig Wittgenstein" "Charles W. Morris") . Namespaces: http://fhgr.ch/ Charles W. Morris http://www.w3.org/1999/02/22-rdf-syntax-ns#first http://www.w3.org/1999/02/22-rdf-syntax-ns#nil http://www.w3.org/1999/02/22-rdf-syntax-ns#rest http://www.w3.org/1999/02/22-rdf-syntax-ns#rest Ludwig Wittgenstein http://www.w3.org/1999/02/22-rdf-syntax-ns#first http://www.w3.org/1999/02/22-rdf-syntax-ns#rest Ferdinand de Saussure http://www.w3.org/1999/02/22-rdf-syntax-ns#first ListOfPhilosophers http://www.w3.org/1999/02/22-rdf-syntax-ns#type
RDF Container

RDF Container repräsentieren Sammlungen von Elementen. Elemente können in einem Container mehrmals vorkommen. Ein Container kann sich selbst enthalten.

Geordneter Conatiner (rdf:Seq)

Mittels dem rdf:Seq werden die lesenden Menschen darauf hingewiesen, dass die Reihenfolge im Container eine Rolle spielt.

:rangliste :hatReihenfolge [
   a rdf:Seq;
   rdf:_1 :Rainer ;
   rdf:_2 :Ferdinand ;
   rdf:_3 :Ludwig
] .
%3 Namespaces: http://example.com/ rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# B_:genid1 Rrdf:Seq rdf:Seq B_:genid1->Rrdf:Seq rdf:type RRainer Rainer B_:genid1->RRainer rdf:_1 RFerdinand Ferdinand B_:genid1->RFerdinand rdf:_2 RLudwig Ludwig B_:genid1->RLudwig rdf:_3 Rrangliste rangliste Rrangliste->B_:genid1 hatReihenfolge
Ungeordneter Conatiner (rdf:Bag)

Mittels dem rdf:Bag werden die lesenden Menschen darauf hingewiesen, dass die Reihenfolge im Container keine Rolle spielt.

:Kuhlen :definiertInfoAls [
   a rdf:Bag ;
   rdf:_1 :Adressatenbezogen ;
   rdf:_2 :Neuigkeit ;
   rdf:_3 :Kontextabhängig
] .
%3 Namespaces: http://example.com/ rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# B_:genid1 Rrdf:Bag rdf:Bag B_:genid1->Rrdf:Bag rdf:type RAdressatenbezogen Adressatenbezogen B_:genid1->RAdressatenbezogen rdf:_1 RNeuigkeit Neuigkeit B_:genid1->RNeuigkeit rdf:_2 RKontextabhängig Kontextabhängig B_:genid1->RKontextabhängig rdf:_3 RKuhlen Kuhlen RKuhlen->B_:genid1 definiertInfoAls
Container mit Alternativen (rdf:Alt)

Die Elemente im rdf:Alt Container beschreiben meisten Alternativen für typischerweise eine Ressource. Z.B. Übersetzungen.

:Information :hatUebersetzungen [
   a rdf:Alt ;
   rdf:_1 "Information"@en ;
   rdf:_2 "Informazione"@it ;
   rdf:_3 "Información"@es
] .
Tools & Weiterführendes
SPARQL Protocol And RDF Query Language (SPARQL)

SPARQL ist eine Abfragesprache für RDF Graphen mit den Möglichkeiten etwa Konjunktionen oder Disjunktionen abzufragen.

PREFIX

Mittels PREFIX können Kurzschreibweisen erstellt werden.

PREFIX rdfs: <http://www.w3.org/2000/01/rdfschema#>
SELECT * FROM{
   ?subj rdfs:label ?obj .
}
Variable (? oder $)

Eine Variable wird mittels «?» oder «$» initialisiert. Eingebürgert hat sich die Verwendung von ?. Variablen sind als Subjekt, Prädikat und Objekt zulässig.

SELECT ?var WHERE { … }
Einfaches Query (SELECT … WHERE)

Mit der Klausel SELECT werden die Variablen angegeben, welche im ausgeführten Query angezeigt werden sollen. Mit * werden alle Variablen die in der Anfrage vorkommen ausgegeben.

Mit der Klausel WHERE wird das Anfragemuster definiert. Das Anfragemuster wird in der Turtle Syntax geschrieben.

In diesem Beispiel wird angegeben, dass die Variable ?name im Resultat der Abfrage angezeigt werden soll.

Beispiel 1

RDF Daten

@prefix ex: <http://example.org/> .
@prefix rdfs: <https://www.w3.org/TR/rdf-schema/#>
ex:InformationScientist rdfs:label "Rainer Kuhlen" .

SPARQL Anfrage

SELECT ?name
WHERE
{
ex:InformationScientist rdfs:label ?name .
}

Resultat

name
"Rainer Kuhlen"

Beispiel 2

RDF Daten

@prefix ex: <http://example.org/> .
@prefix rdfs: <https://www.w3.org/TR/rdf-schema/#>
[] rdfs:label "Rainer Kuhlen" ;
    a ex:InformationScientist .
[] rdfs:label "Wolfgang Semar" ;
    a ex:InformationScientist .

SPARQL Anfrage

SELECT ?name ?type
WHERE
{
?x rdfs:label ?name .
?x a ?type
}

Resultat

name type
"Rainer Kuhlen" <http://example.org/InformationScientist>
"Wolfgang Semar" <http://example.org/InformationScientist>

Beispiel 3

PREFIX dbpedia3: <http://dbpedia.org/ontology/>

SELECT
?person
WHERE {
   ?person a foaf:Person .
   ?person dbpedia3:academicDiscipline :Information_Science .
}

Beispiel Live Testen

Entfernung von Duplikaten (SELECT DISTINCT)

Mittels DISTINCT werden Duplikate aus dem Ergebnis entfernt.

In diesem Beispiel würde, falls die Ressource zweimal gefunden wird, nur einmal ausgegeben.

SELECT DISTINCT ?InformationScientist WHERE{
   ex:InformationScientist rdfs:label "Rainer Kuhlen" .
}
Abfrage mit Literalen

Mittels @ wird das Literal auf eine Sprache eingeschränkt.

Mittels ^^ wird das Literal auf einen Datentyp eingeschränkt.

Beispiel 1

Abfrage des lexikalischen Literals «Ferdinand de Saussure» mit dem Sprachen-Tag «en» für Englisch.

SELECT * WHERE {
   ?subject ?predicate "Ferdinand de Saussure"@en
}

Live testen

Beispiel 2

Abfrage eines Literals mittels Angabe eines XSD-Datentyps. Hier wird nach dem Datum 1857-11-26 gesucht.

SELECT * WHERE {
   :Ferdinand_de_Saussure ?predicate '1857-11-26'^^xsd:date
}

Live testen

Anzahl Antworten begrenzen (LIMIT)

Mittels «LIMIT» kann begrenzt werden wie viele Antworten auf die gestellte Anfrage geliefert werden sollen.

SELECT * WHERE {
   ?person a foaf:Person .
} LIMIT 20

Hier werden die Anzahl Antworten auf 20 limitiert.

Live testen

Optionale Teile eines Anfragemusters (OPTIONAL)

Mittels dem Schlüsselwort OPTIONAL können einer Anfrage zusätzliche Teile angefügt werden.

In folgendem Beispiel wird nach Einträgen gesucht welche vom Typ foaf:Person sind. Ausgegeben wird jeweils der foaf:name der Person. Wenn die Person eine Akademische Disziplin ausübt wird diese ebenfalls ausgegeben.

PREFIX dbpedia3: <http://dbpedia.org/ontology/>

SELECT ?name ?aD WHERE {
   ?x a foaf:Person .
   ?x foaf:name ?name .
   OPTIONAL{
      ?x dbpedia3:academicDiscipline ?aD .
   }
} LIMIT 50

Live testen

Kombinierende Teile eines Anfragemusters (UNION)

Mittels dem Schlüsselwort UNION können Teile des Anfragesmusters vereint werden.

In folgendem Beispiel wird nach Museen in Bern und im Tessin gesucht und als eine Liste ausgegeben.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name
WHERE {
   {:List_of_museums_in_Bern dbo:wikiPageWikiLink ?name}
   UNION
   {:List_of_museums_in_Ticino dbo:wikiPageWikiLink ?name}
}

Live testen

Ergebnisse Filtern (FILTER)

Mittels dem Schlüsselwort FILTER gefolgt von den Filterbedingungen in Klammern, können Teile des Anfragesmusters gefiltert werden.

Filterfunktionen

In folgendem Beispiel wird nach Personen gesucht welche im Jahr 1990 und später geboren sind.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name ?birthYear WHERE {
   ?x a foaf:Person ;
      foaf:name ?name ;
      dbo:birthDate ?birthYear .
   FILTER(?birthYear > "1990"^^xsd:date)
} LIMIT 50

Live testen

In folgendem Beispiel wird nach Personen gesucht welche beim Namen "Ferdinand" enthalten.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name WHERE {
   ?x a foaf:Person ;
      foaf:name ?name .
   FILTER(REGEX(?name, "Ferdinand"))
} LIMIT 50

Live testen

In folgendem Beispiel werden Personen gesucht welche über 100 Jahre alt wurden.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name ?birthDate ?deathDate WHERE {
   ?x a foaf:Person ;
      foaf:name ?name ;
      dbo:birthDate ?birthDate ;
      dbo:deathDate ?deathDate .
   FILTER(YEAR(?deathDate) - YEAR(?birthDate) >= 100)
} LIMIT 50

Live testen

Reihenfolge der Resultate (ORDER BY)

Mittels dem Schlüsselwort ORDER BY gefolgt von der zu sortierenden Variable und option können die Ergebnisse auf- (ASC) und absteigend (DESC) sortiert werden.

In folgendem Beispiel werden die Resultate aufsteigend sortiert.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name ?birthDate ?deathDate WHERE {
   ?x a foaf:Person ;
      foaf:name ?name ;
      dbo:birthDate ?birthDate ;
       dbo:deathDate ?deathDate .
    FILTER(YEAR(?deathDate) - YEAR(?birthDate) >= 100)
}
ORDER BY ASC (?deatDate)
LIMIT 50
Beschränken der Resultate (LIMIT)

Mittels dem Schlüsselwort Limit gefolgt von einer Zahl lassen sich die Suchresultate auf eine Anzahl reduzieren.

In folgendem Beispiel werden die Resultate 100 Antworten limitiert.

SELECT ?name ?birthDate ?deathDate WHERE {
   ?x a foaf:Person .
}
LIMIT 100
Überspringen erster Resultate (OFFSET)

Mittels dem Schlüsselwort Offset gefolgt von einer Zahl lässt sich die Position der ersten gelieferten Einträge festlegen.

In folgendem Beispiel werden die ersten 50 Resultate übersprungen. Das bedeutet wenn eine Liste 200 Einträge hat, werden hier die Einträge 51 bis 151 angezeigt.

SELECT ?name ?birthDate ?deathDate WHERE {
   ?x a foaf:Person .
}
LIMIT 100 OFFSET 50
Zuweisung von Werten an Variabeln (BIND)

Mittels dem Schlüsselwort BIND können Werte in eine neue Variable gespeichert werden (z.B. Berechnungen).

In folgendem Beispiel wird das Alter der Person ausgerechnet als sie starb.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name ?age WHERE {
   ?x a foaf:Person ;
      foaf:name ?name ;
      dbo:birthDate ?birthDate ;
      dbo:deathDate ?deathDate .
      BIND(YEAR(?deathDate) - YEAR(?birthDate) AS ?age)
}
LIMIT 50

Live testen

Aggregate (GROUP BY … HAVING)

Um Aggregate zu errechnen, wird die Lösung zuerst in Gruppen geteilt, um für jede Gruppe anschliessend den aggregierten Wert zu errechnen.

Unterstütze Aggregate

COUNT, MIN, MAX, SUM, AVG

In folgendem Beispiel wird nach Personen und deren akademischen Feld gruppiert.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?person (COUNT(?aD) as ?anzAD)
WHERE {
   ?person a foaf:Person ;
   dbo:academicDiscipline ?aD .
}
GROUP BY ?person
LIMIT 50

Live testen

In diesem Beispiel wird zusätzlich HAVING verwendet um nur Personen anzuzeigen welche mehr als drei akademische Felder haben.

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?person (COUNT(?aD) AS ?anzAD)
WHERE {
   ?person a foaf:Person ;
   dbo:academicDiscipline ?aD .
}
GROUP BY ?person
HAVING (COUNT(?aD) > 3)
LIMIT 50

Live testen

OWL (Web Onotolgy Language)
Klassen (owl:Class)

Klassen in OWL sind vergleichbar mit Klassen in RDFS.

Definition

owl:Class

Beispiel

ex:Pinguin a owl:Class .
Subklassen (rdfs:SubClassOf)

Werden wie in RDFS definiert.

Definition

rdfs:SubClassOf

Beispiel

ex:Pinguin rdfs:subClassOf ex:Tier .
Vordefinierte Klassen (owl:Thing & owl:Nothing)

owl:Thing

Oberklasse aller Klassen. Enthält alle Individuen. Jede Klasse C ist Unterklasse von owl:Thing.

C rdfs:subClassOf owl:Thing .

owl:Nothing

Subklasse aller Klassen. Enthält keine Individuen. Jede Klasse C ist Oberklasse von owl:Nothing.

owl:Nothing rdfs:subClassOf C .
Klassenbeziehungen
Disjunktion: Keine gemeinsamen Elemente (owl:disjointWith)

Zwei Klassen sind disjunkt, wenn sie keine gemeinsamen Elemente beinhalten (leere Schnittmenge).

Definition

owl:disjointWith

Beispiel

fhgr:Dozent rdfs:subClassOf fhgr:Mitarbeiter .
fhgr:Freshman rdfs:subClassOf fhgr:Student .
fhgr:Mitarbeiter owl:disjointWith fhgr:Student .

→ Folgerung Dozent und Freshman sind ebenfalls disjunkt.

Äquivalenz: dieselben Elemente beinhalten (owl:equivalentClass)

Zwei Klassen sind äquivalent, wenn sie dieselben Elemente beinhalten, d.h. Teilmenge der jeweils anderen Klasse sind. owl:equivalentClass

Beispiel

fhgr:Buch rdfs:subClassOf fhgr:Publikation .
fhgr:Publikation owl:equivalentClass fhgr:Veröffentlichung .

→ Folgerung fhgr:Buch ist auch Unterklasse von fhgr:Veröffentlichung.

Logische Konstruktoren

Erzeugung komplexer Klassen aus einfachen Klassen mittels logischer Konstruktoren

Konjunktion: Und (owl:intersectionOf)

Umfasst alle Objekte zweier Klassen, die gleichzeitig zu beiden Klassen gehören

Definition

owl:intersectionOf

Beispiel

fhgr:DozentDAViS rdf:type owl:Class ;
   owl:equivalentClass [
      rdf:type owl:Class ;
      owl:intersectionOf ( fhgr:Dozent fhgr:MitarbeiterDAViS )
   ] .

→ Folgerung: jede(r) :DozentDAViS ist :Dozent und :MitarbeiterDAViS
→ Folgerung: jede(r) :Dozent und :MitarbeiterDAViS ist auch :DozentDAViS

Disjunktion: Oder (owl:unionOf)

Umfasst alle Objekte mehrerer Klassen, die zu (mindestens) einer der Klassen gehören

Definition

owl:unionOf

Beispiel

fhgr:Mitarbeiter rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Class ;
      owl:unionOf ( fhgr:Dozentin fhgr:Assistentin fhgr:Sekretärin )
   ] .

→ Folgerung: jede(r) :Dozentin, :Assistentin und :Sekretärin ist :Mitarbeiter

Komplement: Nicht (owl:complementOf)

Umfasst alle Objekte die nicht zu einer Klasse gehören

Definition

owl:complementOf

Beispiel

fhgr:Dozent rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Class ;
      owl:complementOf fhgr:Student    ] .

→ Folgerung: Kein :Dozent ist :Student

Individuen (owl:NamedIndividual)

Vergleichbar mit Objekten in RDFS. Muss nicht zwingend angegeben werden

Definition

owl:NamedIndividual

Beispiel einer Instanz

ex:Pingu a owl:NamedIndividual , ex:Pinguin .
Gleichheit (owl:sameAs)

Besagt, dass zwei Individuen identisch sind (Eigentlich zwei Bezeichner bezeichnen dasselbe Individum). Behebt Problematik non unique naming assumption.

Definition

owl:sameAs

Beispiel

ch:Graubünden owl:sameAs ch:Grischun .
Ungleichheit (owl:differentFrom)

Gegenteil von owl:sameAs.

Definition

owl:differentFrom

Beispiel

ch:Chur owl:differentFrom ch:Bern .

Einfachere Notation für viele Individuen

Verschiedenheit einer Menge von Individuen mithilfe von Listen.

owl:AllDifferent / owl:distinctMembers

Beispiel

[] rdf:type owl:AllDifferent ;
   owl:distinctMembers ( ex:Fisch ex:Säugetier ex:Amphibie ) .
Individuen als Klassen (owl:oneOf)

Definition von Klassen durch Aufzählung der darin enthaltenen Individuen.

Definition

owl:oneOf

Beispiel

fhgr:TeamDAViS owl:equivalentClass [
   owl:oneOf ( fhgr:Rölke fhgr:Mundani fhgr:Burch )
] .

→ Folgerung: fhgr:TeamDAViS besteht aus fhgr:Rölke, fhgr:Mundani und fhgr:Burch

Rollen

Sind Properties wie in RDFS, allerdings wird zwischen zwei Arten von Rollen unterschieden. Beides ist Unterklasse von rdf:Property. Beschränkungen werden wie bei RDFS definiert (rdfs:domain, rdfs:range).

Abstrakte Rolle (owl:ObjectProperty)

Verbindet Individuen mit Individuen.

owl:ObjectProperty

Beispiel

ex:lehrt rdf:type owl:ObjectProperty ;
   rdfs:domain fhgr:Person ;
   rdfs:range fhgr:Vorlesung .
fhgr:Mundani fhgr:lehrt fhgr:SESY .
Konkrete Rolle (owl:DatatypeProperty)

Verbindet Individuen mit Datenwerten (Elementen von Datentypen).

owl:DatatypeProperty

Beispiel

fhgr:hatBüro rdf:type owl:DatatypeProperty ;
   rdfs:domain fhgr:Person ;
   rdfs:range xsd:string .
fhgr:Mundani fhgr:hatBüro "B4.05" .
Gleichheit (owl:equivalentProperty)

besagt, dass zwei Rollen identisch sind (d.h. zwei Bezeichner bezeichnen dieselbe Rolle).

Definition

owl:equivalentProperty

Beispiel

fhgr:lehrt owl:equivalentProperty ch:unterrichtet .
Ungleichheit (owl:differentFrom)

Gegenteil von owl:sameAs.

Definition

owl:differentFrom

Beispiel

ch:Chur owl:differentFrom ch:Bern .
Symmetrische Rolle (owl:symmetricProperty)

Nur abstrakte Rollen dürfen symmetrisch, inverse und transitiv sein

Definition

owl:symmetricProperty

Beispiel

fhgr:teiltBüroMit rdf:type owl:symmetricProperty .
fhgr:Mundani fhgr:teiltBüroMit fhgr:Rölke .

→ Folgerung: fhgr:Rölke fhgr:teiltBüroMit fhgr:Mundani

Inverse Rolle (owl:inverseOf)

Nur abstrakte Rollen dürfen symmetrisch, inverse und transitiv sein

Definition

owl:inverseOf

Beispiel

fhgr:betreut owl:inverseOf fhgr:wirdBetreut .
fhgr:Dozent fhgr:betreut fhgr:Student .

→ Folgerung: fhgr:Student fhgr:wirdBetreut fhgr:Dozent

Transitive Rolle (owl:TransitiveProperty)

Nur abstrakte Rollen dürfen symmetrisch, inverse und transitiv sein

Definition

owl:TransitiveProperty

Beispiel

fhgr:kennt rdf:type owl:TransitiveProperty .
fhgr:Mundani fhgr:kennt fhgr:Rölke .
fhgr:Rölke fhgr:kennt fhgr:Barkow .

→ Folgerung: fhgr:Mundani fhgr:kennt fhgr:Barkow

Funktionale Rolle (owl:FunctionalProperty)

Besagt, dass eine Rolle einen eindeutigen Wert hat (d.h. aus A steht in Beziehung zu B und A steht in Beziehung zu C folgt, dass B und C identisch sind)

Definition

owl:FunctionalProperty

Beispiel

ch:hatHauptort rdf:type owl:FunctionalProperty .
ch:Graubünden ch:hatHauptort ch:Chur .
ch:Graubünden ch:hatHauptort ch:Cuira .

→ Folgerung: ch:Chur owl:sameAs ch:Cuira

Inverse Funktionale Rolle (owl:InverseFunctionalProperty)

besagt, dass eine Rolle ein Argument eindeutig identifiziert (d.h. aus A steht in Beziehung zu C und B steht in Beziehung zu C folgt, dass A und B identisch sind)

Definition

owl:InverseFunctionalProperty

Beispiel

ch:istHauptortVon rdf:type owl:InverseFunctionalProperty .
ch:Chur ch:istHauptortVon ch:Graubünden .
ch:Cuira ch:istHauptortVon ch:Graubünden .

→ Folgerung: ch:Chur owl:sameAs ch:Cuira

Rollenbeschränkungen

Können auf Klassen (owl:Class) oder Definitions uns Wertebereiche (rdfs:domain, rdfs:range) angewandt werden. Können auch geschachtelt werden.

Aufbau von Restriktionen:

  • Angabe der Rolle (owl:onProperty), auf die sich die Restriktion bezieht
  • Angabe der Beschränkung auf
    • Werte (owl:allValuesFrom, owl:someValuesFrom)
    • Kardinalitäten (owl:minCardinality, owl:maxCardinality, owl:Cardinality)
  • Kardinalitäts- und Wertrestriktionen sind nicht kombinierbar
owl:allValuesFrom

Deklaration von Aussagen über alle Elemente einer Klasse. Das bedeutet, alle Werte müssen einer bestimmten Klasse angehören

Beispiel

kochen:vegRezept rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Restriction ;
      owl:onProperty kochen:hatZutat ;
      owl:allValuesFrom kochen:Gemüse
   ] .
owl:someValuesFrom

Deklaration von Aussagen über mindestens ein Element einer Klasse. Das bedeutet, mindestens ein Wert muss einer bestimmten Klasse angehören.

Beispiel

sport:Ballsport rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Restriction ;
      owl:onProperty sport:benötigt ;
      owl:someValuesFrom sport:Ball
   ] .

→ Folgerung: für Ballsportarten wird ein Ball benötigt

owl:hasValue

Sonderfall: existentielle Quantifizierung (owl:hasValue). Problem: owl:someValuesFrom benötigt Klasse als Objekt

Beispiel

fhgr:Prüfung rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Restriction ;
      owl:onProperty fhgr:hatPrüfer ;
      owl:hasValue fhgr:Mundani
   ] .

→ Folgerung: jede fhgr:Prüfung hat fhgr:Mundani als Prüfer

owl:maxCardinality

Deklaration von Aussagen über obere Schranken von Elementen einer Klasse. Das bedeutet, es darf höchstens xx Werte geben

Beispiel

fhgr:BachelorArbeit rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Restriction ;
      owl:onProperty fhgr:hatReferent ;
      owl:maxCardinality 2^^xsd:nonNegativeInteger
   ] .

→ Folgerung: jede fhgr:BachelorArbeit hat höchstens zwei Referenten

owl:minCardinality

Deklaration von Aussagen über untere Schranken von Elementen einer Klasse. Das bedeutet, es muss mindestens xx Werte geben

Beispiel

fhgr:Prüfung rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Restriction ;
      owl:onProperty fhgr:hatThemen ;
      owl:minCardinality 5^^xsd:nonNegativeInteger
   ] .

→ Folgerung: jede fhgr:Prüfung hat mindestens fünf Themengebiete

owl:cardinality

Deklaration von Aussagen über exakte Kardinalitäten von Elementen einer Klasse. Das bedeutet, es muss exakt xx Werte geben

Beispiel

bio:Mensch rdf:type owl:Class ;
   owl:subClassOf [
      rdf:type owl:Restriction ;
      owl:onProperty bio:hatMutter ;
      owl:cardinality 1^^xsd:nonNegativeInteger
   ] .

→ Folgerung: jeder :Mensch hat genau eine (biologische) Mutter

owl:hasSelf

Beispiel

ex:Narzisst rdf:type owl:Class ;
owl:subClassOf [
rdf:type owl:Restriction ;
owl:onProperty ex:liebt ;
owl:hasSelf "true"^^xsd:boolean
] .
owl:dataRange

Beispiel

fhgr:Fresh-wo-man rdf:type owl:Class ;
owl:subClassOf [
rdf:type owl:Restriction ;
owl:onProperty fhgr:studiertImSemester
owl:dataRange ( "1"^^xsd:integer "2"^^xsd:integer )
] .
owl:withRestrictions

Neue Datentypen als Teilmenge bereits existierender Datentypen

Beispiel

tv:PrimeTime rdf:type rdfs:Datatype ;
owl:equivalentClass [
rdf:type rdfs:Datatype ;
owl:onDatatype xsd:integer ;
owl:withRestrictions (
[ xsd:minInclusive "20"^^xsd:integer ]
[ xsd:maxInclusive "23"^^xsd:integer ]
)
] .

tv:Abendprogramm rdf:type owl:Class ;
owl:equivalentClass [
rdf:type owl:Restriction ;
owl:onProperty tv:hatSendezeit ;
owl:someValuesFrom tv:PrimeTime
] .
owl:NegativePropertyAssertion

negative Rollenaussagen. Drückt aus, dass zwei Individuen nicht durch eine Rolle in Beziehung stehen.

Beispiel

[] rdf:type owl:NegativePropertyAssertion ;
owl:sourceIndividual ex:Romulus ;
owl:assertionProperty ex:istVaterVon ;
owl:targetIndividual ex:Remus .
owl:propertyChainAxiom

Liste von Rollen, die sequentiell ausgewertet werden.

Beispiel

Das Kind eines Kindes ist ein Enkel.

owl:propertyChainAxiom ( ex:hatKind ex:hatKind ) ;
owl:subPropertyOf ex:hatEnkel .

Der Feind meines Freundes ist mein Feind.

owl:propertyChainAxiom ( ex:hatFreund ex:hatFeind ) ;
owl:subPropertyOf ex:hatFeind .
Links
Sematic Web Rule Language (SWRL)

SWRL ist eine Regelsprache welche von vielen Reasoner unterstützt wird. Mit ihr lassen sich mittels Regeln Beziehungen modellieren, welche mit OWL nicht modellierbar sind.

Die Grundsyntax hat die Form Vorausgegangenes ⇒ Konsequenz. Variablen beginnen mit einem ?. Es können ausschliesslich Konjunktionen (UND, ^) verwendet werden.

Beispiel

elternteil(?x,?y) ∧ bruder(?y,?z) ⇒ onkel(?x,?z)
Vom RDF Tripel zum SWRL Baustein

Einstelliges Prädikat (OWL Klassen)

ex:Rainer_Kuhlen a ex:Scientist . Scientist(Rainer_Kuhlen)

Zweistelliges Prädikat (OWL Object- / Datatypeproperties)

ex:Rainer_Kuhlen ex:lehrt ex:Informationswissenschaft ;
                 ex:geburtstag '1944-01-07'^^xsd:date .
lehrt(Rainer_Kuhlen, Informationswissenschaft)
geburtstag(Rainer_Kuhlen, 1944-01-07)
Gleichheit und Verschiedenheit

Mit sameAs und differentFrom wird auf Gleichheit resp. Verschiedenheit überpüft.

Gleichheit

Wahr wenn beide Ressourcen die gleiche ISBN haben.

isbn(?x,?n) ^ isbn(?y,?n) → sameAs(?x,?y)

Verschiedenheit

Wahr wenn beide Ressourcen (?x, ?y) unterschiedlich sind.

hatMutter(?x,?z) ^ hatMutter(?y,?z) ^ differentFrom(?x,?y) → hatGeschwister(?x,?y) ^ hatGeschwister(?y,?x)
Negation

SWRL hat keine Möglichkeit der Negation. Mithilfe von owl:complementOf kann dies trotzdem bewerkstelligt werden.

Beispiel

«Lebewesen, die im Wasser leben, sind keine Menschen»

ex:keinMensch owl:complementOf ex:Mensch . Lebewesen(?x) ^ lebtIn(?x,Wasser) ⇒ keinMensch(?x)
Built-Ins

Built-Ins dienen um komplexe Operationen möglich zu machen wie z.B. Arithmetische Operationen. Mittels Built-Ins können freie Variablen gebunden werden.

Beispiel

Hier wird das Alter einer Person in Jahre zum Alter der Person in Sekunden umgerechnet. ?sekunden entspricht hier der freien Variable welche mit dem Produkt (?alter * 86400) belegt wird.

hatAlter(?person,?alter) ^ swrlb:multiply(?sekunden,?alter,86400) → alterInSekunden(?person,?sekunden)

Liste Built-Ins

Semantic Query-Enhanced Web Rule Language (SQWRL)

Abfragesprache für semantische Schlussfolgerungen (inkl. Regeln)

sqwrl:select

Erlaubt die Selektion von Ergebnissen.

hatBeruf(?x,?y) → sqwrl:select(?x)
sqwrl:orderBy

Sortiert Ergebnisse aufsteigend.

hatAlter(?x,?age) ^ swrlb:greaterThan(?age,25) → sqwrl:select(?x,?age) ^ sqwrl:orderBy(?age)
sqwrl:count

Zählt Ergebnisse.

Mensch(?x) → sqwrl:count(?x)
Aggregation
  • sqwrl:min
  • sqwrl:max
  • sqwrl:sum
  • sqwrl:avg
Person(?x) ^ hatAlter(?x,?age) → sqwrl:avg(?age)

Quellen: https://www.w3.org/TR/rdf-schema/, https://www.w3.org/TR/2013/REC-sparql11-overview-20130321/