首页 > 解决方案 > 如何创建 SHACL 规则以从 rdfs:subClassOf 推断 rdf:type

问题描述

为了根据我的 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

解决方案


您为什么不将推理规则和验证分开,正如您所指出的,使用 SHACL + SPARQL 是可能的,因为这会使事情变得更简单?

您可以使用pySHACL并将规则放入本体文件中,因为 pySHACL 可以在应用 SHACL 验证器之前运行本体规则/推理(请参阅-i-e选项)。


推荐阅读