blob: e58232105cd45bd6aed01f1fdff2017478bcca0f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.apache.rya.rdftriplestore;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import java.lang.reflect.Constructor;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import org.apache.hadoop.conf.Configurable;
import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
import org.apache.rya.api.RdfCloudTripleStoreConstants;
import org.apache.rya.api.domain.RyaStatement;
import org.apache.rya.api.domain.RyaURI;
import org.apache.rya.api.domain.StatementMetadata;
import org.apache.rya.api.persist.RdfEvalStatsDAO;
import org.apache.rya.api.persist.RyaDAO;
import org.apache.rya.api.persist.RyaDAOException;
import org.apache.rya.api.persist.joinselect.SelectivityEvalDAO;
import org.apache.rya.api.persist.utils.RyaDAOHelper;
import org.apache.rya.api.resolver.RdfToRyaConversions;
import org.apache.rya.rdftriplestore.evaluation.FilterRangeVisitor;
import org.apache.rya.rdftriplestore.evaluation.ParallelEvaluationStrategyImpl;
import org.apache.rya.rdftriplestore.evaluation.QueryJoinOptimizer;
import org.apache.rya.rdftriplestore.evaluation.QueryJoinSelectOptimizer;
import org.apache.rya.rdftriplestore.evaluation.RdfCloudTripleStoreEvaluationStatistics;
import org.apache.rya.rdftriplestore.evaluation.RdfCloudTripleStoreSelectivityEvaluationStatistics;
import org.apache.rya.rdftriplestore.evaluation.SeparateFilterJoinsVisitor;
import org.apache.rya.rdftriplestore.inference.AllValuesFromVisitor;
import org.apache.rya.rdftriplestore.inference.DomainRangeVisitor;
import org.apache.rya.rdftriplestore.inference.HasSelfVisitor;
import org.apache.rya.rdftriplestore.inference.HasValueVisitor;
import org.apache.rya.rdftriplestore.inference.InferenceEngine;
import org.apache.rya.rdftriplestore.inference.IntersectionOfVisitor;
import org.apache.rya.rdftriplestore.inference.InverseOfVisitor;
import org.apache.rya.rdftriplestore.inference.OneOfVisitor;
import org.apache.rya.rdftriplestore.inference.PropertyChainVisitor;
import org.apache.rya.rdftriplestore.inference.ReflexivePropertyVisitor;
import org.apache.rya.rdftriplestore.inference.SameAsVisitor;
import org.apache.rya.rdftriplestore.inference.SomeValuesFromVisitor;
import org.apache.rya.rdftriplestore.inference.SubClassOfVisitor;
import org.apache.rya.rdftriplestore.inference.SubPropertyOfVisitor;
import org.apache.rya.rdftriplestore.inference.SymmetricPropertyVisitor;
import org.apache.rya.rdftriplestore.inference.TransitivePropertyVisitor;
import org.apache.rya.rdftriplestore.namespace.NamespaceManager;
import org.apache.rya.rdftriplestore.provenance.ProvenanceCollectionException;
import org.apache.rya.rdftriplestore.provenance.ProvenanceCollector;
import org.apache.rya.rdftriplestore.utils.DefaultStatistics;
import org.eclipse.rdf4j.common.iteration.CloseableIteration;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Namespace;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.eclipse.rdf4j.query.Binding;
import org.eclipse.rdf4j.query.BindingSet;
import org.eclipse.rdf4j.query.Dataset;
import org.eclipse.rdf4j.query.QueryEvaluationException;
import org.eclipse.rdf4j.query.algebra.QueryRoot;
import org.eclipse.rdf4j.query.algebra.StatementPattern;
import org.eclipse.rdf4j.query.algebra.TupleExpr;
import org.eclipse.rdf4j.query.algebra.Var;
import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy;
import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.BindingAssigner;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.CompareOptimizer;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.ConjunctiveConstraintSplitter;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.ConstantOptimizer;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.DisjunctiveConstraintOptimizer;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.FilterOptimizer;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.IterativeEvaluationOptimizer;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.OrderLimitOptimizer;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.QueryModelNormalizer;
import org.eclipse.rdf4j.query.algebra.evaluation.impl.SameTermFilterOptimizer;
import org.eclipse.rdf4j.query.impl.EmptyBindingSet;
import org.eclipse.rdf4j.sail.SailException;
import org.eclipse.rdf4j.sail.helpers.AbstractSailConnection;
public class RdfCloudTripleStoreConnection<C extends RdfCloudTripleStoreConfiguration> extends AbstractSailConnection {
private final RdfCloudTripleStore<C> store;
private RdfEvalStatsDAO<C> rdfEvalStatsDAO;
private SelectivityEvalDAO<C> selectEvalDAO;
private RyaDAO<C> ryaDAO;
private InferenceEngine inferenceEngine;
private NamespaceManager namespaceManager;
private final C conf;
private ProvenanceCollector provenanceCollector;
public RdfCloudTripleStoreConnection(final RdfCloudTripleStore<C> sailBase, final C conf, final ValueFactory vf)
throws SailException {
super(sailBase);
this.store = sailBase;
this.conf = conf;
initialize();
}
protected void initialize() throws SailException {
refreshConnection();
}
protected void refreshConnection() throws SailException {
try {
checkNotNull(store.getRyaDAO());
checkArgument(store.getRyaDAO().isInitialized());
checkNotNull(store.getNamespaceManager());
this.ryaDAO = store.getRyaDAO();
this.rdfEvalStatsDAO = store.getRdfEvalStatsDAO();
this.selectEvalDAO = store.getSelectEvalDAO();
this.inferenceEngine = store.getInferenceEngine();
this.namespaceManager = store.getNamespaceManager();
this.provenanceCollector = store.getProvenanceCollector();
} catch (final Exception e) {
throw new SailException(e);
}
}
@Override
protected void addStatementInternal(final Resource subject, final IRI predicate,
final Value object, final Resource... contexts) throws SailException {
try {
final String cv_s = conf.getCv();
final byte[] cv = cv_s == null ? null : cv_s.getBytes(StandardCharsets.UTF_8);
final List<RyaStatement> ryaStatements = new ArrayList<>();
if (contexts != null && contexts.length > 0) {
for (final Resource context : contexts) {
final RyaStatement statement = new RyaStatement(
RdfToRyaConversions.convertResource(subject),
RdfToRyaConversions.convertURI(predicate),
RdfToRyaConversions.convertValue(object),
RdfToRyaConversions.convertResource(context),
null, new StatementMetadata(), cv);
ryaStatements.add(statement);
}
} else {
final RyaStatement statement = new RyaStatement(
RdfToRyaConversions.convertResource(subject),
RdfToRyaConversions.convertURI(predicate),
RdfToRyaConversions.convertValue(object),
null, null, new StatementMetadata(), cv);
ryaStatements.add(statement);
}
ryaDAO.add(ryaStatements.iterator());
} catch (final RyaDAOException e) {
throw new SailException(e);
}
}
@Override
protected void clearInternal(final Resource... aresource) throws SailException {
try {
final RyaURI[] graphs = new RyaURI[aresource.length];
for (int i = 0 ; i < graphs.length ; i++){
graphs[i] = RdfToRyaConversions.convertResource(aresource[i]);
}
ryaDAO.dropGraph(conf, graphs);
} catch (final RyaDAOException e) {
throw new SailException(e);
}
}
@Override
protected void clearNamespacesInternal() throws SailException {
logger.error("Clear Namespace Repository method not implemented");
}
@Override
protected void closeInternal() throws SailException {
verifyIsOpen();
}
@Override
protected void commitInternal() throws SailException {
verifyIsOpen();
//There is no transactional layer
}
@Override
protected CloseableIteration<? extends BindingSet, QueryEvaluationException> evaluateInternal(
TupleExpr tupleExpr, final Dataset dataset, BindingSet bindings,
final boolean flag) throws SailException {
verifyIsOpen();
logger.trace("Incoming query model:\n{}", tupleExpr.toString());
if (provenanceCollector != null){
try {
provenanceCollector.recordQuery(tupleExpr.toString());
} catch (final ProvenanceCollectionException e) {
logger.trace("Provenance failed to record query.", e);
}
}
tupleExpr = tupleExpr.clone();
final C queryConf = (C) store.getConf().clone();
if (queryConf == null) {
// Should not happen, but this is better than a null dereference error.
throw new SailException("Cloning store.getConf() returned null, aborting.");
}
if (bindings != null) {
final Binding dispPlan = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_QUERYPLAN_FLAG);
if (dispPlan != null) {
queryConf.setDisplayQueryPlan(Boolean.parseBoolean(dispPlan.getValue().stringValue()));
}
final Binding authBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_QUERY_AUTH);
if (authBinding != null) {
queryConf.setAuths(authBinding.getValue().stringValue().split(","));
}
final Binding ttlBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_TTL);
if (ttlBinding != null) {
queryConf.setTtl(Long.valueOf(ttlBinding.getValue().stringValue()));
}
final Binding startTimeBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_STARTTIME);
if (startTimeBinding != null) {
queryConf.setStartTime(Long.valueOf(startTimeBinding.getValue().stringValue()));
}
final Binding performantBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_PERFORMANT);
if (performantBinding != null) {
queryConf.setBoolean(RdfCloudTripleStoreConfiguration.CONF_PERFORMANT, Boolean.parseBoolean(performantBinding.getValue().stringValue()));
}
final Binding inferBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_INFER);
if (inferBinding != null) {
queryConf.setInfer(Boolean.parseBoolean(inferBinding.getValue().stringValue()));
}
final Binding useStatsBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_USE_STATS);
if (useStatsBinding != null) {
queryConf.setUseStats(Boolean.parseBoolean(useStatsBinding.getValue().stringValue()));
}
final Binding offsetBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_OFFSET);
if (offsetBinding != null) {
queryConf.setOffset(Long.parseLong(offsetBinding.getValue().stringValue()));
}
final Binding limitBinding = bindings.getBinding(RdfCloudTripleStoreConfiguration.CONF_LIMIT);
if (limitBinding != null) {
queryConf.setLimit(Long.parseLong(limitBinding.getValue().stringValue()));
}
} else {
bindings = new QueryBindingSet();
}
if (!(tupleExpr instanceof QueryRoot)) {
tupleExpr = new QueryRoot(tupleExpr);
}
try {
final List<Class<QueryOptimizer>> optimizers = queryConf.getOptimizers();
final Class<QueryOptimizer> pcjOptimizer = queryConf.getPcjOptimizer();
if(pcjOptimizer != null) {
QueryOptimizer opt = null;
try {
final Constructor<QueryOptimizer> construct = pcjOptimizer.getDeclaredConstructor();
opt = construct.newInstance();
} catch (final Exception e) {
}
if (opt == null) {
throw new NoSuchMethodException("Could not find valid constructor for " + pcjOptimizer.getName());
}
if (opt instanceof Configurable) {
((Configurable) opt).setConf(conf);
}
opt.optimize(tupleExpr, dataset, bindings);
}
final ParallelEvaluationStrategyImpl strategy = new ParallelEvaluationStrategyImpl(
new StoreTripleSource<C>(queryConf, ryaDAO), inferenceEngine, dataset, queryConf);
(new BindingAssigner()).optimize(tupleExpr, dataset, bindings);
(new ConstantOptimizer(strategy)).optimize(tupleExpr, dataset,
bindings);
(new CompareOptimizer()).optimize(tupleExpr, dataset, bindings);
(new ConjunctiveConstraintSplitter()).optimize(tupleExpr, dataset,
bindings);
(new DisjunctiveConstraintOptimizer()).optimize(tupleExpr, dataset,
bindings);
(new SameTermFilterOptimizer()).optimize(tupleExpr, dataset,
bindings);
(new QueryModelNormalizer()).optimize(tupleExpr, dataset, bindings);
(new IterativeEvaluationOptimizer()).optimize(tupleExpr, dataset,
bindings);
if (!optimizers.isEmpty()) {
for (final Class<QueryOptimizer> optclz : optimizers) {
QueryOptimizer result = null;
try {
final Constructor<QueryOptimizer> meth = optclz.getDeclaredConstructor();
result = meth.newInstance();
} catch (final Exception e) {
}
try {
final Constructor<QueryOptimizer> meth = optclz.getDeclaredConstructor(EvaluationStrategy.class);
result = meth.newInstance(strategy);
} catch (final Exception e) {
}
if (result == null) {
throw new NoSuchMethodException("Could not find valid constructor for " + optclz.getName());
}
if (result instanceof Configurable) {
((Configurable) result).setConf(conf);
}
result.optimize(tupleExpr, dataset, bindings);
}
}
(new FilterOptimizer()).optimize(tupleExpr, dataset, bindings);
(new OrderLimitOptimizer()).optimize(tupleExpr, dataset, bindings);
logger.trace("Optimized query model:\n{}", tupleExpr.toString());
if (queryConf.isInfer()
&& this.inferenceEngine != null
) {
try {
tupleExpr.visit(new DomainRangeVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new SomeValuesFromVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new AllValuesFromVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new HasValueVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new IntersectionOfVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new ReflexivePropertyVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new PropertyChainVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new TransitivePropertyVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new SymmetricPropertyVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new InverseOfVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new SubPropertyOfVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new SubClassOfVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new SameAsVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new OneOfVisitor(queryConf, inferenceEngine));
tupleExpr.visit(new HasSelfVisitor(queryConf, inferenceEngine));
} catch (final Exception e) {
logger.error("Error encountered while visiting query node.", e);
}
}
if (queryConf.isPerformant()) {
tupleExpr.visit(new SeparateFilterJoinsVisitor());
// tupleExpr.visit(new FilterTimeIndexVisitor(queryConf));
// tupleExpr.visit(new PartitionFilterTimeIndexVisitor(queryConf));
}
final FilterRangeVisitor rangeVisitor = new FilterRangeVisitor(queryConf);
tupleExpr.visit(rangeVisitor);
tupleExpr.visit(rangeVisitor); //this has to be done twice to get replace the statementpatterns with the right ranges
EvaluationStatistics stats = null;
if (!queryConf.isUseStats() && queryConf.isPerformant() || rdfEvalStatsDAO == null) {
stats = new DefaultStatistics();
} else if (queryConf.isUseStats()) {
if (queryConf.isUseSelectivity()) {
stats = new RdfCloudTripleStoreSelectivityEvaluationStatistics<C>(queryConf, rdfEvalStatsDAO,
selectEvalDAO);
} else {
stats = new RdfCloudTripleStoreEvaluationStatistics<C>(queryConf, rdfEvalStatsDAO);
}
}
if (stats != null) {
if (stats instanceof RdfCloudTripleStoreSelectivityEvaluationStatistics) {
final QueryJoinSelectOptimizer qjso = new QueryJoinSelectOptimizer(stats, selectEvalDAO);
qjso.optimize(tupleExpr, dataset, bindings);
} else {
final QueryJoinOptimizer qjo = new QueryJoinOptimizer(stats);
qjo.optimize(tupleExpr, dataset, bindings); // TODO: Make pluggable
}
}
final CloseableIteration<BindingSet, QueryEvaluationException> iter = strategy
.evaluate(tupleExpr, EmptyBindingSet.getInstance());
final CloseableIteration<BindingSet, QueryEvaluationException> iterWrap = new CloseableIteration<BindingSet, QueryEvaluationException>() {
@Override
public void remove() throws QueryEvaluationException {
iter.remove();
}
@Override
public BindingSet next() throws QueryEvaluationException {
return iter.next();
}
@Override
public boolean hasNext() throws QueryEvaluationException {
return iter.hasNext();
}
@Override
public void close() throws QueryEvaluationException {
iter.close();
strategy.shutdown();
}
};
return iterWrap;
} catch (final QueryEvaluationException e) {
throw new SailException(e);
} catch (final Exception e) {
throw new SailException(e);
}
}
@Override
protected CloseableIteration<? extends Resource, SailException> getContextIDsInternal()
throws SailException {
verifyIsOpen();
// iterate through all contextids
return null;
}
@Override
protected String getNamespaceInternal(final String s) throws SailException {
return namespaceManager.getNamespace(s);
}
@Override
protected CloseableIteration<? extends Namespace, SailException> getNamespacesInternal()
throws SailException {
return namespaceManager.iterateNamespace();
}
@Override
protected CloseableIteration<? extends Statement, SailException> getStatementsInternal(
final Resource subject, final IRI predicate, final Value object, final boolean flag,
final Resource... contexts) throws SailException {
// try {
//have to do this to get the inferred values
//TODO: Will this method reduce performance?
final Var subjVar = decorateValue(subject, "s");
final Var predVar = decorateValue(predicate, "p");
final Var objVar = decorateValue(object, "o");
StatementPattern sp = null;
final boolean hasContext = contexts != null && contexts.length > 0;
final Resource context = (hasContext) ? contexts[0] : null;
final Var cntxtVar = decorateValue(context, "c");
//TODO: Only using one context here
sp = new StatementPattern(subjVar, predVar, objVar, cntxtVar);
//return new StoreTripleSource(store.getConf()).getStatements(resource, uri, value, contexts);
final CloseableIteration<? extends BindingSet, QueryEvaluationException> evaluate = evaluate(sp, null, null, false);
return new CloseableIteration<Statement, SailException>() { //TODO: Use a util class to do this
private boolean isClosed = false;
@Override
public void close() throws SailException {
isClosed = true;
try {
evaluate.close();
} catch (final QueryEvaluationException e) {
throw new SailException(e);
}
}
@Override
public boolean hasNext() throws SailException {
try {
return evaluate.hasNext();
} catch (final QueryEvaluationException e) {
throw new SailException(e);
}
}
@Override
public Statement next() throws SailException {
if (!hasNext() || isClosed) {
throw new NoSuchElementException();
}
try {
final BindingSet next = evaluate.next();
final Resource bs_subj = (Resource) ((subjVar.hasValue()) ? subjVar.getValue() : next.getBinding(subjVar.getName()).getValue());
final IRI bs_pred = (IRI) ((predVar.hasValue()) ? predVar.getValue() : next.getBinding(predVar.getName()).getValue());
final Value bs_obj = (objVar.hasValue()) ? objVar.getValue() :
next.getBinding(objVar.getName()).getValue();
final Binding b_cntxt = next.getBinding(cntxtVar.getName());
//convert BindingSet to Statement
if (b_cntxt != null) {
return SimpleValueFactory.getInstance().createStatement(bs_subj, bs_pred, bs_obj, (Resource) b_cntxt.getValue());
} else {
return SimpleValueFactory.getInstance().createStatement(bs_subj, bs_pred, bs_obj);
}
} catch (final QueryEvaluationException e) {
throw new SailException(e);
}
}
@Override
public void remove() throws SailException {
try {
evaluate.remove();
} catch (final QueryEvaluationException e) {
throw new SailException(e);
}
}
};
// } catch (QueryEvaluationException e) {
// throw new SailException(e);
// }
}
protected Var decorateValue(final Value val, final String name) {
if (val == null) {
return new Var(name);
} else {
return new Var(name, val);
}
}
@Override
protected void removeNamespaceInternal(final String s) throws SailException {
namespaceManager.removeNamespace(s);
}
@Override
protected void removeStatementsInternal(final Resource subject, final IRI predicate,
final Value object, final Resource... contexts) throws SailException {
if (!(subject instanceof IRI)) {
throw new SailException("Subject[" + subject + "] must be URI");
}
try {
if (contexts != null && contexts.length > 0) {
for (final Resource context : contexts) {
if (!(context instanceof IRI)) {
throw new SailException("Context[" + context + "] must be URI");
}
final RyaStatement statement = new RyaStatement(
RdfToRyaConversions.convertResource(subject),
RdfToRyaConversions.convertURI(predicate),
RdfToRyaConversions.convertValue(object),
RdfToRyaConversions.convertResource(context));
ryaDAO.delete(statement, conf);
}
} else {
final RyaStatement statement = new RyaStatement(
RdfToRyaConversions.convertResource(subject),
RdfToRyaConversions.convertURI(predicate),
RdfToRyaConversions.convertValue(object),
null);
ryaDAO.delete(statement, conf);
}
} catch (final RyaDAOException e) {
throw new SailException(e);
}
}
@Override
protected void rollbackInternal() throws SailException {
//TODO: No transactional layer as of yet
}
@Override
protected void setNamespaceInternal(final String s, final String s1)
throws SailException {
namespaceManager.addNamespace(s, s1);
}
@Override
protected long sizeInternal(final Resource... contexts) throws SailException {
logger.error("Cannot determine size as of yet");
return 0;
}
@Override
protected void startTransactionInternal() throws SailException {
//TODO: ?
}
@Override
public boolean pendingRemovals() {
return false;
}
public static class StoreTripleSource<C extends RdfCloudTripleStoreConfiguration> implements TripleSource {
private final C conf;
private final RyaDAO<C> ryaDAO;
public StoreTripleSource(final C conf, final RyaDAO<C> ryaDAO) {
this.conf = conf;
this.ryaDAO = ryaDAO;
}
@Override
public CloseableIteration<Statement, QueryEvaluationException> getStatements(
final Resource subject, final IRI predicate, final Value object,
final Resource... contexts) throws QueryEvaluationException {
return RyaDAOHelper.query(ryaDAO, subject, predicate, object, conf, contexts);
}
public CloseableIteration<? extends Entry<Statement, BindingSet>, QueryEvaluationException> getStatements(
final Collection<Map.Entry<Statement, BindingSet>> statements,
final Resource... contexts) throws QueryEvaluationException {
return RyaDAOHelper.query(ryaDAO, statements, conf);
}
@Override
public ValueFactory getValueFactory() {
return RdfCloudTripleStoreConstants.VALUE_FACTORY;
}
}
public InferenceEngine getInferenceEngine() {
return inferenceEngine;
}
public C getConf() {
return conf;
}
}