Может ли SHACL проверить JSON-LD, содержащий список объектов?

Я хочу проверить следующий JSON-LD с помощью SHACL:

{
  "@context" : {
    "day" : {
      "@id" : "test:day"
    },
    "month" : {
      "@id" : "test:month"
    },
    "myList" : {
      "@id" : "test:myList"
    },
    "year" : {
      "@id" : "test:year"
    },
    "schema" : "http://schema.org/",
    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    "xsd" : "http://www.w3.org/2001/XMLSchema#",
    "test" : "http://www.test.com/ns#"
  },
  "@graph" : [ {
    "@id" : "test:MyNode",
    "@type" : "test:MyTargetClass",
    "myList" : [
      {
        "year" : "2019",
        "month" : "October",
        "day" : "29"
      },
      {
        "year" : "2018",
        "month" : "January",
        "day" : "17"
      }
    ]
  } ]
}

В приведенном выше примере myList - это список объектов, который должен содержать хотя бы один элемент, каждый из которых должен содержать все три поля: year, month и day. Для проверки используется следующий TTL:

@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix test: <http://www.test.com/ns#> .

test:MyListShape
    a sh:NodeShape ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [
        sh:path test:year ;
        sh:datatype xsd:string ;
        sh:minCount 1 ;
        sh:maxCount 1 ;
    ] ;
    sh:property [
        sh:path test:month ;
        sh:datatype xsd:string ;
        sh:minCount 1 ;
        sh:maxCount 1 ;
    ] ;
    sh:property [
        sh:path test:day ;
        sh:datatype xsd:string ;
        sh:minCount 1 ;
        sh:maxCount 1 ;
    ] .

test:MyShape
    a sh:NodeShape ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:targetClass test:MyTargetClass ;
    sh:property [
        sh:path test:myList ;
        sh:node test:MyListShape ;
        sh:minCount 1 ;
    ] .

Попытка проверить JSON-LD возвращает ответ, содержащий следующий фрагмент, в котором указывается, почему данные не соответствуют:

{
  "@id" : "_:b3",
  "@type" : "http://www.w3.org/ns/shacl#ValidationResult",
  "focusNode" : "test:MyNode",
  "resultMessage" : "Property may only have 1 value, but found 2",
  "resultPath" : "test:myList",
  "resultSeverity" : "http://www.w3.org/ns/shacl#Violation",
  "sourceConstraintComponent" : "http://www.w3.org/ns/shacl#MaxCountConstraintComponent",
  "sourceShape" : "_:b4"
}

Почему свойство test:myList должно иметь только 1 значение, даже если я не указал sh:maxCount?


Я также пробовал изменить myList в @context на следующее:

"myList" : {
  "@id" : "test:myList",
  "@container" : "@list"
}

Однако это также не соответствует требованиям и возвращает ответ, содержащий следующий фрагмент:

{
  "@id" : "_:b0",
  "@type" : "http://www.w3.org/ns/shacl#ValidationResult",
  "focusNode" : "test:MyNode",
  "resultMessage" : "Value does not have shape test:MyListShape",
  "resultPath" : "test:myList",
  "resultSeverity" : "http://www.w3.org/ns/shacl#Violation",
  "sourceConstraintComponent" : "http://www.w3.org/ns/shacl#NodeConstraintComponent",
  "sourceShape" : "_:b2",
  "value" : "_:b1"
}

Альтернативное решение, с которым я столкнулся, - хранить myList в отдельном узле в @graph, но это не идеально для моего варианта использования:

{
  "@id" : "test:myListNode",
  "@type" : "test:myListNode",
  "year" : [ "2019", "2018" ],
  "month" : [ "October", "January" ],
  "day" : [ "29", "17" ]
}

Следовательно, можно ли использовать SHACL для проверки JSON-LD, который содержит список объектов, без использования этого альтернативного решения?


person Jacob G.    schedule 29.10.2019    source источник
comment
Какой движок SHACL вы использовали? Я не получаю ошибок для первого примера ни с TopBraid SHACL API, ни с SHACL Playground.   -  person Holger Knublauch    schedule 30.10.2019
comment
По общей теме проверки rdf: списков см. topquadrant.com/constraints- on-rdflists-using-shacl   -  person Holger Knublauch    schedule 30.10.2019
comment
также не может воспроизвести его с помощью Apache Jena 3.13.1   -  person UninformedUser    schedule 30.10.2019
comment
@HolgerKnublauch Я понял, что он не работает из-за проблемы с моей стороны, в которую я бы не хотел вдаваться. Вы были правы, что первый пример соответствует. Спасибо за помощь!   -  person Jacob G.    schedule 30.10.2019
comment
Может кто-нибудь подскажет, как это было решено? Нужно ли мне использовать dash: ListShape для решения этой проблемы, как показано в приведенном выше примере, связанном с @HolgerKnublauch? У меня такая же проблема, и я не могу ее решить.   -  person Ann    schedule 10.01.2020
comment
@Ann На самом деле здесь никогда не было проблем. Пример в моем вопросе должен работать на вас!   -  person Jacob G.    schedule 10.01.2020
comment
Оно работает. Но тогда, если myList - это просто объект (а не список объектов), даже тогда эта форма работает. Так как же различить их форму (объект или список объектов)?   -  person Ann    schedule 10.01.2020
comment
@Ann По объекту, я полагаю, вы имеете в виду объект JSON. С учетом того, что вы говорите, полезно думать об объекте как о массиве объектов, который содержит только один элемент. Если массив содержит единственный элемент, для его заключения не требуются квадратные скобки.   -  person Jacob G.    schedule 10.01.2020
comment
в вашем примере под объектом я имел в виду, если myList: {год: 2019, месяц: октябрь, день: 29} Будет ли форма одинакова для обоих случаев?   -  person Ann    schedule 10.01.2020
comment
@Ann Как я уже сказал, это можно рассматривать как массив, содержащий единственный элемент, поэтому квадратные скобки не требуются. Я бы подумал, что проверка все равно будет успешной, если вы использовали "myList" : [{ "year" : "2019", "month" : "October", "day" : "29" }]   -  person Jacob G.    schedule 10.01.2020


Ответы (1)


Да, SHACL может проверять JSON-LD, содержащий список объектов.

Ошибка PEBCAK вызвала сбой. (См. Комментарии.)

person TallTed    schedule 31.10.2019