Najlepsza praktyka definiowania właściwości?
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
Sposób rozwiązania tego problemu w SHACL polega na zastosowaniu 2 różnych kształtów: jednego dla kiedy ClassA
jest domeną i drugiego dla kiedy ClassB
jest domeną.
Aby osiągnąć coś podobnego w OWL, będziesz potrzebować 2 właściwości obiektu: jednej dla kiedy ClassA
jest domeną i jednej dla kiedy ClassB
jest 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 classAHasClassC
i classBHasClassC
są 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, ClassB
jako domenę hasClassC
, oznacza to, że domena jest połączeniem ClassA
i ClassB
. Zamiast tego, co ClassA, ClassB
oznacza, że domena jest skrzyżowanie z ClassA
i 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
)
] ;