org.openrdf.repository.sail.SailGraphQuery Maven / Gradle / Ivy
/*
* Licensed to Aduna under one or more contributor license agreements.
* See the NOTICE.txt file distributed with this work for additional
* information regarding copyright ownership.
*
* Aduna licenses this file to you under the terms of the Aduna BSD
* License (the "License"); you may not use this file except in compliance
* with the License. See the LICENSE.txt file distributed with this work
* for the full License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
package org.openrdf.repository.sail;
import info.aduna.iteration.CloseableIteration;
import info.aduna.iteration.ConvertingIteration;
import info.aduna.iteration.FilterIteration;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.ValueFactory;
import org.openrdf.query.BindingSet;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.QueryResults;
import org.openrdf.query.algebra.TupleExpr;
import org.openrdf.query.impl.GraphQueryResultImpl;
import org.openrdf.query.parser.ParsedGraphQuery;
import org.openrdf.rio.RDFHandler;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
/**
* @author Arjohn Kampman
*/
public class SailGraphQuery extends SailQuery implements GraphQuery {
protected SailGraphQuery(ParsedGraphQuery tupleQuery, SailRepositoryConnection con) {
super(tupleQuery, con);
}
@Override
public ParsedGraphQuery getParsedQuery() {
return (ParsedGraphQuery)super.getParsedQuery();
}
public GraphQueryResult evaluate()
throws QueryEvaluationException
{
TupleExpr tupleExpr = getParsedQuery().getTupleExpr();
try {
CloseableIteration extends BindingSet, QueryEvaluationException> bindingsIter;
SailConnection sailCon = getConnection().getSailConnection();
bindingsIter = sailCon.evaluate(tupleExpr, getActiveDataset(), getBindings(), getIncludeInferred());
// Filters out all partial and invalid matches
bindingsIter = new FilterIteration(bindingsIter) {
@Override
protected boolean accept(BindingSet bindingSet) {
Value context = bindingSet.getValue("context");
return bindingSet.getValue("subject") instanceof Resource
&& bindingSet.getValue("predicate") instanceof URI
&& bindingSet.getValue("object") instanceof Value
&& (context == null || context instanceof Resource);
}
};
bindingsIter = enforceMaxQueryTime(bindingsIter);
// Convert the BindingSet objects to actual RDF statements
final ValueFactory vf = getConnection().getRepository().getValueFactory();
CloseableIteration stIter;
stIter = new ConvertingIteration(bindingsIter) {
@Override
protected Statement convert(BindingSet bindingSet) {
Resource subject = (Resource)bindingSet.getValue("subject");
URI predicate = (URI)bindingSet.getValue("predicate");
Value object = bindingSet.getValue("object");
Resource context = (Resource)bindingSet.getValue("context");
if (context == null) {
return vf.createStatement(subject, predicate, object);
}
else {
return vf.createStatement(subject, predicate, object, context);
}
}
};
return new GraphQueryResultImpl(getParsedQuery().getQueryNamespaces(), stIter);
}
catch (SailException e) {
throw new QueryEvaluationException(e.getMessage(), e);
}
}
public void evaluate(RDFHandler handler)
throws QueryEvaluationException, RDFHandlerException
{
GraphQueryResult queryResult = evaluate();
QueryResults.report(queryResult, handler);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy