Класс с пользовательским правилом в онтологии OWL

Я создал онтологию с помощью 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

person Ravi Kumar    schedule 09.01.2016    source источник


Ответы (1)


Да, есть. Предполагая, что вы используете просто OWL, вы можете смоделировать его в Protege следующим образом:

  • Создать свойство объекта R_Man
  • Иди в класс Человек. Раздел EquivalentTo добавить:

    R_Man some Self

  • Перейдите к свойству hasSon. Раздел SuperPropertyOf (Chain) добавить:

    hasChild o R_Man

К сожалению, это даст вам ошибку Cyclic Dependency. Я знаю, что это не идеально, но если вы определите, что hasSon и hasDaughter не являются подсвойствами hasChild, это даст вам ожидаемый результат.

person user1156544    schedule 13.04.2016