Best Practice zum Definieren von Eigenschaften?
Mein Problem mit OWL / RDFS besteht darin, dass der Reasoner durch die Definition mehrerer Bereiche und Domänen Instanzen (die als Domäne oder Bereich definiert sind) als Typ aller definierten Klassen für die Domäne oder den Bereich dieser Eigenschaft klassifiziert.
Was sind mögliche Lösungen, um dieses Problem zu überwinden?
- Eine Möglichkeit wäre die Verwendung von SHACL. Aber jetzt funktionieren Visualisierungs-Tools nicht mehr.
kurzes Beispiel:
:ClassA a owl:Class .
:ClassB a owl:Class .
:ClassC a owl:Class .
:hasClassC a owl:ObjectProperty ;
rdfs:domain :ClassA, :ClassB;
rdfs:range :ClassC .
:instanceA a :ClassA ;
:hasClassC instanceC .
:instanceC a :ClassC .
Problem: Reasoner-Ausgabe:
:instanceA a :ClassB .
Problemumgehung mit SHACL:
:ClassA a owl:Class, sh:NodeShape ;
sh:property :ClassA-hasClassC .
:ClassA-hasClassC rdf:type sh:PropertyShape ;
sh:path :hasClassC ;
sh:class :ClassC .
:ClassB a owl:Class, sh:NodeShape ;
sh:property :ClassB-hasClassC .
:ClassB-hasClassC rdf:type sh:PropertyShape ;
sh:path :hasClassC ;
sh:class :ClassC .
Antworten
Sie haben dies in SHACL gelöst, indem Sie zwei verschiedene Formen haben: eine für wann ClassA
ist die Domäne und eine für wann ClassB
ist die Domäne.
Um in OWL etwas Ähnliches zu erreichen, benötigen Sie zwei Objekteigenschaften: eine für wann ClassA
ist die Domäne und eine für wann ClassB
ist die Domäne.
:classAHasClassC a owl:ObjectProperty ;
rdfs:domain :ClassA;
rdfs:range :ClassC .
:classBHasClassC a owl:ObjectProperty ;
rdfs:domain :ClassB;
rdfs:range :ClassC .
:instanceA a :ClassA ;
:classAHasClassC instanceC .
Um dies noch deutlicher zu machen, möchten Sie möglicherweise eine übergeordnete Eigenschaft hinzufügen und angeben, dass Eigenschaften classAHasClassC
und nicht zusammenhängend classBHasClassC
sind:
:hasClassC a owl:ObjectProperty
:classAHasClassC a owl:ObjectProperty ;
rdfs:subPropertyOf :hasClassC;
rdfs:domain :ClassA;
rdfs:range :ClassC .
:classBHasClassC a owl:ObjectProperty ;
rdfs:subPropertyOf :hasClassC;
owl:propertyDisjointWith :classAHasClassC
rdfs:domain :ClassB;
rdfs:range :ClassC .
Schließlich ist ein häufiger Fehler, der gemacht wird, der Gedanke, dass, wenn Sie ClassA, ClassB
als Domäne von hasClassC
haben, dies bedeutet, dass die Domäne die Vereinigung von ClassA
und ist ClassB
. Stattdessen ClassA, ClassB
bedeutet dies, dass die Domäne der Schnittpunkt von ClassA
und ist ClassB
. Um festzulegen, dass die Union verwendet werden soll, muss Folgendes verwendet werden:
rdfs:domain [ rdf:type owl:Class ;
owl:unionOf (:ClassA
:ClassB
)
] ;