Я использую Protege 4.3 для создания некоторых правил SWRL. Можно ли написать правило, содержащее дизъюнкт? Например:
Person(?x), Age(?x,?age), (?age < 10 or ?age > 30) -> blabla(?x)
Имеются в виду все люди в возрасте ‹ 10 ИЛИ > 30 лет.
Я использую Protege 4.3 для создания некоторых правил SWRL. Можно ли написать правило, содержащее дизъюнкт? Например:
Person(?x), Age(?x,?age), (?age < 10 or ?age > 30) -> blabla(?x)
Имеются в виду все люди в возрасте ‹ 10 ИЛИ > 30 лет.
К сожалению, вы не можете напрямую выразить дизъюнктию в теле правила так, как вам хотелось бы, но есть некоторые обходные пути. Самое прямое решение - написать два правила:
Человек(?x), Возраст(?x,?возраст), ?возраст ‹ 10 -> blah(?x)
Человек(?x), Возраст(?x,?возраст), ?возраст > 30 -> мля(?х)
SWRL поддерживает использование выражений класса (подробнее см. в OWL 2 и SWRL Tutorial), поэтому вы можете сделать это:
Person(?x), ((возраст xsd:integer[‹ 10]) или (возраст xsd:integer[> 30]))(?x) -> blah(?x)
но вы не сможете ввести это правило в Protege, даже если вы напишете его в каком-то другом редакторе онтологий или напишете вручную, Protege сможет его отобразить правильно. Вы могли бы просто сделать еще больше и сделать это:
Человек(?x), ((возраст (xsd:integer[‹ 10] или xsd:integer[> 30]))(?x) -> blah(?x)
или даже отец и сделать это:
(Человек и (некоторый возраст (xsd:integer[‹ 10] или xsd:integer[> 30])))(?x) -> blah(?x)
Конечно, на этом этапе, в зависимости от того, что такое blah(?x), вы можете просто использовать общую аксиому класса, которую Protege примет. Например, если blah на самом деле является классом, Not10To30YearOldPerson, вы можете использовать такую аксиому:
Человек и (возраст некоторый (xsd:integer[‹ 10] или xsd:integer[> 30])) subClassOf not< /strong> TenToThirtyYearOldPerson