0

我正在使用 Protege5.0,我想实现 SWRL 规则,即

User(?u), isInActivity(?u, ?cm), ContextMeeting(?cm) -> FamilyContact(?f), hasStatus(?f, "Reject")

这意味着“如果用户正在开会,则 familycontact 的状态为“拒绝”。

此语法应该可以工作并且 protege 不会显示任何错误。但是,它不起作用。当我写

User(?u), isInActivity(?u, ?cm), ContextMeeting(?cm), FamilyContact(?f) -> hasStatus(?f, "Reject")

这种语法完美地工作,但当我以这种格式编写复杂的规则时它没有用。谁能解释一下这两种格式的区别并给我一个完美的解决方案?

更多解释:

我有一个主类People和 People 的子类是Contact 和 User。Contact的子类是 FamilyContact、EmployeeContact 等。** User 和 Contact通过对象属性关联 isContactOf(People,Contact)。在我的本体中,应该只有一个User类。现在,我要实施 SWRL 规则,即如果 **用户正在开会,则 FamilyContact hasStatus "Reject"。** 此拒绝仅意味着家庭成员无法呼叫用户。其他规则是如果用户正在开会,那么 EmployeeContact 的状态为“通过”。hasStatus(Contact,String) 是一个函数属性。

第二个规则语法完美地工作,但是当我想为那些同时是EmployeeContact 和 FamilyContact的实例实施规则时,我遇到了问题。例如,如果我写一个规则,即

User(?u), isInActivity(?u, ?cm), ContextMeeting(?cm), FamilyContact(?f), EmployeeContact(?e), DifferentFrom(?f,?e)-> hasStatus(?f, "Reject").

它以某种方式工作,但我遇到了问题。它使 EmployeeContact 的其他实例也成为 FamilyContact 的实例,反之亦然。

4

1 回答 1

3

规则

User(?u) ∧ isInActivity(?u, ?cm) ∧ ContextMeeting(?cm) → FamilyContact(?f) ∧ hasStatus(?f, "Reject")

在规则的右侧(后件)使用 ?f,但不在左侧(前件)。这在语言中是不允许的(强调):

2.1。规则

原子可以指个体、数据字面量、个体变量或数据变量。变量被视为普遍量化的,其范围仅限于给定规则。像往常一样,只有出现在规则前件中的变量可能出现在后件中(通常称为“安全”的条件)。事实上,这种安全条件不会限制语言的表达能力(因为已经可以使用 OWL someValuesFrom 限制来捕获存在性)。

如果它是合法的,那么您的规则将意味着:

对于每个 u、cm 和 f,

  • 如果u 是 User 且 cm 是 ContextMeeting 并且 u 以 cm 为单位,
  • 那么f 是家庭联系人,状态为“拒绝”。

但是由于对 ?f 没有限制,这表示任何用户都在任何上下文会议中,那么一切都是状态为“拒绝”的家庭联系人,这可能不是您想要的。不应该 ?f 以某种方式与 ?u 有关吗?建议的替代方案:

User(?u) ∧ isInActivity(?u, ?cm) ∧ ContextMeeting(?cm) ∧ FamilyContact(?f) → hasStatus(?f, "Reject")

有类似的问题。这将意味着:

对于每个 u、cm 和 f,

  • 如果u 是 User 并且 cm 是 ContextMeeting 并且 u 在 cm 并且 f 是家庭联系人,
  • 那么f 的状态为“拒绝”。

u 和 f 之间仍然没有联系,所以这表示如果任何用户在任何上下文会议中,那么每个家庭联系人的状态都是“拒绝”。这似乎也不是你想要的。

于 2014-12-12T12:48:00.067 回答