
de.uni_stuttgart.vis.vowl.owl2vowl.converter.AbstractConverter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of OWL2VOWL Show documentation
Show all versions of OWL2VOWL Show documentation
Owl2Vowl is an ontology converter used to convert the given ontology to a json
format that is used in the WebVOWL visualization. See
https://github.com/VisualDataWeb/WebVOWL or http://vowl.visualdataweb.org/.
The newest version!
package de.uni_stuttgart.vis.vowl.owl2vowl.converter;
import de.uni_stuttgart.vis.vowl.owl2vowl.export.types.Exporter;
import de.uni_stuttgart.vis.vowl.owl2vowl.export.types.JsonGenerator;
import de.uni_stuttgart.vis.vowl.owl2vowl.model.data.VowlData;
import de.uni_stuttgart.vis.vowl.owl2vowl.model.entities.AbstractEntity;
import de.uni_stuttgart.vis.vowl.owl2vowl.model.ontology.OntologyMetric;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.owlapi.EntityCreationVisitor;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.owlapi.IndividualsVisitor;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.*;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.classes.GenericClassAxiomVisitor;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.classes.HasKeyAxiomParser;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.classes.OwlClassAxiomVisitor;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.property.DataPropertyVisitor;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.property.DomainRangeFiller;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.property.ObjectPropertyVisitor;
import de.uni_stuttgart.vis.vowl.owl2vowl.parser.vowl.property.VowlSubclassPropertyGenerator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.semanticweb.owlapi.model.*;
import org.semanticweb.owlapi.model.parameters.Imports;
import org.semanticweb.owlapi.search.EntitySearcher;
import org.semanticweb.owlapi.util.OWLOntologyWalker;
import java.util.Collection;
/**
* Abstract converter which processes the most part of the converting.
* The sub classes can specify the source of the ontology or to some additional processing if necessary.
*/
public abstract class AbstractConverter implements Converter {
private static final Logger logger = LogManager.getLogger(AbstractConverter.class);
protected final JsonGenerator jsonGenerator = new JsonGenerator();
protected String loadedOntologyPath;
protected OWLOntologyManager manager;
protected VowlData vowlData;
protected OWLOntology ontology;
protected boolean initialized = false;
private void preLoadOntology() {
try {
loadOntology();
} catch (OWLOntologyCreationException e) {
throw new RuntimeException(e);
}
initialized = true;
}
protected abstract void loadOntology() throws OWLOntologyCreationException;
private void preParsing(OWLOntology ontology, VowlData vowlData, OWLOntologyManager manager) {
OWLOntologyWalker walker = new OWLOntologyWalker(ontology.getImportsClosure());
EntityCreationVisitor ecv = new EntityCreationVisitor(vowlData);
try {
walker.walkStructure(ecv);
} catch (Exception e) {
System.out.println("@WORKAROUND WalkSturcture Failed!");
System.out.println("Exception: " + e);
System.out.println("Exit without export result, Sorry!");
System.exit(-1);
}
new OntologyInformationParser(vowlData, ontology).execute();
}
private void parsing(OWLOntology ontology, VowlData vowlData, OWLOntologyManager manager) {
processClasses(ontology, vowlData);
processObjectProperties(ontology, vowlData);
processDataProperties(ontology, vowlData);
processIndividuals(ontology, vowlData, manager);
processGenericAxioms();
}
private void processIndividuals(OWLOntology ontology, VowlData vowlData, OWLOntologyManager manager) {
// TODO check all classes
ontology.getClassesInSignature(Imports.INCLUDED).forEach(owlClass -> {
for (OWLOntology owlOntology : manager.getOntologies()) {
EntitySearcher.getIndividuals(owlClass, owlOntology).forEach(owlIndividual -> owlIndividual.accept(new IndividualsVisitor(vowlData,
owlIndividual, owlClass, manager)));
}
});
}
private void processObjectProperties(OWLOntology ontology, VowlData vowlData) {
for (OWLObjectProperty owlObjectProperty : ontology.getObjectPropertiesInSignature(Imports.INCLUDED)) {
for (OWLObjectPropertyAxiom owlObjectPropertyAxiom : ontology.getAxioms(owlObjectProperty, Imports.INCLUDED)) {
try {
owlObjectPropertyAxiom.accept(new ObjectPropertyVisitor(vowlData, owlObjectProperty));
} catch (Exception e){
System.out.println(" @WORKAROUND: Failed to accept property with HAS_VALUE OR SubObjectPropertyOf ... SKIPPING THIS" );
System.out.println(" propertyName: "+owlObjectProperty);
System.out.println(" propertyAxiom: "+owlObjectPropertyAxiom);
continue;
}
}
}
}
private void processDataProperties(OWLOntology ontology, VowlData vowlData) {
for (OWLDataProperty property : ontology.getDataPropertiesInSignature(Imports.INCLUDED)) {
for (OWLDataPropertyAxiom propertyAxiom : ontology.getAxioms(property, Imports.INCLUDED)) {
propertyAxiom.accept(new DataPropertyVisitor(vowlData, property));
}
}
}
private void createSubclassProperties(VowlData vowlData) {
new VowlSubclassPropertyGenerator(vowlData).execute();
}
private void fillDomainRanges(VowlData vowlData) {
new DomainRangeFiller(vowlData, vowlData.getProperties()).execute();
}
private void processClasses(OWLOntology ontology, VowlData vowlData) {
for (OWLClass owlClass : ontology.getClassesInSignature(Imports.INCLUDED)) {
for (OWLClassAxiom owlClassAxiom : ontology.getAxioms(owlClass, Imports.INCLUDED)) {
owlClassAxiom.accept(new OwlClassAxiomVisitor(vowlData, owlClass));
}
HasKeyAxiomParser.parse(ontology, owlClass, vowlData);
}
}
private void processGenericAxioms() {
ontology.getGeneralClassAxioms().forEach(owlClassAxiom -> owlClassAxiom.accept(new GenericClassAxiomVisitor(vowlData)));
}
private void parseAnnotations(VowlData vowlData, OWLOntologyManager manager) {
AnnotationParser annotationParser = new AnnotationParser(vowlData, manager);
annotationParser.parse();
}
private void setCorrectType(Collection entities) {
for (AbstractEntity entity : entities) {
entity.accept(new TypeSetter());
}
}
private void postParsing(OWLOntology loadedOntology, VowlData vowlData, OWLOntologyManager manager) {
setCorrectType(vowlData.getEntityMap().values());
parseAnnotations(vowlData, manager);
fillDomainRanges(vowlData);
createSubclassProperties(vowlData);
new ImportedChecker(vowlData, manager, loadedOntology, loadedOntologyPath).execute();
vowlData.getEntityMap().values().forEach(entity -> entity.accept(new EquivalentSorter(ontology.getOntologyID().getOntologyIRI().orElse(IRI
.create(loadedOntologyPath)), vowlData)));
new BaseIriCollector(vowlData).execute();
}
/**
* Executes the complete conversion to the webvowl compatible json format.
* Normally is only called ones during export. But if a new conversion is required just call this method before exporting.
*
* The parsing is separated in three steps: The pre parsing -> normal parsing -> post parsing.
* This is necessary because we can access some properties of the entities only if we have the corresponding entity.
* For this example the pre parsing can be used to retrieve all entities without any additional special components.
* After that we can access the more special properties of the entity with helper classes like {@link EntitySearcher}.
*
*/
public void convert() {
if (!initialized) {
preLoadOntology();
}
vowlData = new VowlData();
vowlData.setOwlManager(manager);
// TODO Probably the parsing could be automatized via class annotation and annotation parsing.
// e.q. @PreParsing, @Parsing, @PostParsing just as an idea for improvement
preParsing(ontology, vowlData, manager);
parsing(ontology, vowlData, manager);
postParsing(ontology, vowlData, manager);
processMetrics();
}
private void processMetrics() {
OntologyMetric metrics = new OntologyMetric(ontology);
metrics.calculate(vowlData);
vowlData.setMetrics(metrics);
}
/**
* Exports the generated data according to the implemented {@link Exporter}.
*
* @param exporter The exporter.
* @throws Exception Any exception during json generation.
*/
public void export(Exporter exporter) throws Exception {
if (vowlData == null) {
convert();
}
jsonGenerator.execute(vowlData);
jsonGenerator.export(exporter);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy