2014-02-11 3 views
0

Мой вопрос связан с правилами SWRL и на самом деле уже был задан другим пользователем (см. Ontology property definition in Protégé-OWL/SWRL). Тем не менее, после выполнения инструкций о том, как заставить его работать, мне не удалось.Присвоение значения собственности на основе правила SWRL (Protege 4.3 с помощью Pellet в качестве аргумента)

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

Человек ∧ bornInYear (? Р, год рождения) ∧ вычитания (возраст, 2014, ? birthYear) & rightarrow; возраст (? р,? возраст)

После создания особи класса Людей и утверждая, что его/ее год рождения имеет значение "1977", я ожидал бы Pellet подсчитать, что возраст этого человека является . Этого не происходит. Любая идея почему? Правильно ли правило 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>)))) 
) 
+0

На самом деле, я только заметил, что Pellet производит следующее сообщение об ошибке: 11 февраля 2014 1:43:45 PM com.clarkparsia.pellet.rules.BindingGeneratorStrategyImp l createGenerator Warnung: IGNORI Правило ПРАВИЛЫ НЕТ ([Лицо (? P), bornInYear (? P,? BirthYear), вычесть ([? Age, "2014" ^^ целое,? BirthYear])] => [age (? P,? Age)]): Не удалось создать безопасный порядок ограничений для тела. Гранулят в 280 мс –

ответ

0

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

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

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

+0

Спасибо, Джошуа, конечно, вы правы. Это свойство данных, и я установил флажок «Утверждения свойств данных». Просто путал терминологию в моем посте. Второй вопрос о аргументах встроенного SWQL-субстрата может быть решением моей проблемы. Я собираюсь изучить это сейчас! Спасибо –

+0

@Sabina Я тоже занимаюсь этим, думаю, вы сможете использовать арифметические функции даты (если вы используете аргумент, который их поддерживает), но вам нужно выяснить, как построить объекты даты или времени в правилах SWRL; Я не думаю, что вы просто сможете использовать gYears. –

+0

@ Joshua Pellet поддерживает некоторые связанные с dateTime SWRL встроенные (http://clarkparsia.com/pellet/faq/rules). И именно поэтому я прибегал к онтологии времени, потому что работа с простыми значениями int и поддерживаемым SWRL кажется недостаточно выразительной. Например. когда мне нужно указать в моем случае, что гарантийное время составляет 2 года, начиная с даты покупки товара. Если бы что-то вроде приведения gYear к int, это помогло бы, я думаю, для моей текущей проблемы. –

0

перейдите на вкладку метаданных импорта временных онтологий, префикс ее как временное перейти к SWRL вкладки правила записи следующим образом Person^hasDOB (х, д.р.?)^Височная (х): продолжительность («age», «now», «dob, temporal: Years) -> hasAge (? x,? age) где Person является классом hasDOB, hasAge - это свойство объекта

+1

Пожалуйста, возьмите секунду, чтобы [формат ответа] (http://stackoverflow.com/help/formatting)! – leo

Смежные вопросы