我想使用在类之间建模的知识。例如,我做了一辆汽车的模型,一辆公共汽车有四个轮子,一辆自行车有两个轮子。现在,我想表达的是,自行车可以小费(如果你不能保持他们的平衡-不称职的司机)。如果我添加一个实例"CB450",subClassOf Bike,一个规则应该能够进行推理:can(CB450,Tip)。方式:
Type(Cb450,Bike) and has(Bike,TwoWheels) and can(TwoWheels,Tip) -> can (CB450,Tip)
我没有找到任何方法在SWRL或Jena规则中表达这个规则。有可能吗?
我知道它可以以不同的方式建模,但我需要在实例中使用类关系作为规则。
我使用Protege 5.16和颗粒2.3.1。请参阅下面的示例本体
Prefix: owl: <http://www.w3.org/2002/07/owl#>
Prefix: rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
Prefix: xml: <http://www.w3.org/XML/1998/namespace>
Prefix: xsd: <http://www.w3.org/2001/XMLSchema#>
Prefix: rdfs: <http://www.w3.org/2000/01/rdf-schema#>
Ontology: <http://www.semanticweb.org/vehicle>
ObjectProperty: <http://www.semanticweb.org/vehicle#has>
ObjectProperty: <http://www.semanticweb.org/vehicle#can>
Class: <http://www.semanticweb.org/vehicle#Car>
SubClassOf:
<http://www.semanticweb.org/vehicle#Vehicle>,
<http://www.semanticweb.org/vehicle#has> some <http://www.semanticweb.org/vehicle#FourWheels>
Class: <http://www.semanticweb.org/vehicle#Vehicle>
Class: <http://www.semanticweb.org/vehicle#Bike>
SubClassOf:
<http://www.semanticweb.org/vehicle#Vehicle>,
<http://www.semanticweb.org/vehicle#has> some <http://www.semanticweb.org/vehicle#TwoWheels>
Class: <http://www.semanticweb.org/vehicle#FourWheels>
SubClassOf:
<http://www.semanticweb.org/vehicle#Property>
Class: <http://www.semanticweb.org/vehicle#TwoWheels>
SubClassOf:
<http://www.semanticweb.org/vehicle#can> some <http://www.semanticweb.org/vehicle#Tip>,
<http://www.semanticweb.org/vehicle#Property>
Class: <http://www.semanticweb.org/vehicle#Property>
Class: <http://www.semanticweb.org/vehicle#Tip>
SubClassOf:
<http://www.semanticweb.org/vehicle#Property>
Individual: <http://www.semanticweb.org/vehicle#CB450>
Types:
<http://www.semanticweb.org/vehicle#Bike>
Individual: <http://www.semanticweb.org/vehicle#Tip>
Types:
<http://www.semanticweb.org/vehicle#Tip>
根据您解释问题的方式,"CB40"看起来不是Bike的子类,而是Bike类型的个体。假设你有一个类Vehicle,一个数据属性hasWheels on Vehicle和一个布尔属性canTip on Vehicle,你可以把SWRL规则写为
Vehicle(?x) ^ hasWheels(?x, 2) -> canTip(?x, true)
翻译过来就是"一辆有两个轮子的汽车可能会翻车"。这个x是指定类型的任何个体。因此,如果您创建一个类Bike作为Vehicle的子类和该类的单个CB40,并设置所有相关的数据属性,推理器将为CB40 将canTip属性分配为true