有没有办法让一个属性(在个人身上)实际上是对另一个类的引用?
例如,在示例Wine ontology(http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine)中,我想为Wine
这样的特定葡萄酒指定pairsWellWith
属性LaneTannerPinotNoir
,引用另一个类RedMeat
。
我想要个人(LaneTannerPinotNoir
)引用类似RedMeat
的类 - 而不是像Steak
这样的个人。从一个人到另一个人的引用是微不足道的(对象属性)。
我想这样做而不必混淆层次结构。即。LaneTannerPinotNoir
不是RedMeat
,因此任何涉及多层次结构的解决方案都可能出错。
也许我可以某种方式推断所有可能的个体?那也没关系。
答案 0 :(得分:1)
想象一下,你正在用蔬菜烹饪辛辣的烤面包。让我们假设你的酒窖里有一瓶Lane Tanner Pinot Noir Julia's Vineyard 2006。你不记得这个瓶子,你喜欢你的数字葡萄酒配对助手,帮助你选择合适的葡萄酒。助理知道您在酒窖中的所有瓶子,并可以访问邻近的葡萄酒精品店的链接数据,建议您购买什么。
你真正希望这个工具说的是:
lt:JuliaVineyard2006 onto:pairsWellWith my:spicyRoastedBeef .
知道:
my:spicyRoastedBeef a onto:RedMeat .
lt:JuliaVineyard2006 a lt:PinotNoir .
在这种情况下,您希望知识库知道所有LT的黑皮诺与所有红肉菜肴搭配得很好。这可以在OWL中说,但it's not trivial。幸运的是,Lane Tanner的知识库有关于其葡萄酒的这些公理:
ex:r1 a owl:ObjectProperty .
ex:r2 a owl:ObjectProperty .
onto:pairsWellWith owl:propertyChainAxiom ( ex:r1 ex:r2 ) .
ex:a a owl:Thing .
lt:PinotNoir a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty ex:r1;
owl:someValuesFrom [a owl:Class; owl:oneOf ( ex:a )]
] .
onto:RedMeat a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty [owl:inverseOf ex:r2];
owl:someValuesFrom [a owl:Class; owl:oneOf ( ex:a )]
] .
助理只需要问:
SELECT ?wine WHERE {
?wine onto:pairsWellWith my:spicyRoastedBeef .
}
查询正确的数据源组合并应用正确的推理。您可以从酒窖中获取适合您用餐的所有葡萄酒,以及从邻近商店购买的建议。
在OP评论之后编辑:为了使本体不那么富有表现力,也可以简单地将每个葡萄酒与红肉联系起来(说葡萄酒与所有红葡萄酒搭配得很好肉类,像这样:
onto:RedMeat a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty onto:pairsWellWith;
owl:hasValue lt:JuliaVineyard2006
] .
对于所有与红肉搭配良好的葡萄酒,你必须这样做。
如果您认为这仍然过于富有表现力,您还可以明确地明确添加所有配对(葡萄酒,餐)很好地配对,这从消费者的角度来看是有效的,但相当于说&# 34; f ** k语义"并且在发布商方面投入了大量开销。
另一种选择是完全忽略OWL并提供与其他技术等效的含义,例如基于规则的推理。规则交换(RIF)有一个标准,这样你就可以与世界分享你的规则本体,但是RIF在采用方面并不是很成功,所以大多数人/系统都会忽略它。 存在其他非标准定义规则的方法,例如SWRL,SPIN,n3。该规则很容易表达和推理:
?x a lt:PinotNoir .
?y a onto:RedMeat .
----------------------------
?x onto:pairsWellWith ?y .
还有其他方法可以将个人与班级联系起来,例如使用owl:AnnotationProperty
或惩罚。但是,没有这些技术会传达你想要的正确语义。