Best Practice zum Definieren von Eigenschaften?

Nov 23 2020

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

3 HenrietteHarmse Nov 24 2020 at 15:22

Sie haben dies in SHACL gelöst, indem Sie zwei verschiedene Formen haben: eine für wann ClassAist die Domäne und eine für wann ClassBist die Domäne.

Um in OWL etwas Ähnliches zu erreichen, benötigen Sie zwei Objekteigenschaften: eine für wann ClassAist die Domäne und eine für wann ClassBist 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 classAHasClassCund nicht zusammenhängend classBHasClassCsind:

: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, ClassBals Domäne von hasClassChaben, dies bedeutet, dass die Domäne die Vereinigung von ClassAund ist ClassB. Stattdessen ClassA, ClassBbedeutet dies, dass die Domäne der Schnittpunkt von ClassAund ist ClassB. Um festzulegen, dass die Union verwendet werden soll, muss Folgendes verwendet werden:

rdfs:domain [ rdf:type owl:Class ;
  owl:unionOf (:ClassA
               :ClassB
              )
            ] ;