Есть ли способ проверить количество различных типов объектов, связанных одним и тем же свойством? - PullRequest
0 голосов
/ 19 октября 2019

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

1 Ответ

1 голос
/ 21 октября 2019

Я полагаю, что это вариант использования для форм квалифицированных значений, см. 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: qualValueShapesDisjoint и / или sh: minCount 3 для всего свойства.

...