1

根据 protege 4.x 文档,对象属性存在属性链,但是在我的情况下,我需要包含如下数据属性:

if builds(B, A) o has_name(A, "Holly wood") -> has_name(B, "Holly wood")

稍微解释一下,假设我们有一条名为“Hollywood”的街道。这条街道由几段(一段是交叉路口之间的街道的一部分)组成,其名称应与街道名称“Hollywood”相同。请注意,街道概念与段不同,因此它们不是子类,但它们具有上述关系(构建)。

一种解决方案是使 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)

这不起作用!!!!你能帮我找出原因或找到合适的解决方案吗?

4

1 回答 1

2

我认为 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

OWL 2 根本没有混合对象和数据类型属性的属性链表达式。因此,您需要使用 SWRL 规则。您可以使用这样的规则(无需使用Thing(?p) ∧ Thing(?q),因为每个人都会自动成为owl:Thing):

        builds(?q, ?p) ∧ has_name(?p, ?name) → has_name(?q, ?name)

于 2015-06-04T19:33:20.847 回答