Here is an example constraint (changing only the reporting variable in one form) in various forms as a single constraint in an RDF graph. @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix shacl: ... . @prefix ex: . [ rdf:type shacl:Constraint ; shacl:severity shacl:fatal ; shacl:constraint """PREFIX rdf: PREFIX rdfs: PREFIX xsd: PREFIX shacl: ... PREFIX ex: SELECT ?person WHERE { ?person rdf:type ex:Person . MINUS FILTER NOT EXISTS { ?person ex:offspring ?v . FILTER NOT EXISTS { ?v rdf:type ex:Person . } } }""" ] . @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix shacl: ... . @prefix ex: . [ rdf:type shacl:Constraint ; shacl:severity shacl:fatal ; shacl:report "SELECT ?this" ; shacl:classScope "http://example.org/Person"^^xsd:anyURI ; shacl:sparqlShape """FILTER NOT EXISTS { ?this ex:offspring ?v . FILTER NOT EXISTS { ?v rdf:type ex:Person . } }""" ] . @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix shacl: ... . @prefix ex: . [ rdf:type shacl:Constraint ; shacl:severity shacl:fatal ; shacl:report "SELECT ?person" ; shacl:sparqlScope "?person rdf:type http://example.org/Person" ; shacl:sparqlShape """FILTER NOT EXISTS { ?person ex:offspring ?offspring . FILTER NOT EXISTS { ?offspring rdf:type ex:Person . } }""" ] . @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix shacl: ... . @prefix ex: . [ rdf:type shacl:Constraint ; shacl:severity shacl:fatal ; shacl:report """SELECT ?this""" ; shacl:shapeScope [ shacl:property "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" ; shacl:value "http://example.org/Person"^^xsd:anyURI ] ; shacl:shape [ shacl:property "http://example.org/offspring" ; shacl:valueType "http://example.org/Person"^^xsd:anyURI ] ] . Here is a *partial approximation* of the issue example. @prefix rdf: . @prefix rdfs: . @prefix xsd: . @prefix shacl: ... . @prefix ex: . @prefix : . :IssueConstraint rdf:type shacl:Constraint ; shacl:severity shacl:warning ; shacl:shapeScope [ shacl:property "http://example.org/state"^^xsd:anyURI ; shacl:values ( "http://example.org/assigned"^^xsd:anyURI "http://example.org/unassigned"^^xsd:anyURI ) ] ; shacl:shape [ shacl:and ( [ shacl:property "http://example.org/reportedBy"^^xsd:anyURI ; shacl:cardinality 1 ; shacl:valueType "http://example.org/User"^^xsd:anyURI ] [ shacl:property "http://example.org/reportedOn"^^xsd:anyURI ; shacl:cardinality 1 ; shacl:valueDatatype "http://www.w3.org/2001/XMLSchema#dateTime"^^xsd:anyURI ] # does not include optional bit yet [ shacl:property "http://example.org/reportedOn"^^xsd:anyURI ; shacl:minCardinality 0 ; shacl:maxCardinality "unbounded" ; shacl:valueShape [ shacl:property "http://example.org/state"^^xsd:anyURI ; shacl:values ( "http://example.org/assigned"^^xsd:anyURI "http://example.org/unassigned"^^xsd:anyURI ) ] ] ) ] .