package org.deri.grefine.reconcile.rdf.endpoints; import java.util.ArrayList; import java.util.List; import org.deri.grefine.reconcile.model.ReconciliationCandidate; import org.deri.grefine.reconcile.model.ReconciliationRequest; import org.deri.grefine.reconcile.rdf.executors.QueryExecutor; import org.deri.grefine.reconcile.rdf.factories.PlainSparqlQueryFactory; import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import com.hp.hpl.jena.query.ResultSet; public class PlainSparqlQueryEndpoint extends QueryEndpointImpl { private PlainSparqlQueryFactory plainQueryFactory; public PlainSparqlQueryEndpoint(PlainSparqlQueryFactory queryFactory, QueryExecutor queryExecutor) { super(queryFactory, queryExecutor); plainQueryFactory = queryFactory; } /* (non-Javadoc) * @see org.deri.grefine.reconcile.rdf.endpoints.QueryEndpointImpl#reconcileEntities(com.google.refine.com.google.refine.org.deri.reconcile.model.ReconciliationRequest, com.google.common.collect.ImmutableList) * * this method will try first to search for exact match...if it succeeds the return results. if not, it resorts to the * more costly method define in its superclass */ @Override public List<ReconciliationCandidate> reconcileEntities(ReconciliationRequest request, ImmutableList<String> searchPropertyUris, double matchThreshold) { String sparql = plainQueryFactory.getExactMatchReconciliationSparqlQuery(request, searchPropertyUris); ResultSet resultSet = queryExecutor.sparql(sparql); List<ReconciliationCandidate> candidates = plainQueryFactory.wrapResultset(resultSet, request.getQueryString(),matchThreshold); if(candidates.size()>0){ //if type is not specified, populate types if(request.getTypes().length==0 && candidates.size()>0){ List<String> entities = new ArrayList<String>(); for(ReconciliationCandidate candidate:candidates){ entities.add(candidate.getId()); } String typeSparql = this.queryFactory.getTypesOfEntitiesQuery(ImmutableList.copyOf(entities)); ResultSet typeResultSet = this.queryExecutor.sparql(typeSparql); Multimap<String, String> typesMap = this.queryFactory.wrapTypesOfEntities(typeResultSet); for(ReconciliationCandidate candidate:candidates){ candidate.setTypes(typesMap.get(candidate.getId()).toArray(new String[]{})); } } return candidates; } return super.reconcileEntities(request, searchPropertyUris, matchThreshold); } @Override protected String getType() { return "plain"; } }