我的问题是,如果我想检查实例是否在范围内,我使用以下规则:
Rule1: Error(?d), TimeRelatedError(?c), TimeRelatedError_start_at(?c, ?s), error_at(?d, ?b), greaterThan(?b, ?s) -> is_after_TimeRelatedError_start(?d, true)
Rule2: Error(?d), TimeRelatedError(?c), TimeRelatedError_end_at(?c, ?e), error_at(?d, ?b), lessThan(?b, ?e) -> is_before_TimeRelatedError_end(?d, true)
如果我的本体中只有一个 TimeRelatedError 它就可以工作,如果我有更多的实例,它将始终触发 true(因为其中一个 TimeRelatedError 总是在开始/结束点之前/之后(。你有什么想法如何解决这个问题吗?我想如果我以某种方式将我的 TimeRelatedError 分配给错误实例,我可以解决这个问题,但我不知道如何。请OWL/SWRL专业人员帮助我完成这项任务:)
我只能责怪自己,我找到了解决方案,只有一条规则:
Error(?d), TimeRelatedError(?c), TimeRelatedError_start_at(?c, ?s), error_at(?d, ?b), greaterThan(?b, ?s), TimeRelatedError_end_at(?c, ?e), error_at(?d, ?b), lessThan(?b, ?e) -> in_range(?d, true)
它之所以有效,是因为只有在语句(greaterThan(为真时,才会调用greaterThan之后的所有内容,最后如果结尾也小于,我们可以将其称为in_range。我把它留在这里,供其他偶然发现同一问题的人使用。