[英]How to create a SHACL rule to infer rdf:type from rdfs:subClassOf
為了根據我的 SHACL 驗證形狀 V 驗證我的 RDF 圖,我想推斷一些三元組以保持我的形狀簡單。 特別是,我需要實現的規則之一是(在偽代碼中):
(?s, rdf:type, :X) <-- (?s, rdfs:subClassOf, :Y)
我嘗試了幾種實現,最終得到了這個三重規則(及其變體):
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <http://example.com/ex#> .
:s
a sh:NodeShape ;
sh:targetClass rdfs:Resource ;
sh:rule [
a sh:TripleRule ;
sh:subject sh:this ;
sh:predicate rdf:type ;
sh:object :X ;
sh:condition [ sh:property [ sh:path rdfs:subClassOf ;
sh:hasValue :Y ] ]
] .
但是,該規則不會推斷:A rdf:type :X .
用於數據圖
:A rdfs:subClassOf :Y .
(針對https://github.com/TopQuadrant/shacl執行)。 使用 SPARQL 規則可以解決這個問題,所以我的問題是是否也可以通過三重規則來解決這個問題。 感謝您的提示!
為什么不將推理規則和驗證分開,正如您所指出的,使用 SHACL + SPARQL 是可能的,因為這會使事情變得更簡單?
您可以使用pySHACL並將規則放入本體文件中,因為 pySHACL 可以在應用 SHACL 驗證器之前運行本體規則/推理(請參閱-i
和-e
選項)。
鑒於以下引用中的“可能”,@NicholasCar 先前回答中的建議是可靠的 IMO。
在這里回答的目的,只是為了證實和擴大最近的經驗。
關於SHACL 和 RDFS 推理之間關系的 2017 W3C SHACL 文檔:
SHACL 實現可以,但不是必須,支持蘊涵制度。 如果形狀圖包含任何帶有謂詞 sh:entailment 和對象 E 的三元組,並且 SHACL 處理器不支持 E 作為給定數據圖的蘊含機制,則處理器必須發出故障信號。
(AFAICT 短語“包含制度”僅指 SPARQL 作為標准)
查看關於Property Paths的部分:
SPARQL 屬性路徑:rdf:type/rdfs:subClassOf*
SHACL 屬性路徑:(rdf:type [ sh:zeroOrMorePath rdfs:subClassOf ] )
在大多數 SHACL 實現中,我玩過基本的 rdfs 類型蘊涵工作(obv IFF rdf:type/rdfs:subClassOf*
路徑對 SHACL 驗證器可見),所以(rdf:type [ sh:zeroOrMorePath rdfs:subClassOf ])
不是明確需要的。
當您嘗試將高級路徑填充到形狀中時會出現問題 - 例如,按照此示例強制圖形包含至少一個抽象類型的實例:
sh:path [ sh:inversePath ( rdf:type [ sh:zeroOrMorePath rdfs:subClassOf ] ) ] ;
...在許多 SHACL 驗證實現中對我不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.