package org.deri.grefine.reconcile.util; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.deri.grefine.reconcile.model.SearchResultItem; import com.google.common.collect.ImmutableList; import com.google.common.collect.LinkedHashMultimap; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; public class ResultSetWrappingUtil { public static ImmutableList<SearchResultItem> resultSetToSearchResultList(ResultSet resultSet){ List<String> varNames = resultSet.getResultVars(); String idVar = varNames.get(0); String labelVar = varNames.get(1); String scoreVar = null; if(varNames.size()>2){ scoreVar = varNames.get(2); } List<SearchResultItem> results = new ArrayList<SearchResultItem>(); while(resultSet.hasNext()){ QuerySolution sol = resultSet.next(); Literal nameLiteral = sol.getLiteral(labelVar); String name = nameLiteral==null?"":nameLiteral.getString(); String id = sol.getResource(idVar).getURI(); double score = 0; if(scoreVar!=null){ score = sol.getLiteral(scoreVar).getDouble(); } results.add(new SearchResultItem(id, name, score)); } return ImmutableList.copyOf(results); } public static ImmutableList<SearchResultItem> resultSetToSearchResultListFilterDuplicates(ResultSet resultSet, int limit){ List<String> varNames = resultSet.getResultVars(); String idVar = varNames.get(0); String labelVar = varNames.get(1); String scoreVar = null; if(varNames.size()>2){ scoreVar = varNames.get(2); } List<SearchResultItem> results = new ArrayList<SearchResultItem>(); Set<String> seen = new HashSet<String>(); while(resultSet.hasNext()){ QuerySolution sol = resultSet.next(); String id = sol.getResource(idVar).getURI(); if(seen.contains(id)){ continue; } seen.add(id); Literal nameLiteral = sol.getLiteral(labelVar); String name = nameLiteral==null?"":nameLiteral.getString(); double score = 0; if(scoreVar!=null){ score = sol.getLiteral(scoreVar).getDouble(); } results.add(new SearchResultItem(id, name, score)); if(results.size()==limit){ //got enough break; } } return ImmutableList.copyOf(results); } /** * @param resultSet * @param limit number of unique keys to include in the result * @return LinkedHashMultimap keeps the order of key input, so order in the result set is retained * the first variable in resultSet solutions is the key to the map ,the second is the value */ public static LinkedHashMultimap<String, String> resultSetToMultimap(ResultSet resultSet){ LinkedHashMultimap<String,String> map = LinkedHashMultimap.create(); List<String> varNames = resultSet.getResultVars(); if(varNames.size()!=2){ throw new RuntimeException("resultSetToMultimap only accepts a resultset with exactly two variables in the solution"); } String keyVar = varNames.get(0); String valVar = varNames.get(1); while(resultSet.hasNext()){ QuerySolution sol = resultSet.next(); String key = sol.getResource(keyVar).getURI(); RDFNode valNode = sol.get(valVar); String val = valNode.canAs(Resource.class)?valNode.as(Resource.class).getURI():valNode.asLiteral().getString(); /*if(map.keySet().size()==limit && !map.keySet().contains(key)){ break; }*/ map.put(key, val); } return map; } public static List<String> resultSetToList(ResultSet resultset, String varName){ List<String> result = new ArrayList<String>(); while(resultset.hasNext()){ QuerySolution sol = resultset.next(); String uri = sol.getResource(varName).getURI(); result.add(uri); } return result; } public static ImmutableList<String[]> resultSetToListOfPairs(ResultSet resultset){ List<String> varNames = resultset.getResultVars(); String var1 = varNames.get(0); String var2 = varNames.get(1); List<String[]> result = new ArrayList<String[]>(); while(resultset.hasNext()){ QuerySolution sol = resultset.next(); String s = sol.getResource(var1).getURI(); RDFNode object = sol.get(var2); /*String o; if(object.canAs(Resource.class)){ o = object.asResource().getURI(); }else{ o = object.asLiteral().getString(); }*/ result.add(new String[]{s,object.toString()}); } return ImmutableList.copyOf(result); } }