Najlepsza praktyka definiowania właściwości?

Nov 23 2020

Mój problem z OWL / RDFS polega na tym, że definiując wiele zakresów i domen, osoba rozumująca sklasyfikuje instancje (które są zdefiniowane jako dziedzina lub zakres) jako typ wszystkich zdefiniowanych klas dla domeny lub zakresu tej właściwości.

Jakie są możliwe rozwiązania tego problemu?

  • Jednym ze sposobów byłoby użycie SHACL. Ale teraz narzędzia do wizualizacji już nie działają.

krótki przykład:

: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: wyjście rozsądku:

:instanceA a :ClassB .

Obejście problemu z 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 .

Odpowiedzi

3 HenrietteHarmse Nov 24 2020 at 15:22

Sposób rozwiązania tego problemu w SHACL polega na zastosowaniu 2 różnych kształtów: jednego dla kiedy ClassAjest domeną i drugiego dla kiedy ClassBjest domeną.

Aby osiągnąć coś podobnego w OWL, będziesz potrzebować 2 właściwości obiektu: jednej dla kiedy ClassAjest domeną i jednej dla kiedy ClassBjest domeną.

: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 .

Aby to uczynić jeszcze bardziej jasne, może chcesz dodać obiekt nadrzędny i stwierdzać, że właściwości classAHasClassCi classBHasClassCsą rozłączne:

: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 .

Wreszcie, często popełnianym błędem jest myślenie, że jeśli masz ClassA, ClassBjako domenę hasClassC, oznacza to, że domena jest połączeniem ClassAi ClassB. Zamiast tego, co ClassA, ClassBoznacza, że domena jest skrzyżowanie z ClassAi ClassB. Aby określić, że Unia ma być używana, należy użyć następujących:

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