Я пытаюсь проверить данные, поступающие от маркировки документов. Каждая метка (или код) является анонимным узлом с определенным 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.
Я понимаю, как это сделать, если свойство отличается, например, изменить схему: isTargetOf на схему: has_author или схему: 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.