【问题标题】:SWRL syntax in ProtegeProtege 中的 SWRL 语法
【发布时间】:2015-02-10 20:29:16
【问题描述】:

我正在使用 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 & UserContact 的子类是 FamilyContact、EmployeeContact 等。**User 和 Contact 由对象属性 isContactOf(People,Contact) 关联。在我的本体中应该只有User 类的一个个体。现在,我想实施 SWRL 规则,即 如果 **user 正在开会,则 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 的实例,反之亦然。

【问题讨论】:

  • 我已经添加了对规则有什么问题的解释,但我真的不能告诉你在不知道你实际尝试什么的情况下更好的做法 做。您尝试编写 supposed 来完成的规则​​是什么?领域和预期含义从上下文中不清楚,因此一个简化的示例可能会有所帮助。
  • @JoshuaTaylor ,我编辑了它,我希望它现在更清晰

标签: semantic-web owl protege protege4 swrl


【解决方案1】:

规则

用户(?u) ∧ isInActivity(?u, ?cm) ∧ ContextMeeting(?cm) → FamilyContact(?f) ∧ hasStatus(?f, "拒绝")

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

2.1. Rules

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

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

对于每个 u、cm 和 f,

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

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

用户(?u) ∧ isInActivity(?u, ?cm) ∧ ContextMeeting(?cm) ∧ FamilyContact(?f) → hasStatus(?f, "拒绝")

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

对于每个 u、cm 和 f,

  • 如果 u 是用户,cm 是 ContextMeeting,u 是 cm,f 是家庭联系人,
  • 那么 f 的状态为“reject”。

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

【讨论】:

  • 感谢您的帮助。我明白你的解释。是的,用户和FamilyContact 由对象属性“isContactOf”关联,即User(?u)、isContactOf(?u,?f)、FamilyContact(?f)。而且在我的本体中应该只有一个用户,而不是更多。顺便说一句,感谢您的详细解释。我将尝试在 SWRL 规则中添加 user 和 FamilyContact 之间的关系。
  • @user2083529 然后您需要将该连接添加到规则的前件。不过,您不必指定所有类条件。例如,如果你已经有 frobsBar(?f,?b),那么你可能不需要创建它 frobsBar(?f,?b), Frobber(?f), Bar(?b) 因为属性的域和范围可能已经保证了这一点。
  • 是的,我明白这一点。然而,我正在处理的是不同的。我有People 作为主类,userfamilyContact 作为People 的子类。 "isContactOf" 的域和范围是PeopleContactFamilyContact 实际上是 Contact 的子类,实习生是 People 的子类。无论如何,我认为我必须在规则中定义所有内容。
猜你喜欢
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多