0

我正在尝试验证来自标签文档的数据。每个标签(或代码)都是具有特定rdf:type(以及可能的其他属性,例如:isPresentrdfs:label)的匿名节点:comment。通过相同的属性 ( ):Codes链接到。:Documentsschema: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。

4

1 回答 1

1

我相信这是限定值形状的用例,请参阅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 结合使用。

于 2019-10-21T03:07:26.700 回答