package at.ac.univie.mminf.qskos4j.issues.labels;
import at.ac.univie.mminf.qskos4j.issues.Issue;
import at.ac.univie.mminf.qskos4j.issues.concepts.AuthoritativeConcepts;
import at.ac.univie.mminf.qskos4j.issues.conceptscheme.ConceptSchemes;
import at.ac.univie.mminf.qskos4j.result.CollectionResult;
import at.ac.univie.mminf.qskos4j.util.vocab.SparqlPrefix;
import org.openrdf.OpenRDFException;
import org.openrdf.model.Resource;
import org.openrdf.model.Value;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.query.QueryLanguage;
import org.openrdf.repository.RepositoryConnection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collection;
public class MissingLabels extends Issue<CollectionResult<Resource>> {
private final Logger logger = LoggerFactory.getLogger(MissingLabels.class);
private Collection<Resource> unlabeledConceptsAndConceptSchemes;
private AuthoritativeConcepts allAuthConcepts;
private ConceptSchemes allConceptSchemes;
public MissingLabels(AuthoritativeConcepts authConcepts, ConceptSchemes conceptSchemes) {
super("ml",
"Missing Labels",
"Finds concepts and conceptschemes with missing labels",
IssueType.ANALYTICAL,
new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#missing-labels"));
this.allAuthConcepts = authConcepts;
this.allConceptSchemes = conceptSchemes;
}
@Override
protected CollectionResult<Resource> invoke() throws OpenRDFException {
unlabeledConceptsAndConceptSchemes = new ArrayList<Resource>();
unlabeledConceptsAndConceptSchemes.addAll(findUnlabeledConcepts());
unlabeledConceptsAndConceptSchemes.addAll(findUnlabeledConceptSchemes());
return new CollectionResult<Resource>(unlabeledConceptsAndConceptSchemes);
}
private Collection<Resource> findUnlabeledConcepts() throws OpenRDFException {
Collection<Resource> unlabeledConcepts = new ArrayList<Resource>();
for (Resource authConcept : allAuthConcepts.getResult().getData()) {
if (hasNoPrefLabel(authConcept)) unlabeledConcepts.add(authConcept);
}
return unlabeledConcepts;
}
private boolean hasNoPrefLabel(Value concept) {
String prefLabelQuery = SparqlPrefix.SKOS + " ASK {<" +concept+ "> skos:prefLabel ?label} ";
try {
return !repCon.prepareBooleanQuery(QueryLanguage.SPARQL, prefLabelQuery).evaluate();
}
catch (OpenRDFException e) {
logger.error("Error finding preferred label of concept '" +concept.stringValue()+ "'");
return false;
}
}
private Collection<Resource> findUnlabeledConceptSchemes() throws OpenRDFException {
Collection<Resource> unlabeledConceptSchemes = new ArrayList<Resource>();
for (Resource conceptScheme : allConceptSchemes.getResult().getData()) {
if (hasNoRdfsLabelAndNoDcTitle(conceptScheme)) unlabeledConceptSchemes.add(conceptScheme);
}
return unlabeledConceptSchemes;
}
private boolean hasNoRdfsLabelAndNoDcTitle(Value conceptScheme) throws OpenRDFException {
String labelQuery = SparqlPrefix.RDFS +" "+ SparqlPrefix.DC +" "+ SparqlPrefix.DCTERMS+
" ASK {" +
"{<" +conceptScheme+ "> rdfs:label ?label} UNION " +
"{<" +conceptScheme+ "> dc:title ?label} UNION " +
"{<" +conceptScheme+ "> dcterms:title ?label}" +
"}";
return !repCon.prepareBooleanQuery(QueryLanguage.SPARQL, labelQuery).evaluate();
}
@Override
public void setRepositoryConnection(RepositoryConnection repCon) {
allAuthConcepts.setRepositoryConnection(repCon);
allConceptSchemes.setRepositoryConnection(repCon);
super.setRepositoryConnection(repCon);
}
}