我面臨一個關于為不同的 rdfs:Classes 執行不同的表達時間決議的能力的問題。我有一個圖表,其中:
:event a rdfs:Class.
:subevent rdfs:subClassOf :event.
以及相關的 SHACL 規則,其中事件類要求其暫時存在僅在日期解決時報告,而子事件是更精確定義的時間點:
: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 是否能夠表達子事件時間點必須落在超類日期內的約束?是唯一可能為此使用 SHACL-SPARQL 嗎?我知道,與 dateTime 相比,年、月、日、日期本質上是不同的野獸,因為它們不是點,而是兩個時間點之間的范圍。
我似乎找不到將 dateTime 轉換為日期的函式,也許只是轉換為 xsd:date 就可以了,但不確定這是否是大多數引擎以統一方式支持的東西。所以我的主要問題是——對于同一個繼承謂詞的不同解析度的這種要求是否可以在純 SHACL 本身中實作?或者我應該借助例如 OWL Time 本體來使用不同的謂詞?與僅使用純 SHACL 相比,這似乎是不必要的復雜化。
編輯:作為澄清,我確實認識到在其當前形狀中不可能定義子事件,因為限制它的形狀是矛盾的。
uj5u.com熱心網友回復:
對于這種情況,您不能使用 sh:datatype。子類只能縮小超類的約束。因此,如果超類允許 xsd:date,則子類不能將其進一步限制為 xsd:dateTime。雖然期望 dateTimes 是日期的“子集”聽起來很直觀,但這不是 SHACL 的作業方式,因為它只會比較確切的資料型別,即資料型別的 URI 必須匹配。
我也相信擁有 xsd:date 或 xsd:dateTime 的屬性是非常不尋常的,具體取決于背景關系。這使得應用程式更難處理。例如,想象一個針對事件作業但不知道子事件的演算法。如果這樣的演算法總是可以假設 xsd:date 文字,那將是最好的。一種設計替代方案是定義兩個屬性,其中 xsd:date 屬性始終存在(即使對于子類的實體),而子類可能有另一個屬性來表示更多細節。
順便說一句,要從 xsd:dateTime 轉換為 xsd:date,您可以使用 xsd:date 作為 SPARQL 函式:BIND (xsd:date(NOW()) AS ?date)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456820.html
