有没有办法验证由同一属性链接的不同对象类型的计数?



我正在尝试验证来自标签文档的数据。每个标签(或代码(都是具有特定rdf:type(以及可能的其他属性,例如:isPresentrdfs:label:comment(。:Codes通过相同的属性(schema:isTargetOf(链接到:Documents

我希望能够说"一个有效的文档必须至少有一个类型为 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。

我相信这是限定值形状的用例,请参阅 https://www.w3.org/TR/shacl/#QualifiedValueShapeConstraintComponent

尝试一些变体

schema:DocumentShape
a sh:NodeShape ;
sh:targetClass schema:Document ;
sh:property [
sh:path schema:isTargetOf ;
sh:qualifiedMinCount 1 ;
sh:qualifiedValueShape [
sh:class schema:HasAuthor ;
]
] ;
sh:property [
sh:path schema:isTargetOf ;
sh:qualifiedMinCount 1 ;
sh:qualifiedValueShape [
sh:class schema:HasImage ;
]
] .

在上面的示例中,isTargetOf 必须至少有一个 HasAuthor 类型的值和一个 HasImage 类型的值。(它们可能是相同的值,所以可以将其与整个属性上的 sh:qualifiedValueShapesDisjoint 和/或 sh:minCount 3 结合使用。

最新更新