我正在尝试验证来自标签文档的数据。每个标签(或代码)都是具有特定rdf:type
(以及可能的其他属性,例如:isPresent
、rdfs:label
)的匿名节点:comment
。通过相同的属性 ( ):Codes
链接到。:Documents
schema:isTargetOf
我想说“一个有效的文档必须至少有一个 x、y、z 类型的代码和一个 k 类型的代码”。
@prefix ex: <http://example.org/ns#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
ex:Document
a schema:Document ;
schema:isTargetOf [ a schema:HasAuthor ;
schema:isPresent true ] ;
schema:isTargetOf [ a schema:HasImage ;
schema:isPresent true ] ;
schema:isTargetOf [ a schema:HasImage ;
schema:isPresent true ] ;
.
因此,在此示例中,有效文档必须是至少一个 HasImage 代码和恰好一个 HasAuthor 代码的目标。
如果属性不同,我了解如何执行此操作,例如将 schema:isTargetOf 更改为 schema:has_author 或 schema:has_image。
ex:Document
a schema:Document ;
schema:has_author [ a schema:HasAuthor ;
schema:isPresent true ] ;
schema:has_image [ a schema:HasImage ;
schema:isPresent true ] ;
schema:has_image [ a schema:HasImage ;
schema:isPresent true ] ;
.
然后我可以这样做:
@prefix dash: <http://datashapes.org/dash#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
schema:DocumentShape
a sh:NodeShape ;
sh:targetClass schema:Document ;
sh:property [
sh:path schema:has_author ;
sh:minCount 1 ;
sh:maxCount 1 ;
sh:message "Documents must have exactly 1 author"
] ;
sh:property [
sh:path schema:has_image;
sh:minCount 1 ;
sh:message "Must have at least one HasImage"
] ;
.
本质上,我想验证由单个属性链接的事物的集合。
目前我正在尝试使用 shacl 规则为每种类型的代码生成特定的属性类型,但这感觉有点复杂,我想知道是否有更直接的方法。
如果相关,我正在使用 pyshacl。