Присвоение значения свойству на основе правила SWRL (Protege 4.3 с Pellet в качестве аргумента)

Мой вопрос связан с правилами SWRL и фактически уже был задан другим пользователем (см. Определение свойства онтологии в Protégé-OWL / SWRL). Тем не менее, после выполнения инструкций о том, как заставить его работать, я не был успешным.

В моей онтологии мне приходится работать с некоторыми сложными временными фактами (связанными с временными интервалами и т. Д.), Поэтому я импортирую Онтологию времени. Прежде чем заняться реальной проблемой, я рассмотрю простой пример, проверяющий, как присвоить значение свойству данных на основе правила SWRL. Простой пример имеет дело с классом Person. Также существует класс BirthYear (подкласс класса Instant из онтологии времени). Свойство объекта bornInYear с доменом Person и диапазоном BirthYear связывает Лицо с годом его рождения. Я хотел бы рассчитать возраст человека в текущем году, поэтому я сформулирую это правило SWRL:

Человек (? P) ∧ bornInYear(? P,? BirthYear) ∧ вычитать (? Age, 2014,? BirthYear) → возраст (? P,? Age)

После создания лица класса Person и утверждения, что его / ее BirthYear имеет значение "1977"Я ожидаю, что Пеллет подсчитает, что возраст этого человека 37 лет. Такого не бывает. Есть идеи почему? Правильно ли правило SWRL? (Для того, чтобы узнать, если значение 37 утверждается в возрасте свойства данных, я смотрю на "Утверждения свойств" человека с. Я также проверяю, чтобы в настройках аргумента был установлен флажок "Утверждения свойств объекта". Мой пример онтологии выглядит следующим образом:

Prefix(SWRLexample:=<http://www.semanticweb.org/ontologies/2014/1/SWRLexample#>)
Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
Prefix(swrlb:=<http://www.w3.org/2003/11/swrlb#>)
Prefix(owl:=<http://www.w3.org/2002/07/owl#>)
Prefix(:=<http://www.semanticweb.org/ontologies/2014/1/untitled-ontology-101#>)
Prefix(time:=<http://www.w3.org/2006/time#>)
Prefix(xml:=<http://www.w3.org/XML/1998/namespace>)
Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
Prefix(swrl:=<http://www.w3.org/2003/11/swrl#>)
Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)


Ontology(<http://www.semanticweb.org/ontologies/2014/1/SWRLexample>
Import(<http://www.w3.org/2006/time>)

Declaration(Class(SWRLexample:BirthYear))
SubClassOf(SWRLexample:BirthYear time:Instant)
Declaration(Class(SWRLexample:Person))
Declaration(ObjectProperty(SWRLexample:bornInYear))
ObjectPropertyDomain(SWRLexample:bornInYear SWRLexample:Person)
ObjectPropertyRange(SWRLexample:bornInYear SWRLexample:BirthYear)
Declaration(DataProperty(SWRLexample:age))
AnnotationAssertion(rdfs:comment SWRLexample:age "Age of a person in years")
DataPropertyDomain(SWRLexample:age SWRLexample:Person)
DataPropertyRange(SWRLexample:age xsd:int)
Declaration(NamedIndividual(SWRLexample:birthYear1))
ClassAssertion(SWRLexample:BirthYear SWRLexample:birthYear1)
DataPropertyAssertion(time:year SWRLexample:birthYear1 "1977"^^xsd:gYear)
Declaration(NamedIndividual(SWRLexample:p1))
ClassAssertion(SWRLexample:Person SWRLexample:p1)
ObjectPropertyAssertion(SWRLexample:bornInYear SWRLexample:p1 SWRLexample:birthYear1)
DLSafeRule(Body(ClassAtom(SWRLexample:Person Variable(<urn:swrl#p>)) ObjectPropertyAtom(SWRLexample:bornInYear Variable(<urn:swrl#p>) Variable(<urn:swrl#birthYear>)) BuiltInAtom(swrlb:subtract Variable(<urn:swrl#age>) "2014"^^xsd:integer Variable(<urn:swrl#birthYear>)))Head(DataPropertyAtom(SWRLexample:age Variable(<urn:swrl#p>) Variable(<urn:swrl#age>))))
)

2 ответа

Вот последовательные шаги:

  • Перейти на вкладку метаданных
  • Импортируйте временную онтологию, префикс как временную.
  • Перейти на вкладку SWRL

Напишите правило следующим образом:

Person(?x) ^ hasDOB(?x, ?dob) ^ temporal:duration(?age, "now", ?dob, temporal:Years) -> hasAge(?x,  ?age)

где Person это классhasDOB,hasAge являются свойствами объекта

Есть несколько проблем (но я рад, что этот другой ответ был полезной отправной точкой):

  • age - это свойство данных, поэтому вам нужно не только убедиться, что установлен флажок "Утверждения свойств объекта", но и "Утверждения свойств данных", так как вы ищете утверждение типа данных.

  • BornInYear - это свойство объекта, поэтому ?birthYear в bornInYear(?p, ?birthYear) должен быть человеком. Однако аргументы swrlb:subtract должны быть числовыми литералами. Чтобы использовать swrlb: вычитание, вам нужно получить целое значение года в правиле и выполнить арифметику для этого. Вы должны быть в состоянии сделать это без особых проблем, хотя я не уверен, что вы все равно сможете использовать значение "1977"^^xsd:gYear, Однако SWRL определяет некоторые функции, работающие с датами и временем (см. 8.5. Встроенные модули для даты, времени и продолжительности). Хотя не все рассуждатели поддерживают это (например, я не думаю, что Пеллет поддерживает). Однако значение свойства year должно быть xsd: gYear.

Другие вопросы по тегам