diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 000000000..89a0f1f90 --- /dev/null +++ b/changelog.txt @@ -0,0 +1,21 @@ +Removing deprecated methods and objects + +- openllet.query.sparqldl.jena.SparqlDLStage +StageGeneratorGenericStar was deprecated and has been replaced by StageGeneratorGeneric. + +- openllet.query.sparqldl.jena.SparqlDLResultSet +org.apache.jena.sparql.engine.binding.BindingHashMap and BindingMap are deprecated in jena 4.2, Use {@link BindingBuilder}; avoid mutable bindings. + +- openllet.query.sparqldl.jena.JenaIOUtils +import org.apache.jena.riot.resultset.rw.ResultsStAX no more exists. It is a parser +for query results in XML format. Using ResultSetMgr.readBoolean instead. + +- openllet.test.query.TableResult2XML +org.apache.jena.sparql.engine.binding.BindingUtils no more exists. It was already deprecated, Use BindingLib instead + +- openllet.jena.PelletReasoner +org.apache.jena.reasoner.BaseInfGraph.InfFindSafeCapabilities no more exists. +InfFindSafeCapabilities in jena 4.2 extends AllCapabilities but overriding to +false sizeAccurate. Thus, InfFindSafeCapability instantiation has been replaced +with capabilities created by AllCapabilities.create factory method, with +sizeAccurate=false. \ No newline at end of file diff --git a/module-core/src/main/java/openllet/core/tableau/completion/rule/MaxCardinalityRule.java b/module-core/src/main/java/openllet/core/tableau/completion/rule/MaxCardinalityRule.java index e03b793b6..0c0f4f209 100644 --- a/module-core/src/main/java/openllet/core/tableau/completion/rule/MaxCardinalityRule.java +++ b/module-core/src/main/java/openllet/core/tableau/completion/rule/MaxCardinalityRule.java @@ -53,7 +53,8 @@ public void apply(final Individual ind) if (!ind.canApply(Node.MAX)) return; - final List maxCardinality = ind.getTypes(Node.MAX); + //use a copy of maxCardinality in order to avoid concurrent modification exception + final List maxCardinality = new ArrayList<>(ind.getTypes(Node.MAX)); for (final ATermAppl mc : maxCardinality) { applyMaxRule(ind, mc); diff --git a/module-jena/src/main/java/openllet/jena/PelletInfGraph.java b/module-jena/src/main/java/openllet/jena/PelletInfGraph.java index b623cb45f..b932fe12f 100644 --- a/module-jena/src/main/java/openllet/jena/PelletInfGraph.java +++ b/module-jena/src/main/java/openllet/jena/PelletInfGraph.java @@ -35,7 +35,6 @@ import java.util.Set; import java.util.logging.Logger; -import org.apache.jena.graph.Factory; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; @@ -50,6 +49,7 @@ import org.apache.jena.reasoner.StandardValidityReport; import org.apache.jena.reasoner.TriplePattern; import org.apache.jena.reasoner.ValidityReport; +import org.apache.jena.sparql.graph.GraphFactory; import org.apache.jena.util.iterator.ExtendedIterator; import org.apache.jena.util.iterator.UniqueFilter; import org.apache.jena.vocabulary.OWL; @@ -92,7 +92,7 @@ public class PelletInfGraph extends BaseInfGraph public PelletInfGraph(final KnowledgeBase kb, final PelletReasoner pellet, final GraphLoader loader) { - this(kb, Factory.createDefaultGraph(), pellet, loader); + this(kb, GraphFactory.createDefaultGraph(), pellet, loader); } public PelletInfGraph(final Graph graph, final PelletReasoner pellet, final GraphLoader loader) @@ -382,7 +382,7 @@ public Graph explain(final Triple pattern) prepare(); - final Graph explanationGraph = Factory.createDefaultGraph(); + final Graph explanationGraph = GraphFactory.createDefaultGraph(); _logger.fine(() -> "Explain " + pattern); diff --git a/module-jena/src/main/java/openllet/jena/graph/loader/DefaultGraphLoader.java b/module-jena/src/main/java/openllet/jena/graph/loader/DefaultGraphLoader.java index e461649ab..9707050c1 100644 --- a/module-jena/src/main/java/openllet/jena/graph/loader/DefaultGraphLoader.java +++ b/module-jena/src/main/java/openllet/jena/graph/loader/DefaultGraphLoader.java @@ -52,11 +52,11 @@ import java.util.logging.Level; import java.util.logging.Logger; -import org.apache.jena.graph.Factory; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.rdf.model.Property; +import org.apache.jena.sparql.graph.GraphFactory; import org.apache.jena.util.iterator.ClosableIterator; import org.apache.jena.vocabulary.OWL; import org.apache.jena.vocabulary.RDF; @@ -142,7 +142,7 @@ public class DefaultGraphLoader implements GraphLoader private static final EnumSet OWL_MEMBERS_TYPES = EnumSet.of(BuiltinTerm.OWL_AllDifferent, BuiltinTerm.OWL2_AllDisjointClasses, BuiltinTerm.OWL2_AllDisjointProperties); - private static final Graph EMPTY_GRAPH = Factory.createGraphMem(); + private static final Graph EMPTY_GRAPH = GraphFactory.createGraphMem(); public static QNameProvider _qnames = new QNameProvider(); diff --git a/module-jena/src/main/java/openllet/query/sparqldl/jena/JenaIOUtils.java b/module-jena/src/main/java/openllet/query/sparqldl/jena/JenaIOUtils.java index 213c51261..c2a80cfaf 100644 --- a/module-jena/src/main/java/openllet/query/sparqldl/jena/JenaIOUtils.java +++ b/module-jena/src/main/java/openllet/query/sparqldl/jena/JenaIOUtils.java @@ -13,7 +13,8 @@ import org.apache.jena.query.ResultSet; import org.apache.jena.query.ResultSetFactory; import org.apache.jena.rdf.model.ResourceFactory; -import org.apache.jena.riot.resultset.rw.ResultsStAX; +import org.apache.jena.riot.ResultSetMgr; +import org.apache.jena.riot.resultset.ResultSetLang; import org.apache.jena.sparql.resultset.ResultsFormat; import org.apache.jena.util.FileManager; @@ -76,7 +77,7 @@ public static boolean parseAskResult(final String resultURI) throws IOException if (resultURI.endsWith("srx")) try (var in = new FileInputStream(resultURI.substring(5))) { - return ResultsStAX.read(in, null, null).getBooleanResult(); + return ResultSetMgr.readBoolean(in, ResultSetLang.RS_XML); } else if (resultURI.endsWith("ttl") || resultURI.endsWith("rdf")) diff --git a/module-jena/src/main/java/openllet/query/sparqldl/jena/ResultSetImpl.java b/module-jena/src/main/java/openllet/query/sparqldl/jena/ResultSetImpl.java new file mode 100644 index 000000000..1c69d15af --- /dev/null +++ b/module-jena/src/main/java/openllet/query/sparqldl/jena/ResultSetImpl.java @@ -0,0 +1,24 @@ +package openllet.query.sparqldl.jena; + +import org.apache.jena.query.QuerySolution; +import org.apache.jena.query.ResultSet; + +import java.util.function.Consumer; + +/** + * @author Cristiano Longo + */ +public abstract class ResultSetImpl implements ResultSet { + + @Override + public void forEachRemaining(Consumer consumer) { + while(hasNext()) + consumer.accept(next()); + } + + @Override + public void close() { + // do nothing, override it if there are underlying resources that need to be closed + } + +} diff --git a/module-jena/src/main/java/openllet/query/sparqldl/jena/SlicedResultSet.java b/module-jena/src/main/java/openllet/query/sparqldl/jena/SlicedResultSet.java index d93d0a510..0366c8fb7 100644 --- a/module-jena/src/main/java/openllet/query/sparqldl/jena/SlicedResultSet.java +++ b/module-jena/src/main/java/openllet/query/sparqldl/jena/SlicedResultSet.java @@ -23,7 +23,7 @@ * * @author Evren Sirin */ -public class SlicedResultSet implements ResultSet +public class SlicedResultSet extends ResultSetImpl { private final ResultSet _results; private int _row; diff --git a/module-jena/src/main/java/openllet/query/sparqldl/jena/SortedResultSet.java b/module-jena/src/main/java/openllet/query/sparqldl/jena/SortedResultSet.java index 82ec42dcc..5a8a2b5cd 100644 --- a/module-jena/src/main/java/openllet/query/sparqldl/jena/SortedResultSet.java +++ b/module-jena/src/main/java/openllet/query/sparqldl/jena/SortedResultSet.java @@ -29,7 +29,7 @@ * * @author Evren Sirin */ -public class SortedResultSet implements ResultSet +public class SortedResultSet extends ResultSetImpl { private final List sortedRows; private final Iterator iterator; diff --git a/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLExecution.java b/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLExecution.java index 2a081e43c..13a9934f6 100644 --- a/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLExecution.java +++ b/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLExecution.java @@ -1,466 +1,493 @@ -// Copyright (c) 2006 - 2008, Clark & Parsia, LLC. -// This _source code is available under the terms of the Affero General Public -// License v3. -// -// Please see LICENSE.txt for full license terms, including the availability of -// proprietary exceptions. -// Questions, comments, or requests for clarification: licensing@clarkparsia.com - -package openllet.query.sparqldl.jena; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.jena.atlas.json.JsonArray; -import org.apache.jena.atlas.json.JsonObject; -import org.apache.jena.atlas.lib.NotImplemented; -import org.apache.jena.graph.Graph; -import org.apache.jena.graph.Node; -import org.apache.jena.graph.Triple; -import org.apache.jena.query.Dataset; -import org.apache.jena.query.DatasetFactory; -import org.apache.jena.query.Query; -import org.apache.jena.query.QueryException; -import org.apache.jena.query.QueryExecException; -import org.apache.jena.query.QueryExecution; -import org.apache.jena.query.QueryExecutionFactory; -import org.apache.jena.query.QueryFactory; -import org.apache.jena.query.QuerySolution; -import org.apache.jena.query.ResultSet; -import org.apache.jena.query.SortCondition; -import org.apache.jena.rdf.model.Model; -import org.apache.jena.rdf.model.ModelFactory; -import org.apache.jena.rdf.model.Statement; -import org.apache.jena.sparql.core.Quad; -import org.apache.jena.sparql.engine.binding.Binding; -import org.apache.jena.sparql.syntax.Template; -import org.apache.jena.sparql.util.Context; -import org.apache.jena.sparql.util.ModelUtils; - -import openllet.core.KnowledgeBase; -import openllet.core.OpenlletOptions; -import openllet.core.exceptions.UnsupportedQueryException; -import openllet.jena.PelletInfGraph; -import openllet.query.sparqldl.model.QueryParameters; -import openllet.query.sparqldl.model.QueryParametersBuilder; -import openllet.query.sparqldl.parser.ARQParser; -import openllet.shared.tools.Log; - -/** - *

- * Copyright: Copyright (c) 2007 - *

- *

- * Company: Clark & Parsia, LLC. - *

- * - * @author Evren Sirin - */ -class SparqlDLExecution implements QueryExecution -{ - public static Logger _logger = Log.getLogger(SparqlDLExecution.class); - - private enum QueryType - { - ASK, CONSTRUCT, DESCRIBE, SELECT - } - - private final Query _query; - private final Dataset _source; - private volatile QuerySolution _initialBinding; - private boolean _purePelletQueryExec = false; - private boolean _handleVariableSPO = true; - - public SparqlDLExecution(final String query, final Model source) - { - this(QueryFactory.create(query), source); - } - - public SparqlDLExecution(final Query query, final Model source) - { - this(query, DatasetFactory.create(source)); - } - - public SparqlDLExecution(final Query query, final Dataset source) - { - this(query, source, true); - } - - public SparqlDLExecution(final Query query, final Dataset source, final boolean handleVariableSPO) - { - _query = query; - _source = source; - _handleVariableSPO = handleVariableSPO; - - final Graph graph = source.getDefaultModel().getGraph(); - if (!(graph instanceof PelletInfGraph)) - throw new QueryException("PelletQueryExecution can only be used with Pellet-backed models"); - - if (OpenlletOptions.FULL_SIZE_ESTIMATE) - ((PelletInfGraph) graph).getKB().getSizeEstimate().computeAll(); - } - - /** - * {@inheritDoc} - */ - @Override - public Model execDescribe() - { - throw new UnsupportedOperationException("Not supported yet!"); - } - - /** - * {@inheritDoc} - */ - @Override - public Model execDescribe(final Model model) - { - throw new UnsupportedOperationException("Not supported yet!"); - } - - /** - * {@inheritDoc} - */ - @Override - public Model execConstruct() - { - final Model model = ModelFactory.createDefaultModel(); - execConstruct(model); - return model; - } - - /** - * {@inheritDoc} - */ - @Override - public Model execConstruct(final Model model) - { - ensureQueryType(QueryType.CONSTRUCT); - - final ResultSet results = exec(); - - if (results == null) - try (final var query = QueryExecutionFactory.create(_query, _source, _initialBinding)) - { - query.execConstruct(model); - } - else - { - model.setNsPrefixes(_source.getDefaultModel()); - model.setNsPrefixes(_query.getPrefixMapping()); - - final Set set = new HashSet<>(); - - final Template template = _query.getConstructTemplate(); - - while (results.hasNext()) - { - final Map bNodeMap = new HashMap<>(); - final Binding binding = results.nextBinding(); - template.subst(set, bNodeMap, binding); - } - - for (final Triple t : set) - { - final Statement stmt = ModelUtils.tripleToStatement(model, t); - if (stmt != null) - model.add(stmt); - } - - close(); - } - - return model; - } - - /** - * {@inheritDoc} - */ - @Override - public boolean execAsk() - { - ensureQueryType(QueryType.ASK); - final ResultSet results = exec(); - - if (null != results) - return results.hasNext(); - else - try (final var query = QueryExecutionFactory.create(_query, _source, _initialBinding)) - { - return query.execAsk(); - } - } - - /** - * {@inheritDoc} YOU HAVE TO CLOSE THE ResultSet AFTER USING IT - */ - @SuppressWarnings("resource") - @Override - public ResultSet execSelect() - { - ensureQueryType(QueryType.SELECT); - final ResultSet results = exec(); - - return results != null ? results : QueryExecutionFactory.create(_query, _source, _initialBinding).execSelect(); // How the user close the query ? - } - - /** - * Returns the results of the given _query using Pellet SPARQL-DL _query engine or null if the _query is not a valid SPARQL-DL _query. - * - * @return the _query results or null for unsupported queried - */ - private ResultSet exec() - { - try - { - if (_source.listNames().hasNext()) - throw new UnsupportedQueryException("Named graphs is not supported by Pellet"); - - final PelletInfGraph pelletInfGraph = (PelletInfGraph) _source.getDefaultModel().getGraph(); - final KnowledgeBase kb = pelletInfGraph.getKB(); - - pelletInfGraph.prepare(); - - final QueryParameters queryParameters = QueryParametersBuilder.getQueryParameters(_initialBinding); - - final ARQParser parser = new ARQParser(_handleVariableSPO); - // The parser uses the _query parameterization to resolve parameters - // (i.e. variables) in the _query - parser.setInitialBinding(_initialBinding); - - final openllet.query.sparqldl.model.Query q = parser.parse(_query, kb); - // The _query uses the _query parameterization to resolve bindings - // (i.e. for instance if the parameter variable is in _query - // projection, we need to add the initial binding to the resulting - // bindings manually) - q.setQueryParameters(queryParameters); - - ResultSet results = new SparqlDLResultSet(openllet.query.sparqldl.engine.QueryEngine.exec(q), _source.getDefaultModel(), queryParameters); - - final List sortConditions = _query.getOrderBy(); - if (sortConditions != null && !sortConditions.isEmpty()) - results = new SortedResultSet(results, sortConditions); - - if (_query.hasOffset() || _query.hasLimit()) - { - final long offset = _query.hasOffset() ? _query.getOffset() : 0; - final long limit = _query.hasLimit() ? _query.getLimit() : Long.MAX_VALUE; - results = new SlicedResultSet(results, offset, limit); - } - - return results; - } - catch (final UnsupportedQueryException e) - { - _logger.log(_purePelletQueryExec ? Level.INFO : Level.FINE, "This is not a SPARQL-DL _query: " + e.getMessage()); - - if (_purePelletQueryExec) - throw e; - else - { - _logger.fine("Falling back to Jena _query engine"); - return null; - } - } - } - - @Override - public void abort() - { - throw new UnsupportedOperationException("Not supported yet!"); - } - - /** - * {@inheritDoc} - */ - @Override - public void close() - { - _logger.fine("Closing PelletQueryExecution '" + hashCode() + "'."); - } - - @Override - public void setInitialBinding(final QuerySolution startSolution) - { - _initialBinding = startSolution; - } - - @Override - public Context getContext() - { - throw new UnsupportedOperationException("Not supported yet!"); - } - - /** - * {@inheritDoc} - */ - @Override - public Dataset getDataset() - { - return _source; - } - - private void ensureQueryType(final QueryType expectedType) throws QueryExecException - { - final QueryType actualType = getQueryType(_query); - if (actualType != expectedType) - throw new QueryExecException("Attempt to execute a " + actualType + " _query as a " + expectedType + " _query"); - } - - private static QueryType getQueryType(final Query query) - { - if (query.isSelectType()) - return QueryType.SELECT; - if (query.isConstructType()) - return QueryType.CONSTRUCT; - if (query.isDescribeType()) - return QueryType.DESCRIBE; - if (query.isAskType()) - return QueryType.ASK; - return null; - } - - public boolean isPurePelletQueryExec() - { - return _purePelletQueryExec; - } - - public void setPurePelletQueryExec(final boolean purePelletQueryExec) - { - _purePelletQueryExec = purePelletQueryExec; - } - - /** - * {@inheritDoc} - */ - @Override - public Iterator execConstructTriples() - { - return ModelUtils.statementsToTriples(execConstruct().listStatements()); - } - - @Override - public Iterator execConstructQuads() - { - throw new NotImplemented(); - } - - @Override - public Dataset execConstructDataset() - { - throw new NotImplemented(); - } - - @Override - public Dataset execConstructDataset(final Dataset dataset) - { - throw new NotImplemented(); - } - - /** - * {@inheritDoc} - */ - @Override - public Iterator execDescribeTriples() - { - return ModelUtils.statementsToTriples(execDescribe().listStatements()); - } - - /** - * {@inheritDoc} - */ - @Override - public Query getQuery() - { - return _query; - } - - /** - * {@inheritDoc} - */ - @Override - public long getTimeout1() - { - // not supported yet - return -1; - } - - /** - * {@inheritDoc} - */ - @Override - public long getTimeout2() - { - // not supported yet - return -1; - - } - - /** - * {@inheritDoc} - */ - @Override - public void setTimeout(final long arg0) - { - // not supported yet - } - - /** - * {@inheritDoc} - */ - - @Override - public void setTimeout(final long arg0, final TimeUnit arg1) - { - // not supported yet - } - - /** - * {@inheritDoc} - */ - @Override - public void setTimeout(final long arg0, final long arg1) - { - // not supported yet - } - - /** - * {@inheritDoc} - */ - @Override - public void setTimeout(final long arg0, final TimeUnit arg1, final long arg2, final TimeUnit arg3) - { - // not supported yet - } - - @Override - public boolean isClosed() - { - return false; - } - - @Override - public JsonArray execJson() - { - throw new NotImplemented(); - } - - @Override - public Iterator execJsonItems() - { - throw new NotImplemented(); - } - - @Override - public void setInitialBinding(final Binding binding) - { - // _initialBinding = binding; - } -} +// Copyright (c) 2006 - 2008, Clark & Parsia, LLC. +// This _source code is available under the terms of the Affero General Public +// License v3. +// +// Please see LICENSE.txt for full license terms, including the availability of +// proprietary exceptions. +// Questions, comments, or requests for clarification: licensing@clarkparsia.com + +package openllet.query.sparqldl.jena; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.jena.atlas.json.JsonArray; +import org.apache.jena.atlas.json.JsonObject; +import org.apache.jena.atlas.lib.NotImplemented; +import org.apache.jena.graph.Graph; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.Triple; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.DatasetFactory; +import org.apache.jena.query.Query; +import org.apache.jena.query.QueryException; +import org.apache.jena.query.QueryExecException; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QueryExecutionFactory; +import org.apache.jena.query.QueryFactory; +import org.apache.jena.query.QuerySolution; +import org.apache.jena.query.ResultSet; +import org.apache.jena.query.SortCondition; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdf.model.Statement; +import org.apache.jena.sparql.core.Quad; +import org.apache.jena.sparql.engine.binding.Binding; +import org.apache.jena.sparql.modify.TemplateLib; +import org.apache.jena.sparql.syntax.Template; +import org.apache.jena.sparql.util.Context; +import org.apache.jena.sparql.util.ModelUtils; + +import openllet.core.KnowledgeBase; +import openllet.core.OpenlletOptions; +import openllet.core.exceptions.UnsupportedQueryException; +import openllet.jena.PelletInfGraph; +import openllet.query.sparqldl.model.QueryParameters; +import openllet.query.sparqldl.model.QueryParametersBuilder; +import openllet.query.sparqldl.parser.ARQParser; +import openllet.shared.tools.Log; + +/** + *

+ * Copyright: Copyright (c) 2007 + *

+ *

+ * Company: Clark & Parsia, LLC. + *

+ * + * @author Evren Sirin + */ +class SparqlDLExecution implements QueryExecution +{ + public static Logger _logger = Log.getLogger(SparqlDLExecution.class); + + private enum QueryType + { + ASK, CONSTRUCT, DESCRIBE, SELECT + } + + private final Query _query; + private final Dataset _source; + private volatile QuerySolution _initialBinding; + private boolean _purePelletQueryExec = false; + private boolean _handleVariableSPO = true; + + public SparqlDLExecution(final String query, final Model source) + { + this(QueryFactory.create(query), source); + } + + public SparqlDLExecution(final Query query, final Model source) + { + this(query, DatasetFactory.create(source)); + } + + public SparqlDLExecution(final Query query, final Dataset source) + { + this(query, source, true); + } + + public SparqlDLExecution(final Query query, final Dataset source, final boolean handleVariableSPO) + { + _query = query; + _source = source; + _handleVariableSPO = handleVariableSPO; + + final Graph graph = source.getDefaultModel().getGraph(); + if (!(graph instanceof PelletInfGraph)) + throw new QueryException("PelletQueryExecution can only be used with Pellet-backed models"); + + if (OpenlletOptions.FULL_SIZE_ESTIMATE) + ((PelletInfGraph) graph).getKB().getSizeEstimate().computeAll(); + } + + /** + * {@inheritDoc} + */ + @Override + public Model execDescribe() + { + throw new UnsupportedOperationException("Not supported yet!"); + } + + /** + * {@inheritDoc} + */ + @Override + public Model execDescribe(final Model model) + { + throw new UnsupportedOperationException("Not supported yet!"); + } + + /** + * {@inheritDoc} + */ + @Override + public Model execConstruct() + { + final Model model = ModelFactory.createDefaultModel(); + execConstruct(model); + return model; + } + + /** + * {@inheritDoc} + */ + @Override + public Model execConstruct(final Model model) + { + ensureQueryType(QueryType.CONSTRUCT); + + final ResultSet results = exec(); + + if (results == null) + try (final var query = QueryExecutionFactory.create(_query, _source, _initialBinding)) + { + query.execConstruct(model); + } + else + { + model.setNsPrefixes(_source.getDefaultModel()); + model.setNsPrefixes(_query.getPrefixMapping()); + + final Set set = new HashSet<>(); + + final Template template = _query.getConstructTemplate(); + + while (results.hasNext()) + { + final Map bNodeMap = new HashMap<>(); + final Binding binding = results.nextBinding(); + subst(template, set, bNodeMap, binding); + } + + for (final Triple t : set) + { + final Statement stmt = ModelUtils.tripleToStatement(model, t); + if (stmt != null) + model.add(stmt); + } + + close(); + } + + return model; + } + + /** + * Copy paste from Template in jena 4.2 + * + * TODO use {@link TemplateLib}.subst + * + * @param template + * @param acc + * @param bNodeMap + * @param b + */ + void subst(Template template, Set acc, Map bNodeMap, Binding b) + { + final Iterator it = template.getTriples().iterator(); + while(it.hasNext()) { + Triple t = (Triple)it.next(); + t = TemplateLib.subst(t, b, bNodeMap); + acc.add(t); + } + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean execAsk() + { + ensureQueryType(QueryType.ASK); + final ResultSet results = exec(); + + if (null != results) + return results.hasNext(); + else + try (final var query = QueryExecutionFactory.create(_query, _source, _initialBinding)) + { + return query.execAsk(); + } + } + + /** + * {@inheritDoc} YOU HAVE TO CLOSE THE ResultSet AFTER USING IT + */ + @SuppressWarnings("resource") + @Override + public ResultSet execSelect() + { + ensureQueryType(QueryType.SELECT); + final ResultSet results = exec(); + + return results != null ? results : QueryExecutionFactory.create(_query, _source, _initialBinding).execSelect(); // How the user close the query ? + } + + /** + * Returns the results of the given _query using Pellet SPARQL-DL _query engine or null if the _query is not a valid SPARQL-DL _query. + * + * @return the _query results or null for unsupported queried + */ + private ResultSet exec() + { + try + { + if (_source.listNames().hasNext()) + throw new UnsupportedQueryException("Named graphs is not supported by Pellet"); + + final PelletInfGraph pelletInfGraph = (PelletInfGraph) _source.getDefaultModel().getGraph(); + final KnowledgeBase kb = pelletInfGraph.getKB(); + + pelletInfGraph.prepare(); + + final QueryParameters queryParameters = QueryParametersBuilder.getQueryParameters(_initialBinding); + + final ARQParser parser = new ARQParser(_handleVariableSPO); + // The parser uses the _query parameterization to resolve parameters + // (i.e. variables) in the _query + parser.setInitialBinding(_initialBinding); + + final openllet.query.sparqldl.model.Query q = parser.parse(_query, kb); + // The _query uses the _query parameterization to resolve bindings + // (i.e. for instance if the parameter variable is in _query + // projection, we need to add the initial binding to the resulting + // bindings manually) + q.setQueryParameters(queryParameters); + + ResultSet results = new SparqlDLResultSet(openllet.query.sparqldl.engine.QueryEngine.exec(q), _source.getDefaultModel(), queryParameters); + + final List sortConditions = _query.getOrderBy(); + if (sortConditions != null && !sortConditions.isEmpty()) + results = new SortedResultSet(results, sortConditions); + + if (_query.hasOffset() || _query.hasLimit()) + { + final long offset = _query.hasOffset() ? _query.getOffset() : 0; + final long limit = _query.hasLimit() ? _query.getLimit() : Long.MAX_VALUE; + results = new SlicedResultSet(results, offset, limit); + } + + return results; + } + catch (final UnsupportedQueryException e) + { + _logger.log(_purePelletQueryExec ? Level.INFO : Level.FINE, "This is not a SPARQL-DL _query: " + e.getMessage()); + + if (_purePelletQueryExec) + throw e; + else + { + _logger.fine("Falling back to Jena _query engine"); + return null; + } + } + } + + @Override + public void abort() + { + throw new UnsupportedOperationException("Not supported yet!"); + } + + /** + * {@inheritDoc} + */ + @Override + public void close() + { + _logger.fine("Closing PelletQueryExecution '" + hashCode() + "'."); + } + + @Override + public void setInitialBinding(final QuerySolution startSolution) + { + _initialBinding = startSolution; + } + + @Override + public Context getContext() + { + throw new UnsupportedOperationException("Not supported yet!"); + } + + /** + * {@inheritDoc} + */ + @Override + public Dataset getDataset() + { + return _source; + } + + private void ensureQueryType(final QueryType expectedType) throws QueryExecException + { + final QueryType actualType = getQueryType(_query); + if (actualType != expectedType) + throw new QueryExecException("Attempt to execute a " + actualType + " _query as a " + expectedType + " _query"); + } + + private static QueryType getQueryType(final Query query) + { + if (query.isSelectType()) + return QueryType.SELECT; + if (query.isConstructType()) + return QueryType.CONSTRUCT; + if (query.isDescribeType()) + return QueryType.DESCRIBE; + if (query.isAskType()) + return QueryType.ASK; + return null; + } + + public boolean isPurePelletQueryExec() + { + return _purePelletQueryExec; + } + + public void setPurePelletQueryExec(final boolean purePelletQueryExec) + { + _purePelletQueryExec = purePelletQueryExec; + } + + /** + * {@inheritDoc} + */ + @Override + public Iterator execConstructTriples() + { + return ModelUtils.statementsToTriples(execConstruct().listStatements()); + } + + @Override + public Iterator execConstructQuads() + { + throw new NotImplemented(); + } + + @Override + public Dataset execConstructDataset() + { + throw new NotImplemented(); + } + + @Override + public Dataset execConstructDataset(final Dataset dataset) + { + throw new NotImplemented(); + } + + /** + * {@inheritDoc} + */ + @Override + public Iterator execDescribeTriples() + { + return ModelUtils.statementsToTriples(execDescribe().listStatements()); + } + + /** + * {@inheritDoc} + */ + @Override + public Query getQuery() + { + return _query; + } + + @Override + public String getQueryString() { + return _query.toString(); + } + + /** + * {@inheritDoc} + */ + @Override + public long getTimeout1() + { + // not supported yet + return -1; + } + + /** + * {@inheritDoc} + */ + @Override + public long getTimeout2() + { + // not supported yet + return -1; + + } + + /** + * {@inheritDoc} + */ + @Override + public void setTimeout(final long arg0) + { + // not supported yet + } + + /** + * {@inheritDoc} + */ + + @Override + public void setTimeout(final long arg0, final TimeUnit arg1) + { + // not supported yet + } + + /** + * {@inheritDoc} + */ + @Override + public void setTimeout(final long arg0, final long arg1) + { + // not supported yet + } + + /** + * {@inheritDoc} + */ + @Override + public void setTimeout(final long arg0, final TimeUnit arg1, final long arg2, final TimeUnit arg3) + { + // not supported yet + } + + @Override + public boolean isClosed() + { + return false; + } + + @Override + public JsonArray execJson() + { + throw new NotImplemented(); + } + + @Override + public Iterator execJsonItems() + { + throw new NotImplemented(); + } + + @Override + public void setInitialBinding(final Binding binding) + { + // _initialBinding = binding; + } +} diff --git a/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLResultSet.java b/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLResultSet.java index 798af7ae5..74550df0e 100644 --- a/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLResultSet.java +++ b/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLResultSet.java @@ -17,8 +17,7 @@ import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.binding.Binding; -import org.apache.jena.sparql.engine.binding.BindingHashMap; -import org.apache.jena.sparql.engine.binding.BindingMap; +import org.apache.jena.sparql.engine.binding.BindingBuilder; import openllet.aterm.ATermAppl; import openllet.jena.JenaUtils; @@ -40,7 +39,7 @@ * @author Petr Kremen * @author Evren Sirin */ -public class SparqlDLResultSet implements ResultSetRewindable +public class SparqlDLResultSet extends ResultSetImpl implements ResultSetRewindable { private final Model _model; private final List _resultVars; @@ -120,7 +119,7 @@ public Binding nextBinding() _index++; final ResultBinding binding = _bindings.next(); - final BindingMap result = _parent == null ? new BindingHashMap() : new BindingHashMap(_parent); + final BindingBuilder result = _parent == null ? BindingBuilder.create() : BindingBuilder.create(_parent); for (final ATermAppl var : _resultVars) if (binding.isBound(var)) @@ -133,7 +132,7 @@ public Binding nextBinding() continue; JenaUtils.makeGraphNode(value)// - .ifPresent(node -> result.add(Var.alloc(varName), node)); + .ifPresent(node -> result.set(Var.alloc(varName), node)); } if (_resultVars.size() == 0) @@ -146,10 +145,10 @@ public Binding nextBinding() if (!result.contains(var)) JenaUtils.makeGraphNode(entry.getValue())// - .ifPresent(node -> result.add(var, node)); + .ifPresent(node -> result.set(var, node)); } - return result; + return result.build(); } /** diff --git a/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLStage.java b/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLStage.java index e038de2de..0b931d265 100644 --- a/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLStage.java +++ b/module-jena/src/main/java/openllet/query/sparqldl/jena/SparqlDLStage.java @@ -24,7 +24,7 @@ import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.engine.iterator.QueryIterRepeatApply; import org.apache.jena.sparql.engine.iterator.QueryIteratorResultSet; -import org.apache.jena.sparql.engine.main.StageGeneratorGenericStar; +import org.apache.jena.sparql.engine.main.StageGeneratorGeneric; import openllet.aterm.ATermAppl; import openllet.core.exceptions.UnsupportedQueryException; @@ -107,7 +107,7 @@ public QueryIterator build(final QueryIterator input, final ExecutionContext exe if (query != null) return new PelletQueryIterator(pellet, query, input, execCxt); else - return new StageGeneratorGenericStar().execute(_pattern, input, execCxt); + return new StageGeneratorGeneric().execute(_pattern, input, execCxt); } private Query parsePattern(final PelletInfGraph pellet) diff --git a/module-owlapi/src/test/java/openllet/pellet/owlapi/test/OWLWGTestCase.java b/module-owlapi/src/test/java/openllet/pellet/owlapi/test/OWLWGTestCase.java index 824886d92..5cb4c8def 100644 --- a/module-owlapi/src/test/java/openllet/pellet/owlapi/test/OWLWGTestCase.java +++ b/module-owlapi/src/test/java/openllet/pellet/owlapi/test/OWLWGTestCase.java @@ -53,11 +53,12 @@ public class OWLWGTestCase public static Object _lock = new Object(); + public static long TIMEOUT_SEC = 60; /** * Ensure that test cases timeout after 10 seconds. This is in slightly broader than the one second timeout for each PelletOA3TestRunner. */ @Rule - public Timeout timeout = new Timeout(10, TimeUnit.SECONDS); + public Timeout timeout = new Timeout(TIMEOUT_SEC, TimeUnit.SECONDS); /** * The dockerVM that run Travis is this time slow my i5-3570K @@ -148,7 +149,7 @@ public void runTestCase() { KnowledgeBaseImpl._logger.setLevel(Level.WARNING); - final Collection results = new PelletTestRunner().run(_test, 1 * 1000 * _travisLowSpeed); // One second of timeout : really enough if every thing work well. + final Collection results = new PelletTestRunner().run(_test, TIMEOUT_SEC * 1000 * _travisLowSpeed); for (final TestRunResult result : results) { final RunResultType resultType = result.getResultType(); diff --git a/pom.xml b/pom.xml index 971077c23..457a5f79f 100644 --- a/pom.xml +++ b/pom.xml @@ -80,12 +80,12 @@ org.apache.jena jena-core - [4.2.0,4.2.99] + 4.8.0 org.apache.jena jena-arq - [4.2.0,4.2.99] + 4.8.0 net.sourceforge.owlapi diff --git a/tests/src/test/java/openllet/test/classification/JenaClassificationTest.java b/tests/src/test/java/openllet/test/classification/JenaClassificationTest.java index 8681f9d19..e255d2919 100644 --- a/tests/src/test/java/openllet/test/classification/JenaClassificationTest.java +++ b/tests/src/test/java/openllet/test/classification/JenaClassificationTest.java @@ -25,6 +25,7 @@ import org.apache.jena.vocabulary.ReasonerVocabulary; import openllet.jena.PelletReasonerFactory; +import org.junit.Test; public class JenaClassificationTest extends AbstractClassificationTest { @@ -33,7 +34,6 @@ public void testClassification(final String inputOnt, final String classifiedOnt { final OntModel premise = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC); premise.read(inputOnt); - premise.prepare(); final Model conclusion = ModelFactory.createDefaultModel(); conclusion.read(classifiedOnt); @@ -92,4 +92,10 @@ private static String format(final Statement stmt) } } + @Test + public void simpleMechanicalEngineeringMinimalTest() throws Exception + { + testFile("ME_minimal"); + } + } diff --git a/tests/src/test/java/openllet/test/query/SparqlDLDawgTester.java b/tests/src/test/java/openllet/test/query/SparqlDLDawgTester.java index 9f4fd44be..9ffdeea23 100644 --- a/tests/src/test/java/openllet/test/query/SparqlDLDawgTester.java +++ b/tests/src/test/java/openllet/test/query/SparqlDLDawgTester.java @@ -18,6 +18,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import openllet.query.sparqldl.jena.ResultSetImpl; import org.apache.jena.ontology.OntModel; import org.apache.jena.query.QueryFactory; import org.apache.jena.query.QuerySolution; @@ -361,7 +362,7 @@ public boolean isApplicable(final String uri) return !uri.startsWith("http://www.w3.org/2001/sw/DataAccess/tests/data-r2/syntax-sparql1/manifest#") && !uri.startsWith("http://www.w3.org/2001/sw/DataAccess/tests/data-r2/syntax-sparql2/manifest#") && !uri.startsWith("http://www.w3.org/2001/sw/DataAccess/tests/data-r2/syntax-sparql3/manifest#") && !uri.startsWith("http://www.w3.org/2001/sw/DataAccess/tests/data-r2/syntax-sparql4/manifest#"); } - private static class DifferenceResultSet implements ResultSet + private static class DifferenceResultSet extends ResultSetImpl { private final List solutions = new ArrayList<>(); diff --git a/tests/src/test/java/openllet/test/query/TableResult2XML.java b/tests/src/test/java/openllet/test/query/TableResult2XML.java index 9220ee6f6..889832c2d 100644 --- a/tests/src/test/java/openllet/test/query/TableResult2XML.java +++ b/tests/src/test/java/openllet/test/query/TableResult2XML.java @@ -18,14 +18,14 @@ import java.util.List; import java.util.StringTokenizer; +import openllet.query.sparqldl.jena.ResultSetImpl; import org.apache.jena.query.QuerySolution; import org.apache.jena.query.QuerySolutionMap; -import org.apache.jena.query.ResultSet; import org.apache.jena.query.ResultSetFormatter; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.sparql.engine.binding.Binding; -import org.apache.jena.sparql.engine.binding.BindingUtils; +import org.apache.jena.sparql.engine.binding.BindingLib; import openllet.atom.OpenError; import openllet.core.utils.ATermUtils; @@ -130,7 +130,7 @@ public static void main(final String[] args) try (final var out = new FileOutputStream(arg + ".srx")) { - ResultSetFormatter.outputAsXML(out, new ResultSet() + ResultSetFormatter.outputAsXML(out, new ResultSetImpl() { private int index = 0; @@ -162,7 +162,7 @@ public QuerySolution next() @Override public Binding nextBinding() { - return BindingUtils.asBinding(nextSolution()); + return BindingLib.asBinding(nextSolution()); } @Override diff --git a/tests/src/test/resources/test/data/modularity/ME_minimal-conclusions.owl b/tests/src/test/resources/test/data/modularity/ME_minimal-conclusions.owl new file mode 100644 index 000000000..1a9a9ce8c --- /dev/null +++ b/tests/src/test/resources/test/data/modularity/ME_minimal-conclusions.owl @@ -0,0 +1,25 @@ + + + + + + + + +]> + + + + + + + + + diff --git a/tests/src/test/resources/test/data/modularity/ME_minimal.owl b/tests/src/test/resources/test/data/modularity/ME_minimal.owl new file mode 100644 index 000000000..e9e021fab --- /dev/null +++ b/tests/src/test/resources/test/data/modularity/ME_minimal.owl @@ -0,0 +1,52 @@ + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + +