Присвоение значения свойству на основе правила 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.