This is an automated email from the ASF dual-hosted git repository. afs pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit 17a7834ff4366f80e232208639678df63d00d0ed Author: Andy Seaborne <[email protected]> AuthorDate: Fri Sep 11 21:34:02 2026 +0100 SparqlValidator - Remove dead code and convert to QueryExec --- .../shacl/engine/constraint/SparqlValidation.java | 62 ++++++++-------------- 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/SparqlValidation.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/SparqlValidation.java index 195c47b720..6bec33dad4 100644 --- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/SparqlValidation.java +++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/SparqlValidation.java @@ -32,11 +32,10 @@ import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.graph.Triple; -import org.apache.jena.query.*; +import org.apache.jena.query.Query; +import org.apache.jena.query.QuerySolutionMap; import org.apache.jena.rdf.model.Model; -import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.RDFNode; -import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.out.NodeFmtLib; import org.apache.jena.shacl.engine.Parameter; import org.apache.jena.shacl.engine.ShaclPaths; @@ -47,6 +46,8 @@ import org.apache.jena.shacl.parser.Shape; import org.apache.jena.shacl.validation.event.ConstraintEvaluatedOnSinglePathNodeEvent; import org.apache.jena.sparql.core.*; import org.apache.jena.sparql.engine.binding.Binding; +import org.apache.jena.sparql.exec.QueryExec; +import org.apache.jena.sparql.exec.RowSet; import org.apache.jena.sparql.path.P_Link; import org.apache.jena.sparql.path.Path; import org.apache.jena.sparql.path.PathFactory; @@ -58,8 +59,6 @@ import org.apache.jena.sparql.util.ModelUtils; /** The SPARQL validator algorithms. */ /*package*/ class SparqlValidation { - private static final boolean USE_QueryTransformOps = false; - public static void validate(ValidationContext vCxt, Graph data, Shape shape, Node focusNode, Path path, Node valueNode, Query query, MultiValuedMap<Parameter, Node> parameterMap, @@ -99,11 +98,10 @@ import org.apache.jena.sparql.util.ModelUtils; /** return true if the validation is "conforms" */ private static boolean validateMap(ValidationContext vCxt, Graph data, Shape shape, - Node focusNode, Path path, Node valueNode, - Query _query, Map<Parameter, Node> parameterMap, - String violationTemplate, Constraint reportConstraint) { - Model model = ModelFactory.createModelForGraph(data); - QueryExecution qExec; + Node focusNode, Path path, Node valueNode, + Query _query, Map<Parameter, Node> parameterMap, + String violationTemplate, Constraint reportConstraint) { + // Ideally, convert code to the QueryExec level. Query query = _query; // If path is not a simple link, rewrite the query. @@ -117,40 +115,24 @@ import org.apache.jena.sparql.util.ModelUtils; // "SPARQL queries MUST not use the syntax form AS ?var for any potentially pre-bound variable" // "Furthermore, SPARQL queries SHOULD not contain a federated query (SERVICE)." - // VALUES and AS cause QueryScopeException happen during durign execution. + // VALUES and AS cause QueryScopeException to happen during during execution. checkQuerySyntaxPreBinding(query); - if ( USE_QueryTransformOps ) { - // Done with QueryTransformOps.transform - Map<Var, Node> substitutions = parameterMapToSyntaxSubstitutions(parameterMap, focusNode, path); - if ( query.isAskType() ) - addSubstition(substitutions, "value", valueNode); - Query query2 = QueryTransformOps.replaceVars(query, substitutions); - qExec = QueryExecutionFactory.create(query2, model); - } else { - // Use QueryExecution substitute (not initialBinding) - // Done with pre-binding. - QuerySolutionMap qsm = parameterMapToPreBinding(parameterMap, focusNode, path, model); - if ( query.isAskType() ) - qsm.add("value", ModelUtils.convertGraphNodeToRDFNode(valueNode, model)); - // ---- Dataset needed for the shapes graph - Resource shapesGraphResource = model.createResource("foo"); - qsm.add("currentShape", ModelUtils.convertGraphNodeToRDFNode(shape.getShapeNode(), model)); - qsm.add("shapesGraph", shapesGraphResource); - - // No copying of graphs. Set the default graph on creation. - DatasetGraph dsg = DatasetGraphFactory.createGeneral(model.getGraph()); // Dataset by links. - dsg.addGraph(shapesGraphResource.asNode(), shape.getShapeGraph()); - Dataset ds = DatasetFactory.wrap(dsg); - qExec = QueryExecution.create().query(query).dataset(ds).substitution(qsm).build(); - } + Map<Var, Node> substitutions = parameterMapToSyntaxSubstitutions(parameterMap, focusNode, path); + if ( query.isAskType() ) + substitutions.put(Var.alloc("value"), valueNode); + Node shapesGraphResource = NodeFactory.createURI("foo"); + substitutions.put(Var.alloc("currentShape"), shape.getShapeNode()); + substitutions.put(Var.alloc("shapesGraph"), shapesGraphResource); + // No copying of graphs. Set the default graph on creation. + DatasetGraph dsg = DatasetGraphFactory.createGeneral(data); // Dataset by links. + dsg.addGraph(shapesGraphResource, shape.getShapeGraph()); + QueryExec qExec = QueryExec.dataset(dsg).query(query).substitutions(substitutions).build(); // ASK validator. - // XXX Wrap in query solution, with $this and ?value. - if ( qExec.getQuery().isAskType() ) { - boolean askResult = qExec.execAsk(); + boolean askResult = qExec.ask(); if ( ! askResult ) { String msg = ( violationTemplate == null ) ? "SPARQL ASK constraint for "+ShLib.displayStr(valueNode)+" returns false" @@ -163,7 +145,7 @@ import org.apache.jena.sparql.util.ModelUtils; } // SELECT validator. - ResultSet rs = qExec.execSelect(); + RowSet rs = qExec.select(); if ( ! rs.hasNext() ) { vCxt.notifyValidationListener(() -> new ConstraintEvaluatedOnSinglePathNodeEvent(vCxt, shape, focusNode, reportConstraint, path, valueNode, true)); @@ -171,7 +153,7 @@ import org.apache.jena.sparql.util.ModelUtils; } while(rs.hasNext()) { - Binding row = rs.nextBinding(); + Binding row = rs.next(); Node value = row.get(SparqlConstraint.varValue); if ( value == null ) value = valueNode;
