Protege ontology - 个人可以引用 class 吗?
Protege ontology - can an individual reference a class?
有什么方法可以使 属性(在个人上)实际上是对另一个 class 的引用?
例如,在示例 Wine ontology (http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine) 中,我想指定一个 Wine
属性 pairsWellWith
用于特定的葡萄酒,如 LaneTannerPinotNoir
,可以参考另一种 class,如 RedMeat
。
我想要个人 (LaneTannerPinotNoir
) 对 class(如 RedMeat
)的引用 -- 而不是对 Steak
这样的个人的引用。从一个人到另一个人的引用是微不足道的(对象 属性)。
我想这样做而不必弄乱层次结构。即 LaneTannerPinotNoir
不是 RedMeat
,因此任何涉及多层次结构的解决方案都可能是错误的。
也许我能以某种方式推断出所有可能的个体?那也行。
想象一下,您正在用蔬菜烹饪辣味烤牛肉。假设您的地窖里有一瓶 Lane Tanner 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 的评论后编辑: 使 ontology 不那么表达,也可以简单地将每种葡萄酒与红肉联系起来(说葡萄酒与所有红肉搭配都很好,就像这样:
onto:RedMeat a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty onto:pairsWellWith;
owl:hasValue lt:JuliaVineyard2006
] .
所有与红肉搭配的葡萄酒都必须这样做。
如果您认为这仍然过于表达,您还可以显式添加所有配对良好的配对 (wine,meal),这从消费者的角度来看是有效的,但等于说 "f**k semantics" 并给发布商带来大量开销。
另一种选择是完全忽略 OWL 并提供与其他技术等效的含义,例如基于规则的推理。有一个规则交换标准 (RIF),这样您就可以与世界分享您的规则-ontology,但 RIF 在采用方面并不是很成功,因此大多数 people/system会忽略它。
存在定义规则的其他非标准方式,例如 SWRL、SPIN、n3。该规则很容易表达和推理:
?x a lt:PinotNoir .
?y a onto:RedMeat .
----------------------------
?x onto:pairsWellWith ?y .
还有其他方法可以将个人与 class 联系起来,例如使用 owl:AnnotationProperty
或双关语。但是,这些技术都无法传达您想要的正确语义。
有什么方法可以使 属性(在个人上)实际上是对另一个 class 的引用?
例如,在示例 Wine ontology (http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine) 中,我想指定一个 Wine
属性 pairsWellWith
用于特定的葡萄酒,如 LaneTannerPinotNoir
,可以参考另一种 class,如 RedMeat
。
我想要个人 (LaneTannerPinotNoir
) 对 class(如 RedMeat
)的引用 -- 而不是对 Steak
这样的个人的引用。从一个人到另一个人的引用是微不足道的(对象 属性)。
我想这样做而不必弄乱层次结构。即 LaneTannerPinotNoir
不是 RedMeat
,因此任何涉及多层次结构的解决方案都可能是错误的。
也许我能以某种方式推断出所有可能的个体?那也行。
想象一下,您正在用蔬菜烹饪辣味烤牛肉。假设您的地窖里有一瓶 Lane Tanner 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 的评论后编辑: 使 ontology 不那么表达,也可以简单地将每种葡萄酒与红肉联系起来(说葡萄酒与所有红肉搭配都很好,就像这样:
onto:RedMeat a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:onProperty onto:pairsWellWith;
owl:hasValue lt:JuliaVineyard2006
] .
所有与红肉搭配的葡萄酒都必须这样做。
如果您认为这仍然过于表达,您还可以显式添加所有配对良好的配对 (wine,meal),这从消费者的角度来看是有效的,但等于说 "f**k semantics" 并给发布商带来大量开销。
另一种选择是完全忽略 OWL 并提供与其他技术等效的含义,例如基于规则的推理。有一个规则交换标准 (RIF),这样您就可以与世界分享您的规则-ontology,但 RIF 在采用方面并不是很成功,因此大多数 people/system会忽略它。 存在定义规则的其他非标准方式,例如 SWRL、SPIN、n3。该规则很容易表达和推理:
?x a lt:PinotNoir .
?y a onto:RedMeat .
----------------------------
?x onto:pairsWellWith ?y .
还有其他方法可以将个人与 class 联系起来,例如使用 owl:AnnotationProperty
或双关语。但是,这些技术都无法传达您想要的正确语义。