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.query.QueryEvaluationException;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQueryResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.HashSet;
/**
* Created by christian
* Date: 26.01.13
* Time: 14:23
*
* Finds the number of SKOS <a href="http://www.w3.org/TR/skos-reference/#schemes">ConceptSchemes</a>.
*/
public class ConceptSchemes extends Issue<CollectionResult<Resource>> {
private final Logger logger = LoggerFactory.getLogger(ConceptSchemes.class);
public ConceptSchemes() {
super("cs",
"Concept Schemes",
"Finds the involved ConceptSchemes",
IssueType.STATISTICAL);
}
@Override
protected CollectionResult<Resource> invoke() throws OpenRDFException {
TupleQueryResult result = repCon.prepareTupleQuery(QueryLanguage.SPARQL, createConceptSchemeQuery()).evaluate();
return new CollectionResult<Resource>(identifyResources(result));
}
private String createConceptSchemeQuery() {
return SparqlPrefix.SKOS +" "+ SparqlPrefix.RDFS +" "+ SparqlPrefix.RDF +
"SELECT DISTINCT ?resource WHERE {" +
"{?resource rdf:type skos:ConceptScheme}" +
"UNION" +
"{?resource ?hasTopConcept ?concept . ?hasTopConcept rdfs:subPropertyOf skos:hasTopConcept}" +
"UNION" +
"{?concept ?topConceptOf ?resource . ?topConceptOf rdfs:subPropertyOf skos:topConceptOf}" +
"UNION" +
"{?concept ?inScheme ?resource . ?inScheme rdfs:subPropertyOf skos:inScheme}"+
"}";
}
private Collection<Resource> identifyResources(TupleQueryResult result) throws QueryEvaluationException
{
Collection<Resource> allResources = new HashSet<Resource>();
while (result.hasNext()) {
Value conceptScheme = result.next().getValue("resource");
try {
allResources.add((Resource) conceptScheme);
}
catch (ClassCastException e) {
logger.error("Resource expected for conceptscheme " +conceptScheme.toString()+ ", " +e.toString());
}
}
return allResources;
}
}