From 1b57acd01710dd07844368322eb8b081d722d6a8 Mon Sep 17 00:00:00 2001 From: Jim Balhoff Date: Sat, 24 Jan 2026 11:29:42 -0500 Subject: [PATCH] Initial migration from Blazegraph to RDF4J native store. --- minerva-cli/pom.xml | 14 + .../minerva/cli/CommandLineInterface.java | 107 ++---- .../cli/ReplaceObsoleteReferencesCommand.java | 28 +- .../minerva/cli/ReplaceTermsCommand.java | 72 ++-- minerva-core/pom.xml | 13 +- .../BlazegraphMolecularModelManager.java | 328 ++++++++++-------- .../minerva/BlazegraphOntologyManager.java | 143 +++----- .../json/SPARQLResultJSONRenderer.java | 20 +- .../minerva/model/GoCamModel.java | 16 +- .../util/BlazegraphMutationCounter.java | 39 --- .../minerva/util/SailMutationCounter.java | 19 + .../BlazegraphMolecularModelManagerTest.java | 6 +- .../minerva/server/handler/ModelCreator.java | 2 +- .../server/handler/ModelSearchHandler.java | 8 +- .../server/handler/OperationsImpl.java | 14 +- .../handler/SPARQLGraphMessageBodyWriter.java | 29 +- .../minerva/server/handler/SPARQLHandler.java | 8 +- .../SPARQLResultsMessageBodyWriter.java | 26 +- .../minerva/server/handler/TaxonHandler.java | 10 +- .../server/handler/ARTHandlerTest.java | 6 +- .../handler/ModelSearchHandlerTest.java | 6 +- .../server/handler/TaxonHandlerTest.java | 6 +- .../server/validation/ValidationTest.java | 6 +- pom.xml | 113 +----- 24 files changed, 465 insertions(+), 574 deletions(-) delete mode 100644 minerva-core/src/main/java/org/geneontology/minerva/util/BlazegraphMutationCounter.java create mode 100644 minerva-core/src/main/java/org/geneontology/minerva/util/SailMutationCounter.java diff --git a/minerva-cli/pom.xml b/minerva-cli/pom.xml index 8ca020a3..b13a3729 100644 --- a/minerva-cli/pom.xml +++ b/minerva-cli/pom.xml @@ -95,6 +95,20 @@ org.obolibrary.robot robot-core + + + ch.qos.logback + logback-classic + + + org.slf4j + log4j-over-slf4j + + + + + org.apache.logging.log4j + log4j-slf4j-impl org.apache.logging.log4j diff --git a/minerva-cli/src/main/java/org/geneontology/minerva/cli/CommandLineInterface.java b/minerva-cli/src/main/java/org/geneontology/minerva/cli/CommandLineInterface.java index c8cc6a56..77bd28bf 100644 --- a/minerva-cli/src/main/java/org/geneontology/minerva/cli/CommandLineInterface.java +++ b/minerva-cli/src/main/java/org/geneontology/minerva/cli/CommandLineInterface.java @@ -1,9 +1,5 @@ package org.geneontology.minerva.cli; - -import com.bigdata.rdf.sail.BigdataSail; -import com.bigdata.rdf.sail.BigdataSailRepository; -import com.bigdata.rdf.sail.BigdataSailRepositoryConnection; import com.google.common.base.Optional; import com.google.common.collect.Sets; import com.google.gson.Gson; @@ -14,6 +10,10 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Level; import org.apache.log4j.Logger; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.sail.NotifyingSail; +import org.eclipse.rdf4j.sail.nativerdf.NativeStore; import org.geneontology.minerva.*; import org.geneontology.minerva.curie.CurieHandler; import org.geneontology.minerva.curie.CurieMappings; @@ -31,23 +31,22 @@ import org.geneontology.minerva.server.handler.OperationsTools; import org.geneontology.minerva.server.inferences.InferenceProviderCreator; import org.geneontology.minerva.server.validation.MinervaShexValidator; -import org.geneontology.minerva.util.BlazegraphMutationCounter; +import org.geneontology.minerva.util.SailMutationCounter; import org.geneontology.minerva.validation.ShexValidationReport; import org.geneontology.minerva.validation.ValidationResultSet; import org.geneontology.minerva.validation.Violation; import org.geneontology.minerva.validation.pipeline.BatchPipelineValidationReport; import org.geneontology.minerva.validation.pipeline.ErrorMessage; import org.obolibrary.robot.CatalogXmlIRIMapper; -import org.openrdf.model.Statement; -import org.openrdf.model.ValueFactory; -import org.openrdf.model.impl.URIImpl; -import org.openrdf.model.vocabulary.OWL; -import org.openrdf.model.vocabulary.RDF; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.QueryLanguage; -import org.openrdf.query.UpdateExecutionException; -import org.openrdf.repository.RepositoryException; -import org.openrdf.rio.*; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.vocabulary.OWL; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.MalformedQueryException; +import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.UpdateExecutionException; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.rio.*; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.formats.TurtleDocumentFormat; import org.semanticweb.owlapi.io.IRIDocumentSource; @@ -553,62 +552,31 @@ public static void modelsToJSON(String ontologyFileURL, String journalFilePath, public static void importOWLModels(String journalFilePath, String inputFolder) throws Exception { // minimal inputs if (journalFilePath == null) { - System.err.println("No journal file was configured."); - System.exit(-1); + LOGGER.fatal("No journal file was configured."); + System.exit(1); return; } if (inputFolder == null) { - System.err.println("No input folder was configured."); - System.exit(-1); + LOGGER.fatal("No input folder was configured."); + System.exit(1); + return; + } + File repositoryDir = new File(journalFilePath); + if (repositoryDir.exists() && !repositoryDir.isDirectory()) { + LOGGER.fatal("Repository not a directory"); + System.exit(1); return; } - int total_files = 0; + if (repositoryDir.exists() && repositoryDir.listFiles().length > 0) { + LOGGER.warn("Repository already exists; note that bulk load does not check for previously loaded model IRIs and content may be merged."); + } OWLOntology dummy = OWLManager.createOWLOntologyManager().createOntology(IRI.create("http://example.org/dummy")); String modelIdPrefix = "http://model.geneontology.org/"; // this will not be used for anything CurieHandler curieHandler = new MappedCurieHandler(); BlazegraphMolecularModelManager m3 = new BlazegraphMolecularModelManager<>(dummy, curieHandler, modelIdPrefix, journalFilePath, null, null, false); - //in case of update rather than whole new journal - Set stored = new HashSet(m3.getStoredModelIds()); - LOGGER.info("loading gocams from " + inputFolder); - //for (File file : FileUtils.listFiles(new File(inputFolder), null, true)) { File i = new File(inputFolder); - if (i.exists()) { - if (i.isDirectory()) { - total_files = i.listFiles().length; - FileUtils.listFiles(i, null, true).parallelStream().parallel().forEach(file -> { - if (file.getName().endsWith("ttl")) { - java.util.Optional irio; - try { - irio = m3.scanForOntologyIRI(file); - IRI iri = null; - if (irio.isPresent()) { - iri = IRI.create(irio.get()); - } - //is it in there already? - if (stored.contains(iri)) { - LOGGER.error("Attempted to load gocam ttl file into database but gocam with that iri already exists, skipping " + file + " " + iri); - } else { - stored.add(iri); - m3.importModelToDatabase(file, true); - } - } catch (RDFParseException | RDFHandlerException | IOException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (OWLOntologyCreationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (RepositoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } else { - LOGGER.info("Ignored for not ending with .ttl" + file); - } - }); - } - } + m3.importBulkModelsToDatabase(i, true); m3.dispose(); - LOGGER.info("done loading gocams, loaded: " + stored.size() + " out of: " + total_files + " files"); } /** @@ -719,21 +687,16 @@ public static void sparqlUpdate(String journalFilePath, String updateFile) throw System.exit(-1); return; } - String update = FileUtils.readFileToString(new File(updateFile), StandardCharsets.UTF_8); - Properties properties = new Properties(); - properties.load(CommandLineInterface.class.getResourceAsStream("/org/geneontology/minerva/blazegraph.properties")); - properties.setProperty(com.bigdata.journal.Options.FILE, journalFilePath); - - BigdataSail sail = new BigdataSail(properties); - BigdataSailRepository repository = new BigdataSailRepository(sail); - repository.initialize(); - BigdataSailRepositoryConnection conn = repository.getUnisolatedConnection(); - BlazegraphMutationCounter counter = new BlazegraphMutationCounter(); - conn.addChangeLog(counter); + String indexes = "spoc,posc,cosp"; //FIXME review for appropriate indexes + NotifyingSail sail = new NativeStore(new File(journalFilePath), indexes); + SailRepository repository = new SailRepository(sail); + SailRepositoryConnection conn = repository.getConnection(); + SailMutationCounter counter = new SailMutationCounter(); + sail.addSailChangedListener(counter); conn.prepareUpdate(QueryLanguage.SPARQL, update).execute(); int changes = counter.mutationCount(); - conn.removeChangeLog(counter); + sail.removeSailChangedListener(counter); System.out.println("\nApplied " + changes + " changes"); conn.close(); } diff --git a/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceObsoleteReferencesCommand.java b/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceObsoleteReferencesCommand.java index ed2897ee..6c6d71f1 100644 --- a/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceObsoleteReferencesCommand.java +++ b/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceObsoleteReferencesCommand.java @@ -1,20 +1,21 @@ package org.geneontology.minerva.cli; -import com.bigdata.rdf.sail.BigdataSail; -import com.bigdata.rdf.sail.BigdataSailRepository; import org.apache.log4j.Logger; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.sail.nativerdf.NativeStore; import org.geneontology.minerva.MolecularModelManager; import org.geneontology.minerva.curie.CurieHandler; import org.geneontology.minerva.curie.DefaultCurieHandler; -import org.geneontology.minerva.util.BlazegraphMutationCounter; +import org.geneontology.minerva.util.SailMutationCounter; import org.obolibrary.robot.CatalogXmlIRIMapper; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.UpdateExecutionException; -import org.openrdf.repository.RepositoryException; +import org.eclipse.rdf4j.query.MalformedQueryException; +import org.eclipse.rdf4j.query.UpdateExecutionException; +import org.eclipse.rdf4j.repository.RepositoryException; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; import org.semanticweb.owlapi.model.parameters.Imports; +import java.io.File; import java.io.IOException; import java.util.Optional; import java.util.Properties; @@ -58,21 +59,14 @@ public static void run(String ontologyIRI, String catalogPath, String journalFil } catch (OWLOntologyCreationException e) { throw new FatalReplaceObsoleteReferencesError("Could not load tbox ontology from " + ontologyIRI, e); } - Properties properties = new Properties(); + String indexes = "spoc,posc,cosp"; //FIXME review for appropriate indexes + SailRepository repository; try { - properties.load(CommandLineInterface.class.getResourceAsStream("/org/geneontology/minerva/blazegraph.properties")); - } catch (IOException e) { - throw new FatalReplaceObsoleteReferencesError("Could not read blazegraph properties resource from jar file."); - } - properties.setProperty(com.bigdata.journal.Options.FILE, journalFilePath); - BigdataSail sail = new BigdataSail(properties); - BigdataSailRepository repository = new BigdataSailRepository(sail); - try { - repository.initialize(); + repository = new SailRepository(new NativeStore(new File(journalFilePath), indexes)); } catch (RepositoryException e) { throw new FatalReplaceObsoleteReferencesError("Could not initialize SAIL repository for database.", e); } - BlazegraphMutationCounter counter = new BlazegraphMutationCounter(); + SailMutationCounter counter = new SailMutationCounter(); String replacements = createReplacementsValuesList(tbox); String sparqlUpdate = classReplacementUpdateTemplate.replace("%%%values%%%", replacements); String complementsSparqlUpdate = complementsUpdateTemplate.replace("%%%values%%%", replacements); diff --git a/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceTermsCommand.java b/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceTermsCommand.java index 1e757dea..334c1849 100644 --- a/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceTermsCommand.java +++ b/minerva-cli/src/main/java/org/geneontology/minerva/cli/ReplaceTermsCommand.java @@ -1,28 +1,26 @@ package org.geneontology.minerva.cli; -import com.bigdata.rdf.changesets.IChangeLog; -import com.bigdata.rdf.sail.BigdataSail; -import com.bigdata.rdf.sail.BigdataSailRepository; -import com.bigdata.rdf.sail.BigdataSailRepositoryConnection; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.log4j.Logger; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.sail.NotifyingSail; +import org.eclipse.rdf4j.sail.Sail; +import org.eclipse.rdf4j.sail.nativerdf.NativeStore; import org.geneontology.minerva.MolecularModelManager; import org.geneontology.minerva.curie.CurieHandler; import org.geneontology.minerva.curie.DefaultCurieHandler; -import org.geneontology.minerva.util.BlazegraphMutationCounter; -import org.obolibrary.robot.CatalogXmlIRIMapper; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.QueryLanguage; -import org.openrdf.query.UpdateExecutionException; -import org.openrdf.repository.RepositoryException; -import org.semanticweb.owlapi.apibinding.OWLManager; +import org.geneontology.minerva.util.SailMutationCounter; +import org.eclipse.rdf4j.query.MalformedQueryException; +import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.UpdateExecutionException; +import org.eclipse.rdf4j.repository.RepositoryException; import org.semanticweb.owlapi.model.IRI; -import org.semanticweb.owlapi.model.OWLAnnotationValue; -import org.semanticweb.owlapi.model.OWLLiteral; -import org.semanticweb.owlapi.model.OWLOntologyManager; import java.io.BufferedReader; +import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -72,21 +70,14 @@ public static void run(String journalFilePath, String replacementClassesPath, St if (journalFilePath == null) { throw new FatalTermReplacementError("No journal file was configured."); } - Properties properties = new Properties(); + String indexes = "spoc,posc,cosp"; //FIXME review for appropriate indexes + SailRepository repository; try { - properties.load(CommandLineInterface.class.getResourceAsStream("/org/geneontology/minerva/blazegraph.properties")); - } catch (IOException e) { - throw new FatalTermReplacementError("Could not read blazegraph properties resource from jar file."); - } - properties.setProperty(com.bigdata.journal.Options.FILE, journalFilePath); - BigdataSail sail = new BigdataSail(properties); - BigdataSailRepository repository = new BigdataSailRepository(sail); - try { - repository.initialize(); + repository = new SailRepository(new NativeStore(new File(journalFilePath), indexes)); } catch (RepositoryException e) { throw new FatalTermReplacementError("Could not initialize SAIL repository for database.", e); } - BlazegraphMutationCounter counter = new BlazegraphMutationCounter(); + SailMutationCounter counter = new SailMutationCounter(); String classReplacements = formatAsSPARQLValuesList(loadTermReplacementFromFile(replacementClassesPath)); String objectPropertyReplacements = formatAsSPARQLValuesList(loadTermReplacementFromFile(replacementPropertiesPath)); String classesSparqlUpdate = classReplacementUpdateTemplate.replace("%%%values%%%", classReplacements); @@ -130,21 +121,38 @@ private static String formatAsSPARQLValuesList(Set, Pair< .collect(Collectors.joining(" ")); } - protected static void applySPARQLUpdate(BigdataSailRepository repository, String update, Optional changeLog) throws RepositoryException, UpdateExecutionException, MalformedQueryException { - BigdataSailRepositoryConnection connection = repository.getUnisolatedConnection(); - changeLog.ifPresent(connection::addChangeLog); - try { + protected static void applySPARQLUpdate(SailRepository repository, String update, Optional counter) throws RepositoryException, UpdateExecutionException, MalformedQueryException { + try (SailRepositoryConnection connection = repository.getConnection()) { + final Repository repo = connection.getRepository(); + NotifyingSail notifyingSail; + if (repo instanceof SailRepository) { + Sail sail = ((SailRepository) repo).getSail(); + if (sail instanceof NotifyingSail) { + notifyingSail = (NotifyingSail) sail; + } else { + notifyingSail = null; + } + } else { + notifyingSail = null; + } connection.begin(); + counter.ifPresent(c -> { + if (notifyingSail != null) { + notifyingSail.addSailChangedListener(c); + } + }); try { connection.prepareUpdate(QueryLanguage.SPARQL, update).execute(); } catch (UpdateExecutionException | RepositoryException | MalformedQueryException e) { connection.rollback(); throw e; } - } finally { - connection.close(); + counter.ifPresent(c -> { + if (notifyingSail != null) { + notifyingSail.removeSailChangedListener(c); + } + }); } - changeLog.ifPresent(connection::removeChangeLog); } private static Optional curieToIRI(String curie) { diff --git a/minerva-core/pom.xml b/minerva-core/pom.xml index 0725595a..9f4347e5 100644 --- a/minerva-core/pom.xml +++ b/minerva-core/pom.xml @@ -33,10 +33,6 @@ minerva-json ${project.parent.version} - - com.blazegraph - bigdata-core - commons-io commons-io @@ -92,6 +88,15 @@ commons-math3 3.6.1 + + org.eclipse.rdf4j + rdf4j-storage + pom + + + org.eclipse.rdf4j + rdf4j-sail-nativerdf + org.obolibrary.robot robot-core diff --git a/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphMolecularModelManager.java b/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphMolecularModelManager.java index 21278789..13801cb6 100644 --- a/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphMolecularModelManager.java +++ b/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphMolecularModelManager.java @@ -1,37 +1,41 @@ package org.geneontology.minerva; -import com.bigdata.journal.Options; -import com.bigdata.rdf.sail.BigdataSail; -import com.bigdata.rdf.sail.BigdataSailRepository; -import com.bigdata.rdf.sail.BigdataSailRepositoryConnection; -import info.aduna.iteration.Iterations; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import org.eclipse.rdf4j.common.transaction.IsolationLevels; +import org.eclipse.rdf4j.model.*; +import org.eclipse.rdf4j.model.util.Values; +import org.eclipse.rdf4j.model.vocabulary.OWL; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.*; +import org.eclipse.rdf4j.query.parser.QueryPrologLexer; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.RepositoryResult; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.rio.*; +import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler; +import org.eclipse.rdf4j.rio.helpers.StatementCollector; +import org.eclipse.rdf4j.sail.NotifyingSail; +import org.eclipse.rdf4j.sail.Sail; +import org.eclipse.rdf4j.sail.nativerdf.NativeStore; import org.geneontology.minerva.MolecularModelManager.UnknownIdentifierException; import org.geneontology.minerva.curie.CurieHandler; import org.geneontology.minerva.util.AnnotationShorthand; -import org.geneontology.minerva.util.BlazegraphMutationCounter; import org.geneontology.minerva.util.ReverseChangeGenerator; -import org.openrdf.model.*; -import org.openrdf.model.impl.URIImpl; -import org.openrdf.model.vocabulary.OWL; -import org.openrdf.model.vocabulary.RDF; -import org.openrdf.query.*; -import org.openrdf.query.parser.QueryPrologLexer; -import org.openrdf.repository.RepositoryException; -import org.openrdf.repository.RepositoryResult; -import org.openrdf.rio.*; -import org.openrdf.rio.helpers.RDFHandlerBase; -import org.openrdf.rio.helpers.StatementCollector; +import org.geneontology.minerva.util.SailMutationCounter; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.formats.*; import org.semanticweb.owlapi.model.*; +import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.rio.RioMemoryTripleSource; import org.semanticweb.owlapi.rio.RioRenderer; import javax.annotation.Nonnull; import java.io.*; +import java.nio.file.Files; import java.util.*; import java.util.Map.Entry; import java.util.stream.Collectors; @@ -47,7 +51,7 @@ public class BlazegraphMolecularModelManager extends CoreMolecularMode final String pathToOWLStore; final String pathToExportFolder; - private final BigdataSailRepository repo; + private final SailRepository repo; private final CurieHandler curieHandler; private final String modelIdPrefix; @@ -99,22 +103,14 @@ public CurieHandler getCuriHandler() { return curieHandler; } - private BigdataSailRepository initializeRepository(String pathToJournal) { + private SailRepository initializeRepository(String pathToJournal) { + String indexes = "spoc,posc,cosp"; //FIXME review for appropriate indexes try { - Properties properties = new Properties(); - properties.load(this.getClass().getResourceAsStream("blazegraph.properties")); - properties.setProperty(Options.FILE, pathToJournal); - BigdataSail sail = new BigdataSail(properties); - BigdataSailRepository repository = new BigdataSailRepository(sail); - - repository.initialize(); + SailRepository repository = new SailRepository(new NativeStore(new File(pathToJournal), indexes)); return repository; } catch (RepositoryException e) { LOG.fatal("Could not create Blazegraph sail", e); return null; - } catch (IOException e) { - LOG.fatal("Could not create Blazegraph sail", e); - return null; } } @@ -127,7 +123,6 @@ private BigdataSailRepository initializeRepository(String pathToJournal) { */ public ModelContainer generateBlankModel(METADATA metadata) throws OWLOntologyCreationException { - // Create an arbitrary unique ID and add it to the system. IRI modelId = generateId(modelIdPrefix); if (modelMap.containsKey(modelId)) { @@ -210,26 +205,23 @@ public void saveModel(ModelContainer m) throws IOException, RepositoryException, } private void writeModelToDatabase(OWLOntology model, IRI modelId) throws RepositoryException, IOException { - // Only one thread at a time can use the unisolated connection. - synchronized (repo) { - final BigdataSailRepositoryConnection connection = repo.getUnisolatedConnection(); + final SailRepositoryConnection connection = repo.getConnection(); + try { + connection.begin(IsolationLevels.READ_COMMITTED); try { - connection.begin(); - try { - URI graph = new URIImpl(modelId.toString()); - connection.clear(graph); - StatementCollector collector = new StatementCollector(); - RioRenderer renderer = new RioRenderer(model, collector, null); - renderer.render(); - connection.add(collector.getStatements(), graph); - connection.commit(); - } catch (Exception e) { - connection.rollback(); - throw e; - } - } finally { - connection.close(); + org.eclipse.rdf4j.model.IRI graph = Values.iri(modelId.toString()); + connection.clear(graph); + StatementCollector collector = new StatementCollector(); + RioRenderer renderer = new RioRenderer(model, collector, null); + renderer.render(); + connection.add(collector.getStatements(), graph); + connection.commit(); + } catch (Exception e) { + connection.rollback(); + throw e; } + } finally { + connection.close(); } } @@ -356,20 +348,18 @@ else if (fmt.equals("owm")) * @throws IOException */ public Set getStoredModelIds() throws IOException { - try { - BigdataSailRepositoryConnection connection = repo.getReadOnlyConnection(); + try (SailRepositoryConnection connection = repo.getConnection()) { + RepositoryResult graphs = connection.getContextIDs(); try { - RepositoryResult graphs = connection.getContextIDs(); Set modelIds = new HashSet<>(); while (graphs.hasNext()) { modelIds.add(IRI.create(graphs.next().stringValue())); } - graphs.close(); return Collections.unmodifiableSet(modelIds); } finally { - connection.close(); + ((AutoCloseable) graphs).close(); } - } catch (RepositoryException e) { + } catch (Exception e) { throw new IOException(e); } } @@ -402,7 +392,7 @@ public Map> getAllModelAnnotations() throws IOException Map> annotations = new HashMap<>(); // First get annotations from all the stored ontologies try { - BigdataSailRepositoryConnection connection = repo.getReadOnlyConnection(); + SailRepositoryConnection connection = repo.getConnection(); try { String query = "PREFIX owl: " + "PREFIX rdf: " + @@ -420,19 +410,17 @@ public Map> getAllModelAnnotations() throws IOException Value model = binding.getValue("model"); Value predicate = binding.getValue("p"); String value = binding.getValue("o").stringValue(); - if ((model instanceof URI) && (predicate instanceof URI)) { - IRI modelId = IRI.create(((URI) model).toString()); + if ((model instanceof org.eclipse.rdf4j.model.IRI) && (predicate instanceof org.eclipse.rdf4j.model.IRI)) { + IRI modelId = IRI.create(((org.eclipse.rdf4j.model.IRI) model).toString()); OWLAnnotationProperty property = factory - .getOWLAnnotationProperty(IRI.create(((URI) predicate).toString())); + .getOWLAnnotationProperty(IRI.create(((org.eclipse.rdf4j.model.IRI) predicate).toString())); OWLAnnotation annotation = factory.getOWLAnnotation(property, factory.getOWLLiteral(value)); Set modelAnnotations = annotations.getOrDefault(modelId, new HashSet<>()); modelAnnotations.add(annotation); annotations.put(modelId, modelAnnotations); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -447,8 +435,9 @@ public Map> getAllModelAnnotations() throws IOException return annotations; } - public QueryResult executeSPARQLQuery(String queryText, int timeout) throws MalformedQueryException, QueryEvaluationException, RepositoryException { - BigdataSailRepositoryConnection connection = repo.getReadOnlyConnection(); + public QueryResult executeSPARQLQuery(String queryText, int timeout) throws + MalformedQueryException, QueryEvaluationException, RepositoryException { + SailRepositoryConnection connection = repo.getConnection(); try { List tokens = QueryPrologLexer.lex(queryText); Set declaredPrefixes = tokens.stream().filter(token -> token.getType().equals(QueryPrologLexer.TokenType.PREFIX)).map(token -> token.getStringValue()).collect(Collectors.toSet()); @@ -478,8 +467,9 @@ public QueryResult executeSPARQLQuery(String queryText, int timeout) throws Malf } } - public QueryResult executeSPARQLQueryWithoutPrefixManipulation(String queryText, int timeout) throws MalformedQueryException, QueryEvaluationException, RepositoryException { - BigdataSailRepositoryConnection connection = repo.getReadOnlyConnection(); + public QueryResult executeSPARQLQueryWithoutPrefixManipulation(String queryText, int timeout) throws + MalformedQueryException, QueryEvaluationException, RepositoryException { + SailRepositoryConnection connection = repo.getConnection(); try { Query query = connection.prepareQuery(QueryLanguage.SPARQL, queryText.toString()); query.setMaxQueryTime(timeout); @@ -508,23 +498,22 @@ public void loadModel(IRI modelId, boolean isOverride) throws OWLOntologyCreatio unlinkModel(modelId); } try { - BigdataSailRepositoryConnection connection = repo.getReadOnlyConnection(); - try { + try (SailRepositoryConnection connection = repo.getConnection()) { RepositoryResult graphs = connection.getContextIDs(); - if (!Iterations.asSet(graphs).contains(new URIImpl(modelId.toString()))) { + if (graphs.stream().noneMatch(g -> g.equals(Values.iri(modelId.toString())))) { throw new OWLOntologyCreationException("No such model in datastore: " + modelId); } - graphs.close(); + ((AutoCloseable) graphs).close(); RepositoryResult statements = - connection.getStatements(null, null, null, false, new URIImpl(modelId.toString())); + connection.getStatements(null, null, null, false, Values.iri(modelId.toString())); //setting minimal = false will load the abox with the tbox ontology manager, allowing for OWL understanding of tbox content boolean minimal = false; - OWLOntology abox = loadOntologyDocumentSource(new RioMemoryTripleSource(statements), minimal); - statements.close(); + OWLOntology abox = loadOntologyDocumentSource(new RioMemoryTripleSource(statements.iterator()), minimal); + ((AutoCloseable) statements).close(); abox = postLoadFileFilter(abox); ModelContainer model = addModel(modelId, abox); - } finally { - connection.close(); + } catch (Exception e) { + throw new OWLOntologyCreationException(e); } } catch (RepositoryException e) { throw new OWLOntologyCreationException(e); @@ -540,30 +529,28 @@ public OWLOntology loadModelABox(IRI modelId) throws OWLOntologyCreationExceptio public OWLOntology loadModelABox(IRI modelId, OWLOntologyManager manager) throws OWLOntologyCreationException { LOG.info("Load model abox: " + modelId + " from database"); try { - BigdataSailRepositoryConnection connection = repo.getReadOnlyConnection(); - try { + try (SailRepositoryConnection connection = repo.getConnection()) { //TODO repeated code with loadModel RepositoryResult graphs = connection.getContextIDs(); - if (!Iterations.asSet(graphs).contains(new URIImpl(modelId.toString()))) { + if (graphs.stream().noneMatch(g -> g.equals(Values.iri(modelId.toString())))) { throw new OWLOntologyCreationException("No such model in datastore: " + modelId); } - graphs.close(); + ((AutoCloseable) graphs).close(); RepositoryResult statements = - connection.getStatements(null, null, null, false, new URIImpl(modelId.toString())); + connection.getStatements(null, null, null, false, Values.iri(modelId.toString())); //setting minimal to true will give an OWL abox with triples that won't be connected to the tbox, hence e.g. object properties might not be recognized. boolean minimal = true; OWLOntology abox; if (manager == null) { - abox = loadOntologyDocumentSource(new RioMemoryTripleSource(statements), minimal); + abox = loadOntologyDocumentSource(new RioMemoryTripleSource(statements.iterator()), minimal); } else { - abox = loadOntologyDocumentSource(new RioMemoryTripleSource(statements), minimal, manager); + abox = loadOntologyDocumentSource(new RioMemoryTripleSource(statements.iterator()), minimal, manager); } - - statements.close(); + ((AutoCloseable) statements).close(); abox = postLoadFileFilter(abox); return abox; - } finally { - connection.close(); + } catch (Exception e) { + throw new OWLOntologyCreationException(e); } } catch (RepositoryException e) { throw new OWLOntologyCreationException(e); @@ -588,6 +575,47 @@ public void addPostLoadOntologyFilter(PostLoadOntologyFilter filter) { } } + public void importBulkModelsToDatabase(File folder, boolean skipMarkedDelete) throws IOException { + int totalFiles = 0; + int storedFiles = 0; + LOG.info("Loading gocams from " + folder); + if (folder.exists()) { + if (folder.isDirectory()) { + totalFiles = folder.listFiles().length; + try (SailRepositoryConnection connection = repo.getConnection()) { + connection.begin(IsolationLevels.NONE); + for (File file : FileUtils.listFiles(folder, null, true)) { + if (file.getName().endsWith("ttl")) { + if (skipMarkedDelete && scanForIsDelete(file)) { + LOG.info("Skipping file marked for delete: " + file); + } else { + java.util.Optional ontIRIOpt = scanForOntologyIRI(file).map(id -> Values.iri(id)); + java.util.Optional importOpt = scanForImport(file).map(id -> Values.iri(id)); + if (importOpt.isPresent()) { + LOG.warn("Skipping file containing owl:imports statement: " + file); + } else if (!ontIRIOpt.isPresent()) { + LOG.warn("Skipping file with unknown extension: " + file); + } else { + org.eclipse.rdf4j.model.IRI graph = ontIRIOpt.get(); + if (file.getName().endsWith(".ttl")) { + connection.add(file, "", RDFFormat.TURTLE, graph); + storedFiles++; + } else if (file.getName().endsWith(".owl")) { + connection.add(file, "", RDFFormat.RDFXML, graph); + storedFiles++; + } + } + } + } + } + connection.commit(); + } + } + LOG.info("Done loading gocams, loaded: " + storedFiles + " out of: " + totalFiles + " files"); + } + + } + /** * Imports ontology RDF directly to database. Will remove any import statements in the ontology (because GO-CAMs should not have any as of now) * @@ -596,7 +624,8 @@ public void addPostLoadOntologyFilter(PostLoadOntologyFilter filter) { * @throws IOException * @throws RepositoryException */ - public String importModelToDatabase(File file, boolean skipMarkedDelete) throws OWLOntologyCreationException, RepositoryException, IOException, RDFParseException, RDFHandlerException { + public String importModelToDatabase(File file, boolean skipMarkedDelete) throws + OWLOntologyCreationException, RepositoryException, IOException, RDFParseException, RDFHandlerException { final boolean delete; if (skipMarkedDelete) { delete = scanForIsDelete(file); @@ -605,9 +634,9 @@ public String importModelToDatabase(File file, boolean skipMarkedDelete) throws } String modeliri = null; if (!delete) { - java.util.Optional ontIRIOpt = scanForOntologyIRI(file).map(id -> new URIImpl(id)); + java.util.Optional ontIRIOpt = scanForOntologyIRI(file).map(id -> Values.iri(id)); if (ontIRIOpt.isPresent()) { - java.util.Optional importOpt = scanForImport(file).map(id -> new URIImpl(id)); + java.util.Optional importOpt = scanForImport(file).map(id -> Values.iri(id)); if (importOpt.isPresent()) { modeliri = ontIRIOpt.get().stringValue(); //need to remove the imports before loading. @@ -623,28 +652,27 @@ public String importModelToDatabase(File file, boolean skipMarkedDelete) throws //write it this.writeModelToDatabase(cam, IRI.create(ontIRIOpt.get().stringValue())); } else { //otherwise just load it all up as rdf (faster because avoids owl api) - synchronized (repo) { - final BigdataSailRepositoryConnection connection = repo.getUnisolatedConnection(); + // assuming bulk load? + final SailRepositoryConnection connection = repo.getConnection(); + try { + connection.begin(IsolationLevels.READ_COMMITTED); try { - connection.begin(); - try { - URI graph = ontIRIOpt.get(); - connection.clear(graph); - //FIXME Turtle format is hard-coded here - if (file.getName().endsWith(".ttl")) { - connection.add(file, "", RDFFormat.TURTLE, graph); - } else if (file.getName().endsWith(".owl")) { - connection.add(file, "", RDFFormat.RDFXML, graph); - } - connection.commit(); - modeliri = graph.toString(); - } catch (Exception e) { - connection.rollback(); - throw e; + org.eclipse.rdf4j.model.IRI graph = ontIRIOpt.get(); + connection.clear(graph); + //FIXME Turtle format is hard-coded here + if (file.getName().endsWith(".ttl")) { + connection.add(file, "", RDFFormat.TURTLE, graph); + } else if (file.getName().endsWith(".owl")) { + connection.add(file, "", RDFFormat.RDFXML, graph); } - } finally { - connection.close(); + connection.commit(); + modeliri = graph.toString(); + } catch (Exception e) { + connection.rollback(); + throw e; } + } finally { + connection.close(); } } } else { @@ -666,8 +694,9 @@ public String importModelToDatabase(File file, boolean skipMarkedDelete) throws * @throws RDFHandlerException * @throws IOException */ - private java.util.Optional scanForImport(File file) throws RDFParseException, RDFHandlerException, IOException { - RDFHandlerBase handler = new RDFHandlerBase() { + private java.util.Optional scanForImport(File file) throws + RDFParseException, RDFHandlerException, IOException { + AbstractRDFHandler handler = new AbstractRDFHandler() { public void handleStatement(Statement statement) { if (statement.getPredicate().stringValue().equals("http://www.w3.org/2002/07/owl#imports")) throw new FoundTripleException(statement); @@ -700,16 +729,16 @@ public void handleStatement(Statement statement) { * @throws RDFHandlerException * @throws RDFParseException */ - public java.util.Optional scanForOntologyIRI(File file) throws RDFParseException, RDFHandlerException, IOException { - RDFHandlerBase handler = new RDFHandlerBase() { + public java.util.Optional scanForOntologyIRI(File file) throws + RDFParseException, RDFHandlerException, IOException { + AbstractRDFHandler handler = new AbstractRDFHandler() { public void handleStatement(Statement statement) { if (statement.getObject().stringValue().equals("http://www.w3.org/2002/07/owl#Ontology") && statement.getPredicate().stringValue().equals("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")) throw new FoundTripleException(statement); } }; - InputStream inputStream = new FileInputStream(file); - try { + try (InputStream inputStream = Files.newInputStream(file.toPath())) { //FIXME Turtle format is hard-coded here RDFParser parser = Rio.createParser(RDFFormat.RDFXML); if (file.getName().endsWith(".ttl")) { @@ -719,30 +748,27 @@ public void handleStatement(Statement statement) { parser.parse(inputStream, ""); // If an ontology IRI triple is found, it will be thrown out // in an exception. Otherwise, return empty. - return java.util.Optional.empty(); + return Optional.empty(); } catch (FoundTripleException fte) { Statement statement = fte.getStatement(); if (statement.getSubject() instanceof BNode) { LOG.warn("Blank node subject for ontology triple: " + statement); - return java.util.Optional.empty(); + return Optional.empty(); } else { - return java.util.Optional.of(statement.getSubject().stringValue()); + return Optional.of(statement.getSubject().stringValue()); } - } finally { - inputStream.close(); } } private boolean scanForIsDelete(File file) throws RDFParseException, RDFHandlerException, IOException { - RDFHandlerBase handler = new RDFHandlerBase() { - + AbstractRDFHandler handler = new AbstractRDFHandler() { public void handleStatement(Statement statement) { if (statement.getPredicate().stringValue().equals(AnnotationShorthand.modelstate.getAnnotationProperty().toString()) && - statement.getObject().stringValue().equals("delete")) throw new FoundTripleException(statement); + statement.getObject().stringValue().equals("delete")) + throw new FoundTripleException(statement); } }; - InputStream inputStream = new FileInputStream(file); - try { + try (InputStream inputStream = Files.newInputStream(file.toPath())) { //FIXME Turtle format is hard-coded here RDFParser parser = Rio.createParser(RDFFormat.TURTLE); parser.setRDFHandler(handler); @@ -752,8 +778,6 @@ public void handleStatement(Statement statement) { return false; } catch (FoundTripleException fte) { return true; - } finally { - inputStream.close(); } } @@ -826,27 +850,20 @@ public void dumpStoredModel(IRI modelId, File folder) throws IOException { String prefix = modelId.toString(); // TODO escape tempFile = File.createTempFile(prefix, ".ttl"); try { - BigdataSailRepositoryConnection connection = repo.getReadOnlyConnection(); - OutputStream out = new FileOutputStream(tempFile); - try { + try (SailRepositoryConnection connection = repo.getConnection(); OutputStream out = Files.newOutputStream(tempFile.toPath())) { // Workaround for order dependence of RDF reading by OWL API // Need to output ontology triple first until this bug is fixed: // https://github.com/owlcs/owlapi/issues/574 ValueFactory factory = connection.getValueFactory(); - Statement ontologyDeclaration = factory.createStatement(factory.createURI(modelId.toString()), RDF.TYPE, OWL.ONTOLOGY); + Statement ontologyDeclaration = factory.createStatement(factory.createIRI(modelId.toString()), RDF.TYPE, OWL.ONTOLOGY); Rio.write(Collections.singleton(ontologyDeclaration), out, RDFFormat.TURTLE); // end workaround RDFWriter writer = Rio.createWriter(RDFFormat.TURTLE, out); - connection.export(writer, new URIImpl(modelId.toString())); + connection.export(writer, Values.iri(modelId.toString())); // copy temp file to the finalFile FileUtils.copyFile(tempFile, targetFile); - } finally { - out.close(); - connection.close(); } - } catch (RepositoryException e) { - throw new IOException(e); - } catch (RDFHandlerException e) { + } catch (RepositoryException | RDFHandlerException e) { throw new IOException(e); } } finally { @@ -858,13 +875,10 @@ public void dumpStoredModel(IRI modelId, File folder) throws IOException { public void dispose() { super.dispose(); try { - if (repo.getSail().isOpen()) { - repo.shutDown(); - } + repo.getSail().shutDown(); + repo.shutDown(); if (this.getGolego_repo() != null) { - if (this.getGolego_repo().getGo_lego_repo().getSail().isOpen()) { - getGolego_repo().dispose(); - } + getGolego_repo().dispose(); } } catch (RepositoryException e) { LOG.error("Failed to shutdown Blazegraph sail.", e); @@ -959,10 +973,8 @@ public void addTaxonMetadata() throws IOException { //addTaxonWithOWL(IRI.create(model), IRI.create(taxon)); try { addTaxonToDatabaseWithSparql(IRI.create(model), taxon); - } catch (RepositoryException | UpdateExecutionException | MalformedQueryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InterruptedException e) { + } catch (RepositoryException | UpdateExecutionException | MalformedQueryException | + InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } @@ -971,7 +983,8 @@ public void addTaxonMetadata() throws IOException { } //now try with sparql insert - public int addTaxonToDatabaseWithSparql(IRI model_iri, IRI taxon_iri) throws RepositoryException, UpdateExecutionException, MalformedQueryException, InterruptedException { + public int addTaxonToDatabaseWithSparql(IRI model_iri, IRI taxon_iri) throws + RepositoryException, UpdateExecutionException, MalformedQueryException, InterruptedException { int changes = 0; String update = "INSERT DATA\n" + @@ -980,14 +993,27 @@ public int addTaxonToDatabaseWithSparql(IRI model_iri, IRI taxon_iri) throws Rep "} }"; synchronized (repo) { - final BigdataSailRepositoryConnection conn = repo.getUnisolatedConnection(); + final SailRepositoryConnection conn = repo.getConnection(); + final Repository repo = conn.getRepository(); + NotifyingSail notifyingSail = null; + if (repo instanceof SailRepository) { + Sail sail = ((SailRepository) repo).getSail(); + if (sail instanceof NotifyingSail) { + notifyingSail = (NotifyingSail) sail; + } + } + conn.begin(); try { conn.begin(); - BlazegraphMutationCounter counter = new BlazegraphMutationCounter(); - conn.addChangeLog(counter); + SailMutationCounter counter = new SailMutationCounter(); + if (notifyingSail != null) { + notifyingSail.addSailChangedListener(counter); + } conn.prepareUpdate(QueryLanguage.SPARQL, update).execute(); changes = counter.mutationCount(); - conn.removeChangeLog(counter); + if (notifyingSail != null) { + notifyingSail.removeSailChangedListener(counter); + } conn.commit(); } finally { conn.close(); diff --git a/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphOntologyManager.java b/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphOntologyManager.java index debeb584..7c7eb422 100644 --- a/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphOntologyManager.java +++ b/minerva-core/src/main/java/org/geneontology/minerva/BlazegraphOntologyManager.java @@ -3,26 +3,23 @@ */ package org.geneontology.minerva; -import com.bigdata.journal.Options; -import com.bigdata.rdf.sail.BigdataSail; -import com.bigdata.rdf.sail.BigdataSailRepository; -import com.bigdata.rdf.sail.BigdataSailRepositoryConnection; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.impl.URIImpl; -import org.openrdf.query.*; -import org.openrdf.repository.RepositoryException; -import org.openrdf.rio.RDFFormat; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFParseException; -import org.openrdf.rio.helpers.StatementCollector; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.*; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; +import org.eclipse.rdf4j.rio.helpers.StatementCollector; +import org.eclipse.rdf4j.sail.nativerdf.NativeStore; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; import org.semanticweb.owlapi.rio.RioRenderer; import org.semanticweb.owlapi.search.EntitySearcher; - +import org.eclipse.rdf4j.model.util.Values; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -38,7 +35,7 @@ */ public class BlazegraphOntologyManager { private static Logger LOG = Logger.getLogger(BlazegraphOntologyManager.class); - private final BigdataSailRepository go_lego_repo; + private final SailRepository go_lego_repo; private final static String public_blazegraph_url = "http://skyhook.berkeleybop.org/blazegraph-go-lego-reacto-neo.jnl.gz"; //TODO this should probably go somewhere else - like an ontology file - this was missing.. public static String in_taxon_uri = "https://w3id.org/biolink/vocab/in_taxon"; @@ -105,7 +102,7 @@ public BlazegraphOntologyManager(String go_lego_repo_file, boolean downloadJourn regulatorsToRegulated = buildRegulationMap(); } - public BigdataSailRepository getGo_lego_repo() { + public SailRepository getGo_lego_repo() { return go_lego_repo; } @@ -127,32 +124,25 @@ public void unGunzipFile(String compressedFile, String decompressedFile) { } - private BigdataSailRepository initializeRepository(String pathToJournal) { + private SailRepository initializeRepository(String pathToJournal) { + String indexes = "spoc,posc,cosp"; //FIXME review for appropriate indexes try { - Properties properties = new Properties(); - properties.load(this.getClass().getResourceAsStream("onto-blazegraph.properties")); - properties.setProperty(Options.FILE, pathToJournal); - BigdataSail sail = new BigdataSail(properties); - BigdataSailRepository repository = new BigdataSailRepository(sail); - - repository.initialize(); + SailRepository repository = new SailRepository(new NativeStore(new File(pathToJournal), indexes)); return repository; } catch (RepositoryException e) { - LOG.fatal("Could not create Blazegraph sail", e); - return null; - } catch (IOException e) { - LOG.fatal("Could not create Blazegraph sail", e); + LOG.fatal("Could not create sail", e); return null; } } public void loadRepositoryFromOWLFile(File file, String iri, boolean reset) throws OWLOntologyCreationException, RepositoryException, IOException, RDFParseException, RDFHandlerException { synchronized (go_lego_repo) { - final BigdataSailRepositoryConnection connection = go_lego_repo.getUnisolatedConnection(); + //FIXME is there a read-only connection like Blazegraph? + final SailRepositoryConnection connection = go_lego_repo.getConnection(); try { connection.begin(); try { - URI graph = new URIImpl(iri); + org.eclipse.rdf4j.model.IRI graph = Values.iri(iri); if (reset) { connection.clear(graph); } @@ -174,11 +164,12 @@ public void loadRepositoryFromOWLFile(File file, String iri, boolean reset) thro public void loadRepositoryFromOntology(OWLOntology ontology, String iri, boolean reset) throws OWLOntologyCreationException, RepositoryException, IOException, RDFParseException, RDFHandlerException { synchronized (go_lego_repo) { - final BigdataSailRepositoryConnection connection = go_lego_repo.getUnisolatedConnection(); + //FIXME is there a read-only connection like Blazegraph? + final SailRepositoryConnection connection = go_lego_repo.getConnection(); try { connection.begin(); try { - URI graph = new URIImpl(iri); + org.eclipse.rdf4j.model.IRI graph = Values.iri(iri); if (reset) { connection.clear(graph); } @@ -200,7 +191,7 @@ public void loadRepositoryFromOntology(OWLOntology ontology, String iri, boolean public Set getAllSuperClasses(String uri) throws IOException { Set supers = new HashSet(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String query = "PREFIX owl: " + "PREFIX rdf: " @@ -215,14 +206,12 @@ public Set getAllSuperClasses(String uri) throws IOException { BindingSet binding = result.next(); Value v = binding.getValue("super"); //ignore anonymous super classes - if (v instanceof URI) { + if (v instanceof org.eclipse.rdf4j.model.IRI) { String superclass = binding.getValue("super").stringValue(); supers.add(superclass); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -236,7 +225,7 @@ public Set getAllSuperClasses(String uri) throws IOException { public Set getAllSubClasses(String uri) throws IOException { Set supers = new HashSet(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String query = "PREFIX owl: " + "PREFIX rdf: " @@ -251,14 +240,12 @@ public Set getAllSubClasses(String uri) throws IOException { BindingSet binding = result.next(); Value v = binding.getValue("sub"); //ignore anonymous sub classes - if (v instanceof URI) { + if (v instanceof org.eclipse.rdf4j.model.IRI) { String superclass = binding.getValue("sub").stringValue(); supers.add(superclass); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -273,7 +260,7 @@ public Set getAllSubClasses(String uri) throws IOException { public Map buildClassDepthMap(String root_term) throws IOException { Map class_depth = new HashMap(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String query = "PREFIX owl: " + "PREFIX rdf: " @@ -298,9 +285,7 @@ public Map buildClassDepthMap(String root_term) throws IOExcept class_depth.put(c, depth); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -314,7 +299,7 @@ public Map buildClassDepthMap(String root_term) throws IOExcept public int getClassDepth(String term, String root_term) throws IOException { int depth = -1; try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String query = "PREFIX owl: " + "PREFIX rdf: " @@ -334,9 +319,7 @@ public int getClassDepth(String term, String root_term) throws IOException { Value v = binding.getValue("depth"); depth = Integer.parseInt(v.stringValue()); } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -350,7 +333,7 @@ public int getClassDepth(String term, String root_term) throws IOException { private Map> buildRegulationMap() throws IOException { String regulationTargetsQuery = IOUtils.toString(BlazegraphOntologyManager.class.getResourceAsStream("regulation_targets.rq"), StandardCharsets.UTF_8); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, regulationTargetsQuery); TupleQueryResult result = tupleQuery.evaluate(); @@ -365,9 +348,7 @@ private Map> buildRegulationMap() throws IOException { regulators.get(regulator).add(regulated); } return regulators; - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -408,7 +389,7 @@ public Map> getSuperCategoryMapForIndividuals(Se public Map> getSuperCategoryMap(Set uris) throws IOException { Map> sub_supers = new HashMap>(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String q = "VALUES ?sub {"; for (String uri : uris) { @@ -452,7 +433,7 @@ public Map> getSuperCategoryMap(Set uris) throws IOE Value child = binding.getValue("sub"); //System.out.println(child +" "+parent); //ignore anonymous super classes - if (parent instanceof URI && child instanceof URI) { + if (parent instanceof org.eclipse.rdf4j.model.IRI && child instanceof org.eclipse.rdf4j.model.IRI) { String superclass = binding.getValue("super").stringValue(); String subclass = binding.getValue("sub").stringValue(); Set supers = sub_supers.get(subclass); @@ -463,9 +444,7 @@ public Map> getSuperCategoryMap(Set uris) throws IOE sub_supers.put(subclass, supers); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -509,7 +488,7 @@ public Map> getNeoRoots(Set uris) throws IOException public Map> getSuperClassMap(Set uris) throws IOException { Map> sub_supers = new HashMap>(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String q = "VALUES ?sub {"; for (String uri : uris) { @@ -531,7 +510,7 @@ public Map> getSuperClassMap(Set uris) throws IOExce Value child = binding.getValue("sub"); //System.out.println(child +" "+parent); //ignore anonymous super classes - if (parent instanceof URI && child instanceof URI) { + if (parent instanceof org.eclipse.rdf4j.model.IRI && child instanceof org.eclipse.rdf4j.model.IRI) { String superclass = binding.getValue("super").stringValue(); String subclass = binding.getValue("sub").stringValue(); Set supers = sub_supers.get(subclass); @@ -542,9 +521,7 @@ public Map> getSuperClassMap(Set uris) throws IOExce sub_supers.put(subclass, supers); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -559,7 +536,7 @@ public Map> getSuperClassMap(Set uris) throws IOExce public Set getGenesByTaxid(String ncbi_tax_id) throws IOException { Set genes = new HashSet(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String query = "select ?gene \n" + @@ -575,14 +552,12 @@ public Set getGenesByTaxid(String ncbi_tax_id) throws IOException { BindingSet binding = result.next(); Value v = binding.getValue("gene"); //ignore anonymous sub classes - if (v instanceof URI) { + if (v instanceof org.eclipse.rdf4j.model.IRI) { String gene = binding.getValue("gene").stringValue(); genes.add(gene); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -596,7 +571,7 @@ public Set getGenesByTaxid(String ncbi_tax_id) throws IOException { public Set getAllTaxaWithGenes() throws IOException { Set taxa = new HashSet(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String query = "select distinct ?taxon \n" + @@ -613,14 +588,12 @@ public Set getAllTaxaWithGenes() throws IOException { BindingSet binding = result.next(); Value v = binding.getValue("taxon"); //ignore anonymous sub classes - if (v instanceof URI) { + if (v instanceof org.eclipse.rdf4j.model.IRI) { String taxon = binding.getValue("taxon").stringValue(); taxa.add(taxon); } } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -648,7 +621,7 @@ public Set getTaxaByGenes(Set genes) throws IOException { expansion += " } . \n"; Set taxa = new HashSet<>(); try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { String query = "select distinct ?taxon \n" + @@ -666,7 +639,7 @@ public Set getTaxaByGenes(Set genes) throws IOException { BindingSet binding = result.next(); Value v = binding.getValue("taxon"); //ignore anonymous sub classes - if (v instanceof URI) { + if (v instanceof org.eclipse.rdf4j.model.IRI) { IRI taxon = IRI.create(binding.getValue("taxon").stringValue()); taxa.add(taxon); } @@ -693,7 +666,7 @@ public String getLabel(String entity) throws IOException { String query = "select ?label where { <" + entity + "> rdfs:label ?label } limit 1"; try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query); TupleQueryResult result = tupleQuery.evaluate(); @@ -702,9 +675,7 @@ public String getLabel(String entity) throws IOException { Value v = binding.getValue("label"); label = v.stringValue(); } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -725,7 +696,7 @@ public boolean exists(String entity) throws IOException { "{?s ?p <" + entity + "> . }" + "} limit 1"; try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query); TupleQueryResult result = tupleQuery.evaluate(); @@ -733,9 +704,7 @@ public boolean exists(String entity) throws IOException { exists = true; return exists; } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); @@ -757,7 +726,7 @@ public Map getLabels(Set entities) throws IOException { String query = "select ?entity ?label where { " + values + " ?entity rdfs:label ?label }"; try { - BigdataSailRepositoryConnection connection = go_lego_repo.getReadOnlyConnection(); + SailRepositoryConnection connection = go_lego_repo.getConnection(); try { TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query); TupleQueryResult result = tupleQuery.evaluate(); @@ -769,9 +738,7 @@ public Map getLabels(Set entities) throws IOException { String entity = ev.stringValue(); uri_label.put(entity, label); } - } catch (MalformedQueryException e) { - throw new IOException(e); - } catch (QueryEvaluationException e) { + } catch (MalformedQueryException | QueryEvaluationException e) { throw new IOException(e); } finally { connection.close(); diff --git a/minerva-core/src/main/java/org/geneontology/minerva/json/SPARQLResultJSONRenderer.java b/minerva-core/src/main/java/org/geneontology/minerva/json/SPARQLResultJSONRenderer.java index 4d39f723..21fb7516 100644 --- a/minerva-core/src/main/java/org/geneontology/minerva/json/SPARQLResultJSONRenderer.java +++ b/minerva-core/src/main/java/org/geneontology/minerva/json/SPARQLResultJSONRenderer.java @@ -5,14 +5,14 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.geneontology.minerva.curie.CurieHandler; -import org.openrdf.query.GraphQueryResult; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.TupleQueryResult; -import org.openrdf.query.TupleQueryResultHandlerException; -import org.openrdf.query.resultio.QueryResultIO; -import org.openrdf.query.resultio.TupleQueryResultFormat; -import org.openrdf.rio.RDFFormat; -import org.openrdf.rio.RDFHandlerException; +import org.eclipse.rdf4j.query.GraphQueryResult; +import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; +import org.eclipse.rdf4j.query.resultio.QueryResultIO; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFHandlerException; import org.semanticweb.owlapi.model.IRI; import java.io.ByteArrayOutputStream; @@ -29,7 +29,7 @@ public SPARQLResultJSONRenderer(CurieHandler curieHandler) { public JsonObject renderResults(TupleQueryResult sparqlResults) throws QueryEvaluationException, IOException, TupleQueryResultHandlerException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); - QueryResultIO.write(sparqlResults, TupleQueryResultFormat.JSON, stream); + QueryResultIO.writeTuple(sparqlResults, TupleQueryResultFormat.JSON, stream); String json = stream.toString("UTF-8"); stream.close(); JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class); @@ -49,7 +49,7 @@ public JsonObject renderResults(TupleQueryResult sparqlResults) throws QueryEval public JsonObject renderGraph(GraphQueryResult result) throws QueryEvaluationException, IOException, RDFHandlerException { ByteArrayOutputStream stream = new ByteArrayOutputStream(); - QueryResultIO.write(result, RDFFormat.RDFJSON, stream); + QueryResultIO.writeGraph(result, RDFFormat.RDFJSON, stream); String json = stream.toString("UTF-8"); stream.close(); JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class); diff --git a/minerva-core/src/main/java/org/geneontology/minerva/model/GoCamModel.java b/minerva-core/src/main/java/org/geneontology/minerva/model/GoCamModel.java index 6d231e25..2de19340 100644 --- a/minerva-core/src/main/java/org/geneontology/minerva/model/GoCamModel.java +++ b/minerva-core/src/main/java/org/geneontology/minerva/model/GoCamModel.java @@ -3,11 +3,11 @@ import org.apache.log4j.Logger; import org.geneontology.minerva.BlazegraphMolecularModelManager; import org.geneontology.minerva.BlazegraphOntologyManager; -import org.openrdf.query.BindingSet; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.TupleQueryResult; -import org.openrdf.repository.RepositoryException; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.MalformedQueryException; +import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.repository.RepositoryException; import org.semanticweb.owlapi.model.*; import java.io.IOException; @@ -79,7 +79,11 @@ private void setIndTypesWithSparql(BlazegraphMolecularModelManager m3, String gr types.add(type); all_types.add(type); } - r.close(); + try { + ((AutoCloseable)r).close(); + } catch (Exception e) { + throw new IOException(e); + } Map> type_roots = go_lego.getSuperCategoryMap(all_types); //set global ind_types = new HashMap>(); diff --git a/minerva-core/src/main/java/org/geneontology/minerva/util/BlazegraphMutationCounter.java b/minerva-core/src/main/java/org/geneontology/minerva/util/BlazegraphMutationCounter.java deleted file mode 100644 index 2c925784..00000000 --- a/minerva-core/src/main/java/org/geneontology/minerva/util/BlazegraphMutationCounter.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.geneontology.minerva.util; - -import com.bigdata.rdf.changesets.IChangeLog; -import com.bigdata.rdf.changesets.IChangeRecord; - -public class BlazegraphMutationCounter implements IChangeLog { - - private int records = 0; - - public int mutationCount() { - return records; - } - - @Override - public void changeEvent(IChangeRecord record) { - records++; - } - - @Override - public void close() { - } - - @Override - public void transactionAborted() { - } - - @Override - public void transactionBegin() { - } - - @Override - public void transactionCommited(long commitTime) { - } - - @Override - public void transactionPrepare() { - } - -} diff --git a/minerva-core/src/main/java/org/geneontology/minerva/util/SailMutationCounter.java b/minerva-core/src/main/java/org/geneontology/minerva/util/SailMutationCounter.java new file mode 100644 index 00000000..b2475c30 --- /dev/null +++ b/minerva-core/src/main/java/org/geneontology/minerva/util/SailMutationCounter.java @@ -0,0 +1,19 @@ +package org.geneontology.minerva.util; + +import org.eclipse.rdf4j.sail.SailChangedEvent; +import org.eclipse.rdf4j.sail.SailChangedListener; + +public class SailMutationCounter implements SailChangedListener { + + private int records = 0; + + public int mutationCount() { + return records; + } + + @Override + public void sailChanged(SailChangedEvent sailChangedEvent) { + records++; + } + +} diff --git a/minerva-core/src/test/java/org/geneontology/minerva/BlazegraphMolecularModelManagerTest.java b/minerva-core/src/test/java/org/geneontology/minerva/BlazegraphMolecularModelManagerTest.java index 2e032aa8..2940ab92 100644 --- a/minerva-core/src/test/java/org/geneontology/minerva/BlazegraphMolecularModelManagerTest.java +++ b/minerva-core/src/test/java/org/geneontology/minerva/BlazegraphMolecularModelManagerTest.java @@ -13,9 +13,9 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.openrdf.query.GraphQueryResult; -import org.openrdf.query.QueryResult; -import org.openrdf.query.TupleQueryResult; +import org.eclipse.rdf4j.query.GraphQueryResult; +import org.eclipse.rdf4j.query.QueryResult; +import org.eclipse.rdf4j.query.TupleQueryResult; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; diff --git a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelCreator.java b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelCreator.java index 575d0771..5c3e7442 100644 --- a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelCreator.java +++ b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelCreator.java @@ -10,7 +10,7 @@ import org.geneontology.minerva.json.JsonTools; import org.geneontology.minerva.json.MolecularModelJsonRenderer; import org.geneontology.minerva.util.AnnotationShorthand; -import org.openrdf.repository.RepositoryException; +import org.eclipse.rdf4j.repository.RepositoryException; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; import org.semanticweb.owlapi.model.parameters.Imports; diff --git a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelSearchHandler.java b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelSearchHandler.java index 615e0da2..859ca1b0 100644 --- a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelSearchHandler.java +++ b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/ModelSearchHandler.java @@ -6,8 +6,8 @@ import org.geneontology.minerva.BlazegraphOntologyManager; import org.geneontology.minerva.MolecularModelManager.UnknownIdentifierException; import org.geneontology.minerva.curie.CurieHandler; -import org.openrdf.query.*; -import org.openrdf.repository.RepositoryException; +import org.eclipse.rdf4j.query.*; +import org.eclipse.rdf4j.repository.RepositoryException; import org.semanticweb.owlapi.model.IRI; import javax.ws.rs.*; @@ -570,8 +570,8 @@ public ModelSearchResult search(Set taxa, r.models = new LinkedHashSet(id_model.values()); } try { - result.close(); - } catch (QueryEvaluationException e) { + ((AutoCloseable)result).close(); + } catch (Exception e) { r.message = "Query Evaluation Problem - can't close result set"; r.error = e.getMessage(); e.printStackTrace(); diff --git a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/OperationsImpl.java b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/OperationsImpl.java index 09d5b557..d8ffa21a 100644 --- a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/OperationsImpl.java +++ b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/OperationsImpl.java @@ -1,10 +1,10 @@ package org.geneontology.minerva.server.handler; -import com.github.jsonldjava.sesame.SesameJSONLDWriterFactory; import com.google.gson.Gson; import com.google.gson.JsonObject; import org.apache.commons.lang3.tuple.Pair; import org.apache.log4j.Logger; +import org.eclipse.rdf4j.rio.jsonld.JSONLDWriterFactory; import org.geneontology.minerva.CoreMolecularModelManager.DeleteInformation; import org.geneontology.minerva.ModelContainer; import org.geneontology.minerva.MolecularModelManager; @@ -25,11 +25,11 @@ import org.geneontology.rules.engine.WorkingMemory; import org.obolibrary.robot.DiffOperation; import org.obolibrary.robot.IOHelper; -import org.openrdf.query.*; -import org.openrdf.repository.RepositoryException; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFWriter; -import org.openrdf.rio.Rio; +import org.eclipse.rdf4j.query.*; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFWriter; +import org.eclipse.rdf4j.rio.Rio; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; import org.semanticweb.owlapi.model.parameters.OntologyCopy; @@ -569,7 +569,7 @@ void handleSPARQLRequest(M3Request request, M3BatchResponse response) throws IOE if (result instanceof GraphQueryResult) { //RDFWriter writer = new RDFJSONWriterFactory().getWriter(stream); ByteArrayOutputStream stream = new ByteArrayOutputStream(); - RDFWriter writer = new SesameJSONLDWriterFactory().getWriter(stream); + RDFWriter writer = new JSONLDWriterFactory().getWriter(stream); writer.handleNamespace("gomodel", "http://model.geneontology.org/"); Rio.write(QueryResults.asModel((GraphQueryResult) result), writer); String json = stream.toString("UTF-8"); diff --git a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLGraphMessageBodyWriter.java b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLGraphMessageBodyWriter.java index 083c9521..118a7ccd 100644 --- a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLGraphMessageBodyWriter.java +++ b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLGraphMessageBodyWriter.java @@ -1,11 +1,11 @@ package org.geneontology.minerva.server.handler; -import org.openrdf.query.GraphQueryResult; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.resultio.QueryResultIO; -import org.openrdf.rio.RDFFormat; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFWriterRegistry; +import org.eclipse.rdf4j.query.GraphQueryResult; +import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.resultio.QueryResultIO; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFWriterRegistry; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; @@ -17,6 +17,7 @@ import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.util.Optional; @Provider @Produces({ @@ -46,14 +47,20 @@ public long getSize(GraphQueryResult result, Class type, Type genericType, An @Override public void writeTo(GraphQueryResult result, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { - RDFFormat format = RDFWriterRegistry.getInstance().getFileFormatForMIMEType(mediaType.toString(), RDFFormat.TURTLE); + Optional format = RDFWriterRegistry.getInstance().getFileFormatForMIMEType(mediaType.toString()); try { - QueryResultIO.write(result, format, entityStream); - entityStream.flush(); - result.close(); + if (format.isPresent()) { + QueryResultIO.writeGraph(result, format.get(), entityStream); + entityStream.flush(); + } + try { + ((AutoCloseable)result).close(); + } catch (Exception e) { + throw new QueryEvaluationException(e); + } } catch (RDFHandlerException | QueryEvaluationException e) { throw new WebApplicationException(e); } - } + } diff --git a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLHandler.java b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLHandler.java index 9bf6b13b..0e10da0e 100644 --- a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLHandler.java +++ b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLHandler.java @@ -1,10 +1,10 @@ package org.geneontology.minerva.server.handler; import org.geneontology.minerva.BlazegraphMolecularModelManager; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.QueryResult; -import org.openrdf.repository.RepositoryException; +import org.eclipse.rdf4j.query.MalformedQueryException; +import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.QueryResult; +import org.eclipse.rdf4j.repository.RepositoryException; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; diff --git a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLResultsMessageBodyWriter.java b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLResultsMessageBodyWriter.java index 053714c0..0e5e0ac5 100644 --- a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLResultsMessageBodyWriter.java +++ b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/SPARQLResultsMessageBodyWriter.java @@ -1,10 +1,11 @@ package org.geneontology.minerva.server.handler; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.TupleQueryResult; -import org.openrdf.query.TupleQueryResultHandlerException; -import org.openrdf.query.resultio.QueryResultIO; -import org.openrdf.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; +import org.eclipse.rdf4j.query.resultio.QueryResultFormat; +import org.eclipse.rdf4j.query.resultio.QueryResultIO; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; @@ -16,6 +17,7 @@ import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.util.Optional; @Provider @Produces({ @@ -42,11 +44,17 @@ public long getSize(TupleQueryResult result, Class type, Type genericType, An @Override public void writeTo(TupleQueryResult result, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { - TupleQueryResultFormat format = QueryResultIO.getWriterFormatForMIMEType(mediaType.toString(), TupleQueryResultFormat.JSON); + Optional format = QueryResultIO.getWriterFormatForMIMEType(mediaType.toString()); try { - QueryResultIO.write(result, format, entityStream); - entityStream.flush(); - result.close(); + if (format.isPresent() && format.get() instanceof TupleQueryResultFormat) { + QueryResultIO.writeTuple(result, ((TupleQueryResultFormat)(format.get())), entityStream); + entityStream.flush(); + } else throw new TupleQueryResultHandlerException("No format available"); + try { + ((AutoCloseable)result).close(); + } catch (Exception e) { + throw new QueryEvaluationException(e); + } } catch (TupleQueryResultHandlerException | QueryEvaluationException e) { throw new WebApplicationException(e); } diff --git a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/TaxonHandler.java b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/TaxonHandler.java index d0d34877..6561e22c 100644 --- a/minerva-server/src/main/java/org/geneontology/minerva/server/handler/TaxonHandler.java +++ b/minerva-server/src/main/java/org/geneontology/minerva/server/handler/TaxonHandler.java @@ -2,11 +2,11 @@ import org.geneontology.minerva.BlazegraphMolecularModelManager; import org.geneontology.minerva.BlazegraphOntologyManager; -import org.openrdf.query.BindingSet; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.TupleQueryResult; -import org.openrdf.repository.RepositoryException; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.MalformedQueryException; +import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.repository.RepositoryException; import javax.ws.rs.GET; import javax.ws.rs.Path; diff --git a/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ARTHandlerTest.java b/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ARTHandlerTest.java index 772b1d16..49dfa540 100644 --- a/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ARTHandlerTest.java +++ b/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ARTHandlerTest.java @@ -41,9 +41,9 @@ import org.glassfish.jersey.servlet.ServletContainer; import org.junit.*; import org.junit.rules.TemporaryFolder; -import org.openrdf.repository.RepositoryException; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFParseException; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; diff --git a/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ModelSearchHandlerTest.java b/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ModelSearchHandlerTest.java index fd99ebcd..42752864 100644 --- a/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ModelSearchHandlerTest.java +++ b/minerva-server/src/test/java/org/geneontology/minerva/server/handler/ModelSearchHandlerTest.java @@ -37,9 +37,9 @@ import org.glassfish.jersey.servlet.ServletContainer; import org.junit.*; import org.junit.rules.TemporaryFolder; -import org.openrdf.repository.RepositoryException; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFParseException; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; diff --git a/minerva-server/src/test/java/org/geneontology/minerva/server/handler/TaxonHandlerTest.java b/minerva-server/src/test/java/org/geneontology/minerva/server/handler/TaxonHandlerTest.java index eb5e85fc..1bc8f828 100644 --- a/minerva-server/src/test/java/org/geneontology/minerva/server/handler/TaxonHandlerTest.java +++ b/minerva-server/src/test/java/org/geneontology/minerva/server/handler/TaxonHandlerTest.java @@ -29,9 +29,9 @@ import org.glassfish.jersey.servlet.ServletContainer; import org.junit.*; import org.junit.rules.TemporaryFolder; -import org.openrdf.repository.RepositoryException; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFParseException; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLOntology; diff --git a/minerva-server/src/test/java/org/geneontology/minerva/server/validation/ValidationTest.java b/minerva-server/src/test/java/org/geneontology/minerva/server/validation/ValidationTest.java index 7d7e8e9e..c86b69d5 100644 --- a/minerva-server/src/test/java/org/geneontology/minerva/server/validation/ValidationTest.java +++ b/minerva-server/src/test/java/org/geneontology/minerva/server/validation/ValidationTest.java @@ -19,9 +19,9 @@ import org.junit.ClassRule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.openrdf.repository.RepositoryException; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFParseException; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.*; diff --git a/pom.xml b/pom.xml index 3760339f..4964de82 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,7 @@ UTF-8 - 4.5.15 - 2.7.12 + 4.5.29 9.2.3.v20140905 2.29 @@ -212,89 +211,6 @@ commons-collections 3.2.2 - - com.blazegraph - bigdata-core - 2.1.4 - - - log4j - log4j - - - - - - - org.openrdf.sesame - sesame-model - ${sesame.version} - - - org.openrdf.sesame - sesame-runtime - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-api - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-languages - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-datatypes - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-binary - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-n3 - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-nquads - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-ntriples - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-rdfjson - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-rdfxml - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-trix - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-turtle - ${sesame.version} - - - org.openrdf.sesame - sesame-rio-trig - ${sesame.version} - commons-io commons-io @@ -349,10 +265,15 @@ log4j-1.2-api ${log4j.version} + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + org.obolibrary.robot robot-core - 1.7.1 + 1.9.8 log4j @@ -360,22 +281,16 @@ + + org.eclipse.rdf4j + rdf4j-bom + 5.2.2 + pom + import + - - - BBOPDeployRepository - BBOPDeployRepository - ${bbopdeployrepository} - - - BBOPSnapshotRepository - BBOPSnapshotRepository - ${bbopsnapshotrepository} - - - minerva-core minerva-json