0

我正在使用 Protege 4.3 来制定一些 SWRL 规则。是否可以编写一个包含析取的规则例如:

Person(?x), Age(?x,?age), (?age < 10 or ?age > 30) -> blabla(?x)

表示所有年龄 < 10> 30的人

4

1 回答 1

2

不幸的是,您不能以您想要的方式直接在规则正文中表达析取,但有一些解决方法。最直接的解决办法是写两条规则:

Person(?x), Age(?x,?age), ?age < 10 -> blah(?x)
Person(?x), Age(?x,?age), ?age > 30 -> blah(? X)

SWRL 确实支持使用类表达式(请参阅 Martin Kuba 的OWL 2 和 SWRL 教程中的更多内容),因此您可以这样做:

Person(?x), ((some Age xsd:integer[< 10]) or (some Age xsd:integer[> 30]))(?x) -> blah(?x)

但是你将无法在 Protege 中输入该规则,即使你在其他一些本体编辑器中编写它,或者手动编写它,Protege 也可以正确显示它。您可以更简单地执行以下操作:

Person(?x), ((some Age (xsd:integer[< 10] or xsd:integer[> 30]))(?x) -> blah(?x)

甚至是父亲,然后这样做:

(Person and (some Age (xsd:integer[< 10] or xsd:integer[> 30])))(?x) -> blah(?x)

当然,此时,根据blah(?x)是什么,您也许可以只使用 Protege 将接受的通用类公理。例如,如果blah实际上是一个类Not10To30YearOldPerson,您可以使用如下公理:

Person and (age some (xsd:integer[< 10] or xsd:integer[> 30])) subClassOf not TenToThirtyYearOldPerson

公理代替规则

于 2014-03-20T14:16:06.297 回答