package at.ac.univie.mminf.qskos4j.issues.language.util; import at.ac.univie.mminf.qskos4j.issues.Issue; import at.ac.univie.mminf.qskos4j.issues.concepts.InvolvedConcepts; import at.ac.univie.mminf.qskos4j.progress.MonitoredIterator; import org.openrdf.OpenRDFException; import org.openrdf.model.Literal; import org.openrdf.model.Resource; import org.openrdf.model.Value; import org.openrdf.query.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; public class LanguageCoverage extends Issue<LanguageCoverageResult> { private final Logger logger = LoggerFactory.getLogger(LanguageCoverage.class); private Map<Resource, Collection<String>> languageCoverage; private InvolvedConcepts involvedConcepts; public LanguageCoverage(InvolvedConcepts involvedConcepts) { super(involvedConcepts, "lc", "Language Coverage", "Finds all languages used in concept labels", IssueType.STATISTICAL); this.involvedConcepts = involvedConcepts; } @Override protected LanguageCoverageResult invoke() throws OpenRDFException { languageCoverage = new HashMap<Resource, Collection<String>>(); Iterator<Resource> it = new MonitoredIterator<Resource>(involvedConcepts.getResult().getData(), progressMonitor); while (it.hasNext()) { Resource concept = it.next(); try { TupleQuery query = repCon.prepareTupleQuery(QueryLanguage.SPARQL, createLanguageLiteralQuery(concept)); addToLanguageCoverageMap(concept, query.evaluate()); } catch (OpenRDFException e) { logger.error("Error finding languages for concept '" +concept+ "'"); } } return new LanguageCoverageResult(languageCoverage); } private String createLanguageLiteralQuery(Value concept) { return "SELECT DISTINCT ?literal "+ "WHERE {" + "<"+concept+"> ?p ?literal ."+ "FILTER isLiteral(?literal) "+ "FILTER langMatches(lang(?literal), \"*\")" + "}"; } private void addToLanguageCoverageMap(Resource concept, TupleQueryResult result) throws QueryEvaluationException { while (result.hasNext()) { BindingSet queryResult = result.next(); Literal literal = (Literal) queryResult.getValue("literal"); String language = literal.getLanguage(); addToLanguageCoverageMap(concept, language); } } private void addToLanguageCoverageMap(Resource value, String langTag) { Collection<String> langTags = languageCoverage.get(value); if (langTags == null) { langTags = new HashSet<String>(); languageCoverage.put(value, langTags); } langTags.add(langTag); } }