OWL oder SHACL: welche Schemasprache wofür

Ein Auto?

OWL

OWL kann struktur in unstrukturierte Daten bringen. Es wird immer mal wieder von den Vorteilen von "sechemaless" Datenbanken geschwärmt: OWL kann eine gewisse Struktur in solche Daten bringen, ohne die grundsätzlichen Vorteile von schemaless einzuschränken, wie das arbeiten mit unvollständigen, einander wiedersprechenden oder verschieden modellierten Daten.

Der hauptsächliche Mechanismus den OWL dabei nutzt, ist formale Logik, mit der aus den vorhandenen Daten mehr Daten generiert werden.

So wird z.B. die Definition eines Autos als ein "Ding" mit vier Rädern in OWL so interpretiert, dass alles mit vier Rädern in der Datenbank als Auto klassifiziert wird. Was operativ heißt, dass allen Instanzen mit vier Rädern die Klasse "Auto" hinzgefügt wird - danach ist ein Triple mehr in der Datenbasis als zuvor.

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix ex: <http://example.org/schema/example/> .
@prefix ed: <http://example.org/data/example#> .

# OWL Schema
ex:Auto rdfs:subClassOf 
[ owl:intersectionOf
  ( ex:InanimateObject
    [ a owl:Restriction ;
     owl:onProperty ex:hasPart ;
     owl:allValuesFrom ex:Rad ;
                owl:cardinality 4 ;
                owl:maxCardinality 4 ;
                owl:minCardinality 4 ] 
   )
        ] .
        
# Daten
ed:_Bollerwagen1 ex:hasPart ed:_Rad1, ed:_Rad2, ed:Rad3, ed:Rad4 .
ed:_ReliantRobin1 a ex:Auto ; ex:hasPart ed:_RadA, ed:_RadB, ed:_RadC .  

In diesem kleinen "Wissensgraphen" wird ein OWL-Reasoner einen Fakt hinzufügen: ed:_Bollerwagen1 a ex:Auto und keinen Anstoß am Reliant Robin mit seinen drei Rädern nehmen, obwohl wir ein ex:Auto als etwas mit vier Rädern definiert haben. 

So kann man in eine schemalosen Datenbank mehr Struktur bringen als von vornherein vorhanden ist.

Anderseits:

 

Ein Auto?
Ein Auto?

Nicht sorgfältig erstellte OWL Schemata können leicht zu falschen Schlußfolgerungen führen. Tatsächlich kann das auch bei sorgfältig erstellten Schemata oder Ontologien passieren: die genauen Auswirkungen formaler Logik sind nicht immer einfach zu überblicken.

SHACL

Falls Sie lieber in klassischer Datenbankmanier eine bestimmte Struktur der Daten erzwingen wollen, ist SHACL die naheliegende Schemasprache.

Mit SHACL können sie erzwingen, dass jedes Objekt, dass sie als Auto kennzeichnen, auch 4 Räder haben muß. Was dann andererseits manche Autos ausschließt, wie z.B. den Reliant Robin. Eine typische Abwägung für und wieder den Einsatz von OWL und SHACL. 

Ein Schema wie 

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix ex: <http://example.org/schema/example/> .
@prefix ed: <http://example.org/data/example#> .

# SHACL schema
ex:Auto
    a rdfs:Class ;
	a sh:NodeShape ;
	sh:property [
		sh:path ex:hasPart ;
		sh:class ex:Rad ;
		sh:minCount 4 ;
		sh:maxCount 4
	] .

# data
 ed:_Bollerwagen1 ex:hasPart ed:_Rad1, ed:_Rad2, ed:Rad3, ed:Rad4 .
 ed:_ReliantRobin1 a ex:Auto; ex:hasPart ed:_RadA, ed:_RadB, ed:_RadC .  

Hier wird ein SHACL-Prozessor sofort über den Fehler stolpern, dass ed:_ReliantRobin1 nur drei Räder hat und eine entsprechende Fehlermeldung liefern. Viele Triplestores, die SHACL unterstützten, können so konfiguriert werden, dass sie solche Daten gar nicht erst zulassen, also den Fehler ausgeben und die Daten bzw. den Update ablehnen.  Andererseits wird keine Art von SHACL-Prozessor  oder SHACL-fähiger Triplestore den den Schluß ziehen, dass ed:_Bollwerwagen1 ein -Auto ist, also kein auch kein entsprechendes Triple hinzufügen.

Insofern läßt auch SHACL einiges an Freiheit, einiges von den Vorteilen von schemalosen Datenmodellen zu, der Bollerwagen mit seinen vier Rädern bleibt unbehelligt in den Daten stehen.

Auch mit OWL kann man die Struktur einschränken

Tatsächlich kann OWL mehr, als neue Daten erzeugen.

Wenn man zu obiger Definition folgendes hinzufügt

ex:Bollerwagen rdfs:subClassOf ex:Spielzeug .
ex:Auto rdfs:subClassOf ex:Erwachsenenzeug .
ex:Spielzeug owl:disjointWith ex:Erwachsenenzeug .

wird ein OWL-Reasoner schnell feststellen, dass der Bollerwagen sowohl ein Auto, also ein "Erwachsenenzeug" ist, als auch ein Spielzeug, und dass dies via owl:disjointWith expliziet als Wiederspruch definiert ist.

Dementsprechend wird es eine Fehlermeldung geben, und in vielen Triplestores werden diese Daten entsprechend abgelehnt werden.

Allerdings braucht OWL hierzu deutliche mehr Informationen als SHACL, wie hier die Definition von übergeordneten Klassen und das Axiom, dass kein Individuum gleichzeitig diesen beiden Klassen oder etwaigen Unterklassen dieser Klassen angehören kann. 

Und in OWL wird diese Information natürlich auf alle Daten in der Datenbank angewandt. Solch ein "disjoint" auf existierende Daten anzuwenden kann zu erstaunlich vielen Fehlermeldungen führen. Obige SHACL-Definition ist hingegen lokal: sie hat nur Auswirkungen auf Individuuen die explizit als Auto gekennzeichnet werden.

 

 

German