Я создал онтологию с помощью Protege.
Классы –
Person
Man
Woman
Свойства (домен/диапазон)
Knows(Person / Person)
hasRelationShip(Person / Person)
hasParent(Person / Person)
hasFather(Person / Man)
hasMother(Person / Woman)
hasChild(Person / Person)
hasSon(Person / Man)
hasDaughter(Person / Woman)
Теперь я импортировал эту онтологию в jena fuseki. который настроен с помощью OWLMiniFBRuleReasoner, а затем создан некоторый экземпляр.
У меня есть следующая тройка экземпляров
:Ravi rdf:type :Man .
:Anjani rdf:type :Man .
:Indra rdf:type :Woman .
:Ravi :hasFather :Anjani .
:Ravi :hasMother :Indra .
Теперь, если я запрошу
SELECT DISTINCT ?a ?b WHERE {
?a :hasParent ?b
}
я получаю результат
:Ravi - :Anjani
:Ravi - :Indra
Если я запрошу -
SELECT DISTINCT ?a ?b WHERE {
?a :hasChild ?b
}
получаю результат -
:Indra - :Ravi
:Anjani - :Ravi
Но если запрос -
SELECT DISTINCT ?a ?b WHERE {
?a :hasSon ?b
}
Я не получаю никакого результата по понятной причине.
Итак, вопрос в том, есть ли способ сказать рассудку...
If (?a :hasChild ?b) and (?b rdf:type :Man)
Then ?a :hasSon ?b