package at.ac.univie.mminf.qskos4j.issues.conceptscheme;
import at.ac.univie.mminf.qskos4j.issues.Issue;
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.BooleanQuery;
import org.openrdf.query.QueryLanguage;
import java.util.Collection;
import java.util.HashSet;
/**
* Finds concept schemes without top concepts (
* <a href="https://github.com/cmader/qSKOS/wiki/Quality-Issues#wiki-Omitted_Top_Concepts">Omitted Top Concepts</a>
* ).
*/
public class OmittedTopConcepts extends Issue<CollectionResult<Resource>> {
private ConceptSchemes conceptSchemes;
public OmittedTopConcepts(ConceptSchemes conceptSchemes) {
super(conceptSchemes,
"otc",
"Omitted Top Concepts",
"Finds skos:ConceptSchemes that don't have top concepts defined",
IssueType.ANALYTICAL,
new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#omitted-top-concepts"));
this.conceptSchemes = conceptSchemes;
}
@Override
protected CollectionResult<Resource> invoke() throws OpenRDFException {
Collection<Resource> csWithOmittedTopConcepts = new HashSet<>();
for (Resource conceptScheme : conceptSchemes.getResult().getData()) {
BooleanQuery hasTopConceptQuery = repCon.prepareBooleanQuery(
QueryLanguage.SPARQL,
createConceptSchemeWithoutTopConceptQuery(conceptScheme));
if (!hasTopConceptQuery.evaluate()) {
csWithOmittedTopConcepts.add(conceptScheme);
}
}
return new CollectionResult<>(csWithOmittedTopConcepts);
}
private String createConceptSchemeWithoutTopConceptQuery(Value conceptScheme) {
return SparqlPrefix.SKOS+
"ASK {" +
"<"+conceptScheme.stringValue()+"> (skos:hasTopConcept|^skos:topConceptOf)+ ?topConcept"+
"}";
}
}