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.URI;
import org.openrdf.model.Value;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Finds top concepts that have broader concepts (
* <a href="https://github.com/cmader/qSKOS/wiki/Quality-Issues#wiki-Top_Concepts_Having_Broader_Concepts">Top Concepts Having Broader Concepts</a>
*/
public class TopConceptsHavingBroaderConcepts extends Issue<CollectionResult<Value>> {
public TopConceptsHavingBroaderConcepts() {
super("tchbc",
"Top Concepts Having Broader Concepts",
"Finds top concepts internal to the vocabulary hierarchy tree",
IssueType.ANALYTICAL,
new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#top-concepts-having-broader-concepts")
);
}
@Override
protected CollectionResult<Value> invoke() throws OpenRDFException {
TupleQuery query = repCon.prepareTupleQuery(QueryLanguage.SPARQL, createTopConceptsHavingBroaderConceptQuery());
return new CollectionResult<>(createUriResultList(query.evaluate()));
}
private String createTopConceptsHavingBroaderConceptQuery() {
return SparqlPrefix.SKOS +
"SELECT DISTINCT ?topConcept WHERE " +
"{" +
"{?topConcept skos:topConceptOf ?conceptScheme1}" +
"UNION" +
"{?conceptScheme2 skos:hasTopConcept ?topConcept}" +
"?topConcept skos:broader|skos:broaderTransitive|^skos:narrower|^skos:narrowerTransitive ?broaderConcept ." +
"}";
}
private Collection<Value> createUriResultList(TupleQueryResult result) throws OpenRDFException
{
List<Value> resultList = new ArrayList<>();
while (result.hasNext()) {
BindingSet queryResult = result.next();
URI resource = (URI) queryResult.getValue("topConcept");
resultList.add(resource);
}
return resultList;
}
}