使用SWRL时间内置函数比较DateTime值:equals规则异常求解
SWRL时间内置函数equals规则异常问题分析
问题背景
使用SWRL时间内置函数比较DateTime值,重点测试equals、before、after运算符。其中before和after功能符合预期,但equals规则出现异常,结果不符合预期。
RDF数据
@prefix : <http://example.org/test#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix ex: <http://example.org#> . :elapse1 :hasTime "2026-01-11T17:30:00"^^xsd:dateTime . :elapse2 :hasTime "2026-01-11T17:30:00"^^xsd:dateTime . :elapse3 :hasTime "2026-01-11T11:30:00"^^xsd:dateTime . :BeforeEvent rdf:type owl:Class . :AfterEvent rdf:type owl:Class . :Equals rdf:type owl:Class . :hasTime a owl:DatatypeProperty ; rdfs:range xsd:dateTime .
SWRL规则
:hasTime (?e1,?t1) ^ :hasTime (?e2,?t2) ^ temporal:before(?t1,?t2) -> :BeforeEvent(?e1) :hasTime (?e1,?t1) ^ :hasTime (?e2,?t2) ^ temporal:after(?t1,?t2) -> :AfterEvent(?e1) :hasTime (?e1,?t1) ^ :hasTime (?e2,?t2) ^ temporal:equals(?t2,?t1) -> :Equals(?e2)
运行结果
通过Protege 5.6.7的SWRLTab运行规则后,得到以下结果:
:elapse1 a :AfterEvent, :Equals . :elapse2 a :AfterEvent, :Equals . :elapse3 a :BeforeEvent, :Equals .
异常原因及解决方案
原因分析
问题出在equals规则的变量绑定逻辑上:SWRL规则默认允许变量?e1和?e2绑定到同一个实例。也就是说,每个事件都会和自身进行时间比较——比如elapse3的时间和自己的时间必然相等,因此规则会触发,将elapse3也归类到Equals类中,导致结果不符合预期。
解决方案
需要在equals规则中添加限制条件,确保?e1和?e2是不同的实例,使用swrlb:notEqual内置函数实现。修改后的规则如下:
:hasTime (?e1,?t1) ^ :hasTime (?e2,?t2) ^ temporal:equals(?t2,?t1) ^ swrlb:notEqual(?e1, ?e2) -> :Equals(?e2)
修改后,只有elapse1和elapse2会满足条件(时间相等且为不同实例),被归类到Equals类,符合预期。
内容的提问来源于stack exchange,提问作者Ines
相关产品推荐
相关产品推荐

