package services; import org.apache.jena.atlas.RuntimeIOException; import org.apache.jena.query.QueryExecution; import org.apache.jena.query.QueryExecutionFactory; import org.apache.jena.query.QuerySolution; import org.apache.jena.query.ResultSet; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.ResourceFactory; import org.apache.jena.rdf.model.Statement; import org.apache.jena.riot.Lang; import org.apache.jena.riot.RDFDataMgr; import org.apache.jena.shared.Lock; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; /** * @author fo, pvb */ public class BroaderConceptEnricher implements ResourceEnricher { private final Model mConceptSchemes; private static final Property mBroader = ResourceFactory.createProperty("http://www.w3.org/2004/02/skos/core#broader"); private static final String SELECT_BROADER = "SELECT ?broader WHERE {" + " <%1$s> <" + mBroader + ">+ ?broader " + "}"; public BroaderConceptEnricher() { this.mConceptSchemes = ModelFactory.createDefaultModel(); // Load ESC try{ InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("public/json/esc.json"); if (inputStream == null){ inputStream = new FileInputStream("public/json/esc.json"); } RDFDataMgr.read(mConceptSchemes, inputStream, Lang.JSONLD); } catch (IOException e) { throw new RuntimeIOException(e); } // Load ISCED-1997 try { InputStream inputStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("public/json/isced-1997.json"); if (inputStream == null) { inputStream = new FileInputStream("public/json/isced-1997.json"); } RDFDataMgr.read(mConceptSchemes, inputStream, Lang.JSONLD); } catch (IOException e) { throw new RuntimeIOException(e); } } public void enrich(Model aToBeEnriched) { Model broaderConcepts = ModelFactory.createDefaultModel(); aToBeEnriched.enterCriticalSection(Lock.READ); try { for (Statement stmt : aToBeEnriched.listStatements().toSet()) { if (stmt.getObject().isResource()) { try (QueryExecution queryExecution = QueryExecutionFactory.create( String.format(SELECT_BROADER, stmt.getObject()), mConceptSchemes)) { ResultSet resultSet = queryExecution.execSelect(); while (resultSet.hasNext()) { QuerySolution querySolution = resultSet.next(); if (!stmt.getPredicate().equals(mBroader)) { Statement broaderConcept = ResourceFactory.createStatement(stmt.getSubject(), stmt.getPredicate(), querySolution.get("broader").asResource()); broaderConcepts.add(broaderConcept); } } } } } aToBeEnriched.add(broaderConcepts); } finally { aToBeEnriched.leaveCriticalSection(); } } }