Итак, в ваших данных есть что-то вроде следующего:
:x :parentOf :y .
:x :gender "male" .
, и вы хотели бы сделать вывод, что:
:x :fatherOf :y .
Боюсь, вы не можете сделать это вСОВА.В таких случаях вы можете использовать язык правил, такой как SWRL, SPIN и т. Д. Однако для конкретного случая отца, матери и т. Д. Вы можете сделать следующее:
- определить
:hasParent
как обратное :parentOf
; - ограничить количество элементов от
:hasParent
до 2; - определить
:hasFather
как обратное к :fatherOf
; - make
:hasFather
a owl:FunctionalProperty
; - определить
:hasMother
как инверсию :motherOf
; - make
:hasMother
a owl:FunctionalProperty
; - определить класс
:Man
людей мужского пола; - определить класс
:Woman
людей женского пола; - сделать
:Man
дизъюнктив * :Woman
; - установить диапазонот
:hasFather
до :Man
; - установите диапазон от
:hasMother
до :Woman
.
Таким образом, онтология выглядит так (в Turtle, потому что я незнакомы с OWL / XML):
:Person a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty :hasParent;
owl:cardinality 2
] .
:Man a owl:Class;
owl:equivalentclass [
a owl:Class;
owl:intersectionOf (
:Person
[
a owl:Restriction;
owl:onProperty :gender;
owl:hasValue "male";
]
)
] .
:Woman a owl:Class;
owl:equivalentclass [
a owl:Class;
owl:intersectionOf (
:Person
[
a owl:Restriction;
owl:onProperty :gender;
owl:hasValue "female";
]
)
] .
:gender a owl:DatatypeProperty, owl:FunctionalProperty .
:hasParent a owl:ObjectProperty;
owl:inverseOf :parentOf;
rdfs:domain :Person;
rdfs:range :Person .
:hasFather a owl:ObjectProperty, owl:FunctionalProperty;
rdfs:subPropertyOf :hasParent;
rdfs:range :Man .
:hasMother a owl:ObjectProperty, owl:FunctionalProperty;
rdfs:subPropertyOf :hasParent;
rdfs:range :Woman .
Это должно сработать, но это очень сложная онтология и рассуждения с ней могут быть очень медленными.
Редактировать: Я добавил, что :gender
должен быть функциональным, другойМудро может быть мать, которая в то же время является отцом, и это не сработает!