SHACL sh:rule con sh:condition en SPARQL en TopBraid Composer SHACL sh:rule con sh:condition en SPARQL en TopBraid Composer
La ontología de ejemplo tiene dos clases (“:MyClass” y “:Value”) y dos propiedades (“:MyObjProp” y “:MyDataProp”).
:MyClass
a owl:Class ;
a sh:NodeShape ;
rdfs:subClassOf owl:Thing ;
.
:MyDataProp
a owl:DatatypeProperty ;
rdfs:domain :MyClass ;
rdfs:range xsd:string ;
.
:MyObjProp
a owl:ObjectProperty ;
rdfs:domain :MyClass ;
rdfs:range :Value ;
.
:Value
a owl:Class ;
rdfs:subClassOf owl:Thing ;
.
Se añadieron algunas instancias.
:MyClass_1
a :MyClass ;
:MyDataProp :Value_1 ;
:MyObjProp :Value_1 ;
.
:MyClass_2
a :MyClass ;
:MyObjProp :Value_2 ;
.
:Value_1
a :Value ;
.
:Value_2
a :Value ;
.
Se creó un NodeShape “:NodeShapeRule” con una regla “sh:rule” (“:SPARQLRule_1”). Esta regla crea nuevas tripletas. Con “sh:condition”, la regla debería estar restringida a un subconjunto de objetivos.
:NodeShapeRule
a sh:NodeShape ;
sh:rule :SPARQLRule_1 ;
sh:targetClass :MyClass ;
.
:SPARQLRule_1
a sh:SPARQLRule ;
sh:condition :NodeShapeConditionSPARQL ;
sh:construct “””
PREFIX :
CONSTRUCT
{
$this :MyDataProp “New input” .
}
WHERE
{
$this :MyObjProp ?p .
}
“”” ;
.
Para la restricción se definieron dos NodeShapes equivalentes. La primera restricción funciona con “sh:property”, la otra utiliza “sh:sparql”.
:NodeShapeConditionProperty
a sh:NodeShape ;
sh:property [
sh:path :MyObjProp ;
sh:description “NodeShapeConditionProperty” ;
sh:hasValue :Value_1 ;
] ;
sh:targetClass :MyClass ;
.
:NodeShapeConditionSPARQL
a sh:NodeShape ;
sh:sparql [
sh:message “NodeShapeConditionSPARQL” ;
sh:prefixes
sh:select “””
PREFIX :
SELECT $this
WHERE
{
$this :MyObjProp ?prop .
}
“”” ;
] ;
sh:targetClass :MyClass ;
.
Mientras hacía inferencias con Topbraid Composer, obtuve resultados diferentes para ambas soluciones. Solo la solución con “sh:property” proporciona la respuesta esperada. ¿Podría alguien explicarme este comportamiento?
:MyClass_1 :MyDataProp “New input”
davy.ai
La razón por la cual la solución con
sh:property
proporciona la respuesta esperada mientras que la solución consh:sparql
no lo hace, es porque definen restricciones diferentes.La restricción
sh:property
restringe los valores que se pueden asignar a la propiedad:MyObjProp
en instancias de:MyClass
únicamente a:Value_1
. Por lo tanto, cuando la regla:SPARQLRule_1
construye un nuevo triple con:MyDataProp
y el valor"Nuevo input"
, solo se aplica a la instancia:MyClass_1
, que tiene:Value_1
como su valor para:MyObjProp
.Por otro lado, la restricción
sh:sparql
solo selecciona instancias de:MyClass
que tienen al menos un valor para:MyObjProp
. Por lo tanto, la regla se aplica tanto a:MyClass_1
como a:MyClass_2
. Esto significa que se construye el nuevo triple con:MyDataProp
y el valor"Nuevo input"
para ambas instancias.En resumen, la diferencia en el comportamiento se debe al hecho de que la restricción
sh:property
restringe los posibles valores de la propiedad, mientras que la restricciónsh:sparql
solo filtra las instancias en función de una condición.