package at.ac.univie.mminf.qskos4j.issues.labels;
import at.ac.univie.mminf.qskos4j.issues.Issue;
import at.ac.univie.mminf.qskos4j.issues.labels.util.EmptyLabelsResult;
import at.ac.univie.mminf.qskos4j.issues.labels.util.LabelType;
import at.ac.univie.mminf.qskos4j.util.vocab.SparqlPrefix;
import org.openrdf.OpenRDFException;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQueryResult;
import java.util.*;
public class EmptyLabeledResources extends Issue<EmptyLabelsResult> {
private Map<Resource, Collection<LabelType>> result;
public EmptyLabeledResources() {
super("el", "Empty Labels", "Finds empty labels or labels containing only whitespaces", IssueType.ANALYTICAL);
}
@Override
protected EmptyLabelsResult invoke() throws OpenRDFException {
result = new HashMap<>();
TupleQueryResult result = repCon.prepareTupleQuery(
QueryLanguage.SPARQL,
createLexicalLabelQuery()
).evaluate();
while (result.hasNext()) {
BindingSet bs = result.next();
Resource resource = (Resource) bs.getBinding("resource").getValue();
URI labelType = (URI) bs.getBinding("labelType").getValue();
Value literal = bs.getBinding("literal").getValue();
if (literal.stringValue().trim().isEmpty()) {
addToResults(resource, LabelType.getFromUri(labelType));
}
}
return new EmptyLabelsResult(this.result);
}
private String createLexicalLabelQuery() {
return SparqlPrefix.SKOS +" "+ SparqlPrefix.DCTERMS +" "+ SparqlPrefix.RDFS +" "+ SparqlPrefix.DC+
"SELECT ?resource ?labelType ?literal WHERE " +
"{" +
"?resource ?labelType ?literal ." +
"FILTER (?labelType IN (rdfs:label, dc:title, dcterms:title, skos:prefLabel, skos:altLabel, skos:hiddenLabel))" +
"}";
}
private void addToResults(Resource resource, LabelType labelType) {
Collection<LabelType> values = result.get(resource);
if (values == null) {
values = new HashSet<>();
result.put(resource, values);
}
values.add(labelType);
}
}