Важно понимать, как работают пути свойств. Путь используется для достижения значений. При использовании sh:path [sh:zeroOrMorePath rdf:path]
и рассмотрении узла hr:Longer
он достигнет трех значений - (0) hr:Longer
, (1) hr:Employee
и (2) rdfs:Class
.
. твердо помните, что происходит в (B) и почему это не работает, можно полностью объяснить.
Оба (A) и (B) имеют одинаковое определение цели и будут возвращать одинаковые узлы фокуса , Это:
hr:Another
hr:Employee
hr:Longer
hr:freestanding
hr:missing
hr:name
hr:nosuper
hr:randomtype
hr:typo
Кроме того, общим для обоих (A) и (B) является sh:path [sh:zeroOrMorePath rdf:type] ;
. Например, при рассмотрении узла hr:Longer
он будет выдавать три значения, каждое из которых, возможно, потребуется проверить. Эти три значения: (0) hr:Longer
, (1) hr:Employee
и (2) rdfs:Class
.
Для (B), когда он учитывает hr:Longer
и передает испускаемое значение hr:Longer
на sh:or
он видит, что это не rdfs:Class
или rdf:Property
. Произошла ошибка проверки, потому что ни одно из sh:or
не было выполнено.
Чтобы заставить (B) работать, необходимо изменить два предложения в sh:or
на [ sh:path [sh:zeroOrMorePath rdf:type] ; sh:hasValue rdfs:Class; ]
и [ sh:path [sh:zeroOrMorePath rdf:type] ; sh:hasValue rdf:Property; ]
. В этом случае, когда hr:Longer
передается в sh:or
, каждое предложение проверяет весь путь, а sh:hasValue
требует только, чтобы одно из трех значений, выданных путем, совпадало.
(B) - Рабочая
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix sch: <http://schema.org/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix ex: <http://example.org/> .
ex:ClassOrProperty
a sh:NodeShape ;
sh:target [
a sh:SPARQLTarget ;
sh:select """
SELECT ?this
WHERE {
?this ?p ?o .
}
""" ;
] ;
sh:property [
sh:path [sh:zeroOrMorePath rdf:type] ;
sh:nodeKind sh:IRI ;
sh:or (
[ sh:path [sh:zeroOrMorePath rdf:type] ; sh:hasValue rdfs:Class; ]
[ sh:path [sh:zeroOrMorePath rdf:type] ; sh:hasValue rdf:Property; ]
)
];
.
Теперь, учитывая (A), каждый фокусный узел передается в ex:PropertyShape
и ex:ClassShape
. Если он проверяется по одной из фигур, он будет проверяться. Обе формы похожи в том, что они используют путь sh:path [ sh:zeroOrMorePath rdf:type ];
. Поскольку они используют sh:hasValue
, только одно из выданных значений для пути должно совпадать. Снова рассмотрим hr:Longer
, поскольку путь будет выдавать значение rdfs:Class
, он проверяется по ex:ClassShape
, и ошибка проверки не генерируется.