package at.ac.univie.mminf.qskos4j.util.vocab;
import org.junit.Assert;
import org.openrdf.OpenRDFException;
import org.openrdf.model.Statement;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.QueryLanguage;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.inferencer.fc.ForwardChainingRDFSInferencer;
import org.openrdf.sail.memory.MemoryStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class RepositoryBuilder {
private final Logger logger = LoggerFactory.getLogger(RepositoryBuilder.class);
private Repository repository;
public Repository setUpFromTestResource(String testFileName) throws OpenRDFException, IOException {
URL conceptsUrl = RepositoryBuilder.class.getResource("/" +testFileName);
File conceptsFile = new File(conceptsUrl.getFile());
Assert.assertNotNull(conceptsFile);
repository = setUpFromFile(conceptsFile, null, RDFFormat.RDFXML);
return repository;
}
public Repository setUpFromFile(File rdfFile, String baseURI, RDFFormat dataFormat)
throws OpenRDFException, IOException
{
logger.info("Initializing evaluation repository for " +rdfFile.getName()+ "...");
createRepositoryForFile();
addSkosOntology();
RepositoryConnection repCon = repository.getConnection();
try {
repCon.add(rdfFile, baseURI, dataFormat);
}
catch (Exception e) {
throw new InvalidRdfException("Could not add RDF data from file to temporary repository");
}
finally {
repCon.close();
}
return repository;
}
private void createRepositoryForFile() throws RepositoryException {
File tempDir = new File(createDataDirName());
repository = new SailRepository(new ForwardChainingRDFSInferencer(new MemoryStore(tempDir)));
repository.initialize();
}
private void addSkosOntology() throws OpenRDFException, IOException {
repository.getConnection().add(
new URL(SkosOntology.SKOS_ONTO_URI),
SkosOntology.SKOS_BASE_URI,
RDFFormat.RDFXML,
new URIImpl(SkosOntology.SKOS_ONTO_URI));
}
private String createDataDirName() {
return System.getProperty("java.io.tmpdir") +
File.separator +
System.currentTimeMillis();
}
/**
* If this is called, the local repository is complemented with SKOS lexical labels inferred from SKOSXL definitions
* as described in the SKOS <a href="http://www.w3.org/TR/skos-reference/#S55">reference document</a> by the axioms
* S55-S57
*
* @throws org.openrdf.OpenRDFException if errors when initializing local repository
*/
public void enableSkosXlSupport()
throws OpenRDFException
{
addSkosXlLabels("skosxl:prefLabel", "skos:prefLabel");
addSkosXlLabels("skosxl:altLabel", "skos:altLabel");
addSkosXlLabels("skosxl:hiddenLabel", "skos:hiddenLabel");
}
private void addSkosXlLabels(String skosXlProperty, String skosProperty) throws OpenRDFException
{
RepositoryConnection repCon = repository.getConnection();
try {
GraphQuery graphQuery = createSkosXlGraphQuery(repCon, skosXlProperty, skosProperty);
GraphQueryResult result = graphQuery.evaluate();
while (result.hasNext()) {
Statement statement = result.next();
repCon.add(statement);
}
}
finally {
repCon.close();
}
}
private GraphQuery createSkosXlGraphQuery(
RepositoryConnection connection,
String skosXlProperty,
String skosProperty) throws OpenRDFException
{
return connection.prepareGraphQuery(
QueryLanguage.SPARQL,
SparqlPrefix.SKOS +" "+ SparqlPrefix.SKOSXL+
"CONSTRUCT { ?concept "+skosProperty+" ?label }"+
"WHERE {"+
"?concept " +skosXlProperty+ " ?xLabel ."+
"?xLabel skosxl:literalForm ?label"+
"}"
);
}
}