JENA-1797: Shapes with class-based targets (sh:targetClass) are not applied to subclass instances
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/validation/ValidationProc.java b/jena-shacl/src/main/java/org/apache/jena/shacl/validation/ValidationProc.java
index 12e1027..c6c3562 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/validation/ValidationProc.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/validation/ValidationProc.java
@@ -273,16 +273,14 @@
Node targetObj = target.getObject();
switch(target.getTargetType()) {
case targetClass:
- return G.listPO(data, RDF.Nodes.type, targetObj);
+ case implicitClass:
+ return G.listAllNodesOfType(data, targetObj);
case targetNode:
return Collections.singletonList(targetObj);
case targetObjectsOf:
return G.setSP(data, null, targetObj);
case targetSubjectsOf:
return G.setPO(data, targetObj, null);
- case implicitClass:
- // Instances of the class and its subtypes.
- return G.listAllNodesOfType(data, targetObj);
default:
return Collections.emptyList();
}
@@ -298,15 +296,14 @@
Node targetObject = target.getObject();
switch (target.getTargetType()) {
case targetClass:
- return hasType(data, node, targetObject);
+ case implicitClass:
+ return isOfType(data, node, targetObject);
case targetNode:
return targetObject.equals(node);
case targetObjectsOf:
return data.contains(null, targetObject, node);
case targetSubjectsOf:
return data.contains(node, targetObject, null);
- case implicitClass:
- return isOfType(data, node, targetObject);
default:
return false;
}
diff --git a/jena-shacl/src/test/resources/std/core/targets/targetClass-001.ttl b/jena-shacl/src/test/resources/std/core/targets/targetClass-001.ttl
index 99ccc30..6de6425 100644
--- a/jena-shacl/src/test/resources/std/core/targets/targetClass-001.ttl
+++ b/jena-shacl/src/test/resources/std/core/targets/targetClass-001.ttl
@@ -13,9 +13,18 @@
ex:myProperty "A" ;
ex:myProperty "B" ;
.
+ex:InvalidInstance2
+ rdf:type ex:MySubClass ;
+ ex:myProperty "A" ;
+ ex:myProperty "B" ;
+.
ex:MyClass
rdf:type rdfs:Class ;
.
+ex:MySubClass
+ rdf:type rdfs:Class ;
+ rdfs:subClassOf ex:MyClass ;
+.
ex:MyShape
rdf:type sh:NodeShape ;
sh:property ex:MyShape-myProperty ;
@@ -33,6 +42,10 @@
ex:myProperty "A" ;
ex:myProperty "B" ;
.
+ex:ValidInstance3
+ rdf:type ex:MySubClass ;
+ ex:myProperty "A" ;
+.
<>
rdf:type mf:Manifest ;
mf:entries (
@@ -57,6 +70,14 @@
sh:sourceConstraintComponent sh:MaxCountConstraintComponent ;
sh:sourceShape ex:MyShape-myProperty ;
] ;
+ sh:result [
+ rdf:type sh:ValidationResult ;
+ sh:focusNode ex:InvalidInstance2 ;
+ sh:resultPath ex:myProperty ;
+ sh:resultSeverity sh:Violation ;
+ sh:sourceConstraintComponent sh:MaxCountConstraintComponent ;
+ sh:sourceShape ex:MyShape-myProperty ;
+ ] ;
] ;
mf:status sht:approved ;
.