我正在使用Protege 4.3来制定一些SWRL规则。是否可以编写包含分离的规则,例如:
Person(?x), Age(?x,?age), (?age < 10 or ?age > 30) -> blabla(?x)意思是所有年龄< 10 或> 30的人
发布于 2014-03-20 14:16:06
不幸的是,您不能以您想要的方式直接表示规则体中的分离,但是有一些解决办法。最直接的解决方案是编写两条规则:
人(X),年龄(X,?),?年龄< 10 -> (?X) 人(X),年龄(X,?),?年龄> 30 -> (?x)
SWRL确实支持类表达式的使用(请参阅Martin的http://dior.ics.muni.cz/~makub/owl/中的更多内容),因此您可以这样做:
人(?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)是什么,您可能只需要使用一般的类公理就可以接受。例如,如果blah实际上是一个类,Not10To30YearOldPerson,您可以使用如下的公理:
Person (age some (xsd:integer< 10 或 xsd:integer> 30) subClassOf not TenToThirtyYearOldPerson )

https://stackoverflow.com/questions/22534868
复制相似问题