2

为了根据我的 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 规则解决这个问题,所以我的问题是是否也可以通过三重规则来解决这个问题。感谢提示!

4

2 回答 2

1

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

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

于 2020-04-01T11:08:09.200 回答
0

鉴于以下引用中的“可能”,@NicholasCar 先前回答中的建议是可靠的 IMO。

在这里回答的目的,只是为了证实和扩展最近的经验。

2017 W3C SHACL 文档关于SHACL 和 RDFS 推理之间的关系

SHACL 实现可以但不是必须支持蕴含机制。如果形状图包含任何带有谓词 sh:entailment 和对象 E 的三元组,并且 SHACL 处理器不支持 E 作为给定数据图的蕴含机制,则处理器必须发出失败信号。

(AFAICT 短语“权利制度”仅指 SPARQL 作为标准)

查看有关属性路径的部分:

SPARQL 属性路径:rdf:type/rdfs:subClassOf*

SHACL 属性路径:(rdf:type [ sh:zeroOrMorePath rdfs:subClassOf ])

在大多数 SHACL 实现中,我使用了基本的 rdfs 类型蕴涵工作(obv IFFrdf:type/rdfs:subClassOf*路径对 SHACL 验证器可见),因此(rdf:type [ sh:zeroOrMorePath rdfs:subClassOf ])不需要明确。

当您尝试将高级路径填充到形状中时会出现问题 - 例如,按照此示例强制执行图形包含至少一个抽象类型的实例:

sh:path [ sh:inversePath ( rdf:type [ sh:zeroOrMorePath rdfs:subClassOf ] ) ] ;

...在许多 SHACL 验证实现中对我不起作用。

于 2021-12-07T19:35:34.243 回答