我正在努力理解(對我而言)關于形狀約束繼承的一個非常不直觀的特征。我的問題是,當我嘗試通過 rdfs:subClassOf 繼承形狀約束時,這僅在資料圖中指定繼承時有效,而不是在形狀圖中指定時。
我已經在舊的和 Zazuko SHACL 游樂場中驗證了以下 PoC,并收到了相同的答案。
形狀圖:
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix : <http://lorem.ipsum/#> .
:Agent a rdfs:Class,
sh:Nodeshape;
sh:property [
sh:minCount 1;
sh:path :Name;
].
:Adult rdfs:subClassOf :Agent.
資料圖:
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix : <http://lorem.ipsum/#> .
:Father a :Adult.
:UnknownPerson a :Agent.
這個版本只要求 :UnknownPerson 應該至少有一個 :Name 屬性,但是當我將 移動:Adult rdfs:subClassOf :Agent到資料圖時,它會立即識別 :Father 和 :UnknownPerson 都應該有它。
我不明白為什么我不能在形狀圖本身中定義這種繼承?
如果在更基本的 RDF 級別上 :Adult 類被定義為 :Agent 類的子類(子集),因此它也應該是 sh:NodeShape,為什么當它被定義為時不應用屬性約束模式的一部分,而不是要驗證的資料的一部分?
uj5u.com熱心網友回復:
這是一個非常有效的問題,決定可以采取任何一種方式。定義 SHACL 的作業組最終采用了當前的設計——在目標機制的資料圖中和 sh:class 等地方需要 rdfs:subClassOf 三元組——因為它被認為更加一致和獨立。基本概念是“SHACL 實體”,它確定節點是否算作類的實體。鑒于 rdf:type 三元組當然會在資料圖中,我們認為最好也假設 subClassOf 三元組在同一個圖中。
其中,這意味著演算法不需要在圖之間切換(例如,在 SPARQL 中,它是路徑運算式 rdf:type/rdfs:subClassOf*),并且形狀圖可以編譯成一些靜態資料結構,以確保在驗證程序中不需要再次查詢原始 RDF 形狀圖。我忘記了當前的設計可能還有其他原因。像往常一樣,W3C Data Shapes WG 的會議記錄存檔可能有更多細節。
在實踐中,通常通過將形狀圖包含到資料圖中來解決該問題,例如使用 owl:imports。這樣,rdfs:subClassOf 三元組只需要在形狀圖中斷言,但在資料圖中也可見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/443900.html
上一篇:如何在CVA中實作驗證?
