package org.aksw.jena_sparql_api.lookup; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.utils.ElementUtils; import org.aksw.jena_sparql_api.utils.ModelUtils; import com.google.common.collect.Iterables; import org.apache.jena.graph.Node; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.Resource; import org.apache.jena.rdf.model.impl.ModelCom; import org.apache.jena.rdf.model.impl.ResourceImpl; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.expr.E_OneOf; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.expr.ExprList; import org.apache.jena.sparql.expr.ExprVar; import org.apache.jena.sparql.expr.NodeValue; import org.apache.jena.sparql.syntax.Element; import org.apache.jena.sparql.syntax.ElementFilter; /** * LookupService for fetching models related to resources * @author raven * */ public class LookupServiceSparqlConstruct implements LookupService<Node, Model> { private QueryExecutionFactory qef; private Query query; private Var var; public LookupServiceSparqlConstruct(QueryExecutionFactory qef, Query query, Var var) { this.qef = qef; this.query = query; this.var = var; } @Override public Map<Node, Model> apply(Iterable<Node> keys) { //System.out.println("Lookup Request with " + Iterables.size(keys) + " keys: " + keys); Map<Node, Model> result = new HashMap<Node, Model>(); if(!Iterables.isEmpty(keys)) { ExprList exprs = new ExprList(); for(Node key : keys) { Expr e = NodeValue.makeNode(key); exprs.add(e); } E_OneOf expr = new E_OneOf(new ExprVar(var), exprs); Element filterElement = new ElementFilter(expr); Query q = query.cloneQuery(); Element newElement = ElementUtils.mergeElements(q.getQueryPattern(), filterElement); q.setQueryPattern(newElement); //System.out.println("Lookup query: " + q); QueryExecution qe = qef.createQueryExecution(q); Model fullModel = qe.execConstruct(); Iterator<Node> it = keys.iterator(); while(it.hasNext()) { Node key = it.next(); Resource s = new ResourceImpl(key, (ModelCom)fullModel); Model tmp = ModelUtils.filterBySubject(fullModel, s); result.put(key, tmp); } } return result; } }