根据protege 4.x文档,对象属性存在属性链,但在我的情况下,我需要包含一个数据属性,如下所示:
if builds(B, A) o has_name(A, "Holly wood") -> has_name(B, "Holly wood")
为了解释一下,想象一下,我们有一条名为" Holly wood"的街道。这条街道由几个区段构成(一个区段是街道之间的一部分),其名称应与街道名称相同" Holly wood"。 请注意,街道概念与细分不同,因此它们不是子类,但它们具有上述关系(构建)。
一种解决方案是使has_name成为Object属性,然后每个名称应该是一个对象(实例)。
if is_name_of(name, A) o is_built_of(A, B) -> is_name_of(name, B)
这对我来说似乎不太好,因为我认为使用数据类型会更好。
另一种解决方案是使用SWRL,如下所示:
Thing(?p), Thing(?q), builds(?q, ?p), has_name(?p, ?name) -> has_name(?q, ?name)
这不起作用!!!! 你能帮我找出原因或找到合适的解决方案吗?
答案 0 :(得分:2)
我认为SWRL规则 是适当的解决方案。正如您所指出的,您不能在子属性链公理中使用data属性,但您需要为了获得您正在寻找的行为。对象子属性公理和数据子属性公理的结构规范是:
9.2.1 Object Subproperties
SubObjectPropertyOf := 'SubObjectPropertyOf' '(' axiomAnnotations subObjectPropertyExpression superObjectPropertyExpression ')' subObjectPropertyExpression := ObjectPropertyExpression | propertyExpressionChain propertyExpressionChain := 'ObjectPropertyChain' '(' ObjectPropertyExpression ObjectPropertyExpression { ObjectPropertyExpression } ')'
9.3.1 Data Subproperties
SubDataPropertyOf := 'SubDataPropertyOf' '(' axiomAnnotations subDataPropertyExpression superDataPropertyExpression ')' subDataPropertyExpression := DataPropertyExpression superDataPropertyExpression := DataPropertyExpression
OWL 2根本没有混合对象和数据类型属性的属性链表达式。因此,您需要使用SWRL规则。您可以使用这样的规则(不需要使用 Thing(?p)∧Thing(?q),因为每个人都自动为 owl:Thing ):
构建(?q,?p)∧has_name(?p,?name)→has_name(?q,?name)