Skip to content

Commit

Permalink
Add action to check conformance with GPAD ShEx on each change.
Browse files Browse the repository at this point in the history
  • Loading branch information
balhoff committed Jul 18, 2024
1 parent dc14000 commit c7426ed
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.engine.binding.Binding;
import org.apache.jena.sparql.engine.binding.BindingBuilder;
import org.apache.jena.sparql.engine.binding.BindingFactory;
import org.apache.jena.sparql.engine.binding.BindingMap;
import org.apache.jena.vocabulary.RDF;
import org.apache.log4j.Logger;
import org.geneontology.minerva.curie.CurieHandler;
Expand Down Expand Up @@ -288,11 +288,11 @@ private Map<Triple, Set<GPADEvidence>> evidencesForFacts(Set<Triple> facts, Mode

@SafeVarargs
private final Binding createBinding(Pair<Var, Node>... bindings) {
BindingMap map = BindingFactory.create();
BindingBuilder builder = BindingFactory.builder();
for (Pair<Var, Node> binding : bindings) {
map.add(binding.getLeft(), binding.getRight());
builder.add(binding.getLeft(), binding.getRight());
}
return map;
return builder.build();
}

private Set<AnnotationExtension> possibleExtensions(Set<BasicGPADData> basicAnnotations, Model model) {
Expand Down
5 changes: 5 additions & 0 deletions minerva-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<dependency>
<groupId>org.obolibrary.robot</groupId>
<artifactId>robot-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,20 @@
import info.aduna.iteration.Iterations;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.rdf.jena.JenaGraph;
import org.apache.commons.rdf.jena.JenaRDF;
import org.apache.jena.graph.Graph;
import org.apache.jena.shex.ShapeMap;
import org.apache.jena.shex.ShexReport;
import org.apache.jena.shex.ShexSchema;
import org.apache.jena.shex.ShexValidator;
import org.apache.jena.sys.JenaSystem;
import org.apache.log4j.Logger;
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.JenaOwlTool;
import org.geneontology.minerva.util.ReverseChangeGenerator;
import org.openrdf.model.*;
import org.openrdf.model.impl.URIImpl;
Expand All @@ -22,6 +31,7 @@
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.RepositoryResult;
import org.openrdf.rio.*;
import org.openrdf.rio.helpers.BasicWriterSettings;
import org.openrdf.rio.helpers.RDFHandlerBase;
import org.openrdf.rio.helpers.StatementCollector;
import org.semanticweb.owlapi.apibinding.OWLManager;
Expand Down Expand Up @@ -67,6 +77,7 @@ public class BlazegraphMolecularModelManager<METADATA> extends CoreMolecularMode
public BlazegraphMolecularModelManager(OWLOntology tbox, CurieHandler curieHandler, String modelIdPrefix, @Nonnull String pathToJournal, String pathToExportFolder, String pathToOntologyJournal, boolean downloadOntologyJournal)
throws OWLOntologyCreationException, IOException {
super(tbox, pathToOntologyJournal, downloadOntologyJournal);
JenaSystem.init();
if (curieHandler == null) {
LOG.error("curie handler required for blazegraph model manager startup ");
System.exit(-1);
Expand Down Expand Up @@ -195,23 +206,14 @@ public void saveModel(ModelContainer m)
final OWLOntologyManager manager = ont.getOWLOntologyManager();
List<OWLOntologyChange> changes = preSaveFileHandler(ont);
synchronized (ont) {
try {
this.writeModelToDatabase(ont, modelId);
// reset modified flag for abox after successful save
m.setAboxModified(false);
// dump stored model to export file
if (this.pathToExportFolder != null) {
File folder = new File(this.pathToExportFolder);
dumpStoredModel(modelId, folder);
}
} finally {
if (changes != null) {
List<OWLOntologyChange> invertedChanges = ReverseChangeGenerator
.invertChanges(changes);
if (invertedChanges != null && !invertedChanges.isEmpty()) {
manager.applyChanges(invertedChanges);
}
}
manager.applyChanges(changes);
this.writeModelToDatabase(ont, modelId);
// reset modified flag for abox after successful save
m.setAboxModified(false);
// dump stored model to export file
if (this.pathToExportFolder != null) {
File folder = new File(this.pathToExportFolder);
dumpStoredModel(modelId, folder);
}
}
}
Expand Down Expand Up @@ -994,4 +996,29 @@ public int addTaxonToDatabaseWithSparql(IRI model_iri, IRI taxon_iri) throws Rep
return changes;
}

public static class ShexValidatingPreSaveFileHandler implements PreFileSaveHandler {

private final ShexSchema schema;
private final ShapeMap shapeMap;
private final OWLAnnotationProperty conformanceProperty;
public ShexValidatingPreSaveFileHandler(ShexSchema schema, ShapeMap map, String propertyIRI) {
this.schema = schema;
this.shapeMap = map;
this.conformanceProperty = OWLManager.getOWLDataFactory().getOWLAnnotationProperty(IRI.create(propertyIRI));
}

@Override
public List<OWLOntologyChange> handle(OWLOntology modelOnt) throws UnknownIdentifierException {
OWLDataFactory factory = OWLManager.getOWLDataFactory();
Graph graph = JenaOwlTool.getJenaModel(modelOnt).getGraph();
ShexReport report = ShexValidator.get().validate(graph, schema, shapeMap);
boolean conforms = report.conforms();
System.out.println("CONFORMS? " + conforms);
System.out.println(factory.getOWLAnnotation(conformanceProperty, factory.getOWLLiteral(conforms)));
OWLOntologyChange remove = new RemoveOntologyAnnotation(modelOnt, factory.getOWLAnnotation(conformanceProperty, factory.getOWLLiteral(!conforms)));
OWLOntologyChange add = new AddOntologyAnnotation(modelOnt, factory.getOWLAnnotation(conformanceProperty, factory.getOWLLiteral(conforms)));
return Arrays.asList(remove, add);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package org.geneontology.minerva.server;

import org.apache.jena.shex.ShapeMap;
import org.apache.jena.shex.ShexSchema;
import org.apache.jena.shex.parser.ShExC;
import org.apache.log4j.Logger;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.geneontology.minerva.BlazegraphMolecularModelManager;
import org.geneontology.minerva.MinervaOWLGraphWrapper;
import org.geneontology.minerva.ModelReaderHelper;
import org.geneontology.minerva.UndoAwareMolecularModelManager;
Expand Down Expand Up @@ -93,6 +97,10 @@ public static class MinervaStartUpConfig {
public MinervaShexValidator shex;
public String pathToOntologyJournal;

public String pathToGPADSheX;

public String pathToGPADShapeMap;

}

public static void main(String[] args) throws Exception {
Expand Down Expand Up @@ -172,6 +180,10 @@ else if (opts.nextEq("--golr-labels")) {
conf.sparqlEndpointTimeout = Integer.parseInt(opts.nextOpt());
} else if (opts.nextEq("--ontojournal")) {
conf.pathToOntologyJournal = opts.nextOpt();
} else if (opts.nextEq("--gpad-shex")) {
conf.pathToGPADSheX = opts.nextOpt();
} else if (opts.nextEq("--gpad-shape-map")) {
conf.pathToGPADShapeMap = opts.nextOpt();
} else {
break;
}
Expand Down Expand Up @@ -340,6 +352,11 @@ public static Server startUp(final MinervaStartUpConfig conf)
conf.curieHandler, conf.modelIdPrefix, conf.journalFile, conf.exportFolder, conf.pathToOntologyJournal, true);
// set pre and post file handlers
models.addPostLoadOntologyFilter(ModelReaderHelper.INSTANCE);
if (conf.pathToGPADSheX != null && conf.pathToGPADShapeMap != null) {
ShexSchema schema = ShExC.parse(conf.pathToGPADSheX);
ShapeMap shapeMap = ShExC.parseShapeMap(conf.pathToGPADShapeMap);
models.addPreFileSaveHandler(new BlazegraphMolecularModelManager.ShexValidatingPreSaveFileHandler(schema, shapeMap, "http://geneontology.org/lego/conforms_to_gpad"));
}
// conf.shex.tbox_reasoner = models.getTbox_reasoner();
conf.shex.setGo_lego_repo(models.getGolego_repo());
conf.shex.curieHandler = conf.curieHandler;
Expand Down
27 changes: 26 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<version>3.12.0</version>
<version>4.9.0</version>
<type>pom</type>
</dependency>
<dependency>
Expand All @@ -344,6 +344,7 @@
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
Expand All @@ -358,6 +359,30 @@
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.jena</groupId>
<artifactId>jena-arq</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.jena</groupId>
<artifactId>jena-base</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.jena</groupId>
<artifactId>jena-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.jena</groupId>
<artifactId>jena-iri</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.jena</groupId>
<artifactId>jena-shaded-guava</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.jena</groupId>
<artifactId>jena-tdb</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Expand Down

0 comments on commit c7426ed

Please sign in to comment.