根据被保护人4。x文档的属性链存在的对象属性,但在我的情况下,我需要包括如下的数据属性:
if builds(B, A) o has_name(A, "Holly wood") -> has_name(B, "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)
这不起作用!!!!你能帮我找出原因或找到一个合适的解决方案吗?
我认为SWRL规则是这里的适当解决方案。正如您所注意到的,您不能在子属性链公理中使用data属性,但是为了获得您正在寻找的行为,您需要这样做。对象子属性公理和数据子属性公理的结构规范如下:
9.2.1对象子属性SubObjectPropertyOf := 'SubObjectPropertyOf' '(' axiomAnnotations subObjectPropertyExpression superObjectPropertyExpression ')' subObjectPropertyExpression := ObjectPropertyExpression | propertyExpressionChain propertyExpressionChain := 'ObjectPropertyChain' '(' ObjectPropertyExpression ObjectPropertyExpression { ObjectPropertyExpression } ')'
9.3.1数据子属性SubDataPropertyOf := 'SubDataPropertyOf' '(' axiomAnnotations subDataPropertyExpression superDataPropertyExpression ')' subDataPropertyExpression := DataPropertyExpression superDataPropertyExpression := DataPropertyExpression
owl2没有混合对象和数据类型属性的属性链表达式。因此,您需要使用SWRL规则。您可以使用这样的规则(不需要使用Thing(?p) ∧Thing(?q),因为每个个体都是一个猫头鹰:Thing):
,,,,,,,,构建(?Q, ?p) ∧has_name (?P, ?name) &右箭头;has_name (?问,?名字)