package services; import org.apache.jena.atlas.RuntimeIOException; import org.apache.jena.query.QueryExecutionFactory; import org.apache.jena.query.QueryFactory; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; 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.IOException; import java.io.InputStream; /** * Created by fo on 27.04.16. */ public class InverseEnricher implements ResourceEnricher { private final Model mInverseRelations; public static final String CONSTRUCT_INVERSE = "CONSTRUCT {?o <%1$s> ?s} WHERE {" + " ?s <%2$s> ?o ." + "}"; public InverseEnricher() { this.mInverseRelations = ModelFactory.createDefaultModel(); try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("inverses.ttl")) { RDFDataMgr.read(mInverseRelations, inputStream, Lang.TURTLE); } catch (IOException e) { throw new RuntimeIOException(e); } } public void enrich(Model aToBeEnriched) { Model inverses = ModelFactory.createDefaultModel(); mInverseRelations.enterCriticalSection(Lock.READ); aToBeEnriched.enterCriticalSection(Lock.READ); try { for (Statement stmt : mInverseRelations.listStatements().toList()) { String inferConstruct = String.format(CONSTRUCT_INVERSE, stmt.getSubject(), stmt.getObject()); QueryExecutionFactory.create(QueryFactory.create(inferConstruct), aToBeEnriched).execConstruct(inverses); } } finally { aToBeEnriched.leaveCriticalSection(); mInverseRelations.leaveCriticalSection(); } aToBeEnriched.enterCriticalSection(Lock.WRITE); try { aToBeEnriched.add(inverses); } finally { aToBeEnriched.leaveCriticalSection(); } } }