是否可以在针对子类的 SHACL 形状中定义不同分辨率的时间?

Is it possible to define time at different resolutions in SHACL shapes targeted to subClasses?

我面临一个问题,即能否针对不同的 rdfs:Classes 执行不同的表达时间分辨率。我有一个图表,其中:

:event a rdfs:Class.
:subevent rdfs:subClassOf :event.

以及相关的 SHACL 规则,其中事件 class 要求其时间存在仅在日期解析时报告,而子事件是更精确定义的时间点:

:eventSH a sh:NodeShape;
   sh:targetClass :event;
   sh:property [
      sh:path :happeningOn;
      sh:datatype xsd:date;
      sh:minCount 1;
      sh:maxCount 1;
   ].
:subeventSH a sh:NodeShape;
   sh:targetClass :subevent;
   sh:property [
      sh:path :happeningOn;
      sh:datatype xsd:dateTime;
      sh:minCount 1;
      sh:maxCount 1;
   ].

所以,在本体论的意义上,我需要以不同的分辨率来表达事件(有些事件只知道发生在某一年,有些事件例如在某个日期,有些事件是已知发生的在精确的时间点)。

本质上,问题是:SHACL 是否能够表达 子事件时间点必须落在超级 class 日期 内的约束?是否只能为此使用 SHACL-SPARQL?我知道,与 dateTime 相比,年、月、日、日期本质上是不同的野兽,因为它们不是点,而是两个时间点之间的范围。

我似乎找不到将 dateTime 转换为日期的函数,也许只需转换为 xsd:date 即可,但不确定这是否是大多数引擎以统一方式支持的功能。所以我的主要问题是——在纯 SHACL 本身中是否可以实现对同一继承谓词的不同解决方案的要求?或者我应该借助于例如使用不同的谓词吗? OWL时间ontology?与仅使用纯 SHACL 相比,这似乎是一种不必要的并发症。

编辑:作为澄清,我确实认识到在其当前形状中无法定义子事件,因为限制它的形状是矛盾的。

对于这种情况,您不能使用 sh:datatype。子类只能缩小来自超类的约束。所以如果超类允许 xsd:date 那么子类就不能进一步限制它到 xsd:date 的时间。虽然期望 dateTimes 是日期的“子集”听起来很直观,但这不是 SHACL 的工作方式,因为它只会比较确切的数据类型,即数据类型的 URI 必须匹配。

我还认为 属性 是 xsd:date 或 xsd:dateTime 是非常不寻常的,具体取决于上下文。这使得应用程序更难处理。例如,假设一个算法正在处理事件并且不知道 sub-event。如果这样的算法总是可以假设 xsd:date 字面值,那将是最好的。一种设计替代方案是定义两个属性,其中 xsd:date 属性 始终存在(即使对于子类的实例),而子类可能有另一个 属性 来表示更多细节。

顺便说一下,要从 xsd:dateTime 转换为 xsd:date,您可以使用 xsd:date 作为 SPARQL 函数:BIND (xsd:date(NOW()) AS ?date )