Skip to content

Commit

Permalink
[Enhancement #209] Refactor OWLAPI lists to support data property val…
Browse files Browse the repository at this point in the history
…ues for referenced lists.
  • Loading branch information
ledsoft committed Nov 27, 2023
1 parent 9e738a5 commit 08d83dc
Show file tree
Hide file tree
Showing 18 changed files with 696 additions and 506 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public OWLAxiom toOwlObjectPropertyAssertionAxiom(Axiom<?> axiom) {
objectValue);
}

OWLAxiom toOwlDataPropertyAssertionAxiom(Axiom<?> axiom) {
public OWLAxiom toOwlDataPropertyAssertionAxiom(Axiom<?> axiom) {
final OWLDataProperty dataProperty = dataFactory
.getOWLDataProperty(IRI.create(axiom.getAssertion().getIdentifier()));
final OWLLiteral dataValue = OwlapiUtils.createOWLLiteralFromValue(axiom.getValue().getValue(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,13 @@

import cz.cvut.kbss.ontodriver.descriptor.AxiomDescriptor;
import cz.cvut.kbss.ontodriver.descriptor.AxiomValueDescriptor;
import cz.cvut.kbss.ontodriver.descriptor.ReferencedListDescriptor;
import cz.cvut.kbss.ontodriver.descriptor.ReferencedListValueDescriptor;
import cz.cvut.kbss.ontodriver.descriptor.SimpleListDescriptor;
import cz.cvut.kbss.ontodriver.descriptor.SimpleListValueDescriptor;
import cz.cvut.kbss.ontodriver.model.Axiom;
import cz.cvut.kbss.ontodriver.owlapi.change.TransactionalChange;
import cz.cvut.kbss.ontodriver.owlapi.connector.Connector;
import cz.cvut.kbss.ontodriver.owlapi.connector.OntologySnapshot;
import cz.cvut.kbss.ontodriver.owlapi.exception.OwlapiDriverException;
import cz.cvut.kbss.ontodriver.owlapi.list.ListHandler;
import cz.cvut.kbss.ontodriver.owlapi.list.ReferencedListHandler;
import cz.cvut.kbss.ontodriver.owlapi.list.SimpleListHandler;
import cz.cvut.kbss.ontodriver.owlapi.query.OwlapiPreparedStatement;
import cz.cvut.kbss.ontodriver.owlapi.query.OwlapiStatement;
import cz.cvut.kbss.ontodriver.owlapi.query.StatementExecutorFactory;
Expand Down Expand Up @@ -215,14 +212,14 @@ public void addTransactionalChanges(Collection<TransactionalChange> changes) {
pendingChanges.addAll(changes);
}

public ListHandler<SimpleListDescriptor, SimpleListValueDescriptor> getSimpleListHandler() {
public SimpleListHandler getSimpleListHandler() {
startTransactionIfNotActive();
return ListHandler.getSimpleListHandler(this, ontologySnapshot);
return new SimpleListHandler(this, ontologySnapshot);
}

public ListHandler<ReferencedListDescriptor, ReferencedListValueDescriptor> getReferencedListHandler() {
public ReferencedListHandler getReferencedListHandler() {
startTransactionIfNotActive();
return ListHandler.getReferencedListHandler(this, ontologySnapshot);
return new ReferencedListHandler(this, ontologySnapshot);
}

public OwlapiStatement createStatement(OwlapiConnection connection) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@
import cz.cvut.kbss.ontodriver.owlapi.exception.ReasonerNotAvailableException;
import cz.cvut.kbss.ontodriver.owlapi.util.OwlapiUtils;
import org.semanticweb.owlapi.model.OWLIndividual;
import org.semanticweb.owlapi.model.OWLLiteral;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObject;
import org.semanticweb.owlapi.reasoner.OWLReasoner;

import java.util.Collection;
Expand All @@ -34,7 +36,7 @@
import java.util.NoSuchElementException;
import java.util.stream.Collectors;

class InferredReferencedListIterator extends ReferencedListIterator {
class InferredReferencedListIterator<T> extends ReferencedListIterator<T> {

private OWLNamedIndividual currentNode;
private final OWLReasoner reasoner;
Expand Down Expand Up @@ -69,20 +71,28 @@ void doStep() {
checkMaxSuccessors(currentNextNodeProperty, nextNodes);
this.currentNextNodeProperty = hasNextProperty;
this.currentNode = nextNodes.iterator().next();
this.nextItem = reasoner.getObjectPropertyValues(currentNode, hasContentProperty).entities()
.collect(Collectors.toSet());
this.nextItem = hasContentProperty.isOWLObjectProperty() ? reasoner.getObjectPropertyValues(currentNode, hasContentProperty.asOWLObjectProperty())
.entities()
.collect(Collectors.toSet())
: reasoner.getDataPropertyValues(currentNode, hasContentProperty.asOWLDataProperty());
}

@Override
NamedResource nextValue() {
T nextValue() {
if (!hasNext()) {
throw new NoSuchElementException("There are no more elements.");
}
checkMaxSuccessors(hasContentProperty, nextItem);
final OWLIndividual value = nextItem.iterator().next();
checkIsNamed(value);
final OWLObject value = nextItem.iterator().next();
doStep();
return NamedResource.create(value.asOWLNamedIndividual().getIRI().toURI());
if (value.isIndividual()) {
final OWLIndividual individual = (OWLIndividual) value;
checkIsNamed(individual);
return (T) NamedResource.create(individual.asOWLNamedIndividual().getIRI().toURI());
} else {
final OWLLiteral literal = (OWLLiteral) value;
return (T) OwlapiUtils.owlLiteralToValue(literal);
}
}

@Override
Expand All @@ -91,7 +101,7 @@ List<TransactionalChange> removeWithoutReconnect() {
}

@Override
List<TransactionalChange> replaceNode(NamedResource newValue) {
List<TransactionalChange> replaceNode(T newValue) {
throw new UnsupportedOperationException();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,19 @@
import cz.cvut.kbss.ontodriver.model.NamedResource;
import cz.cvut.kbss.ontodriver.owlapi.change.TransactionalChange;
import org.semanticweb.owlapi.model.OWLIndividual;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLObject;
import org.semanticweb.owlapi.model.OWLProperty;

import java.util.Collection;
import java.util.List;

abstract class OwlapiListIterator {
abstract class OwlapiListIterator<T> {

abstract boolean hasNext();

abstract Axiom<NamedResource> next();
abstract Axiom<T> next();

abstract NamedResource nextValue();
abstract T nextValue();

/**
* Gets the current list node.
Expand Down Expand Up @@ -64,9 +65,9 @@ abstract class OwlapiListIterator {
* @param newValue The new value to use
* @return List of changes to apply
*/
abstract List<TransactionalChange> replaceNode(NamedResource newValue);
abstract List<TransactionalChange> replaceNode(T newValue);

static void checkMaxSuccessors(OWLObjectProperty property, Collection<? extends OWLIndividual> successors) {
static void checkMaxSuccessors(OWLProperty property, Collection<? extends OWLObject> successors) {
if (successors.size() > 1) {
throw new IntegrityConstraintViolatedException(
"Invalid number of successors. Expected only 1 value of property " + property + ", but got " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,14 @@ public List<Axiom<NamedResource>> loadReferencedList(ReferencedListDescriptor de
}

@Override
public void persistReferencedList(ReferencedListValueDescriptor descriptor) throws OntoDriverException {
public <V> void persistReferencedList(ReferencedListValueDescriptor<V> descriptor) throws OntoDriverException {
ensureStateAndArgumentValid(descriptor);
adapter.getReferencedListHandler().persistList(descriptor);
afterChangeCallback.execute();
}

@Override
public void updateReferencedList(ReferencedListValueDescriptor descriptor) throws OntoDriverException {
public <V> void updateReferencedList(ReferencedListValueDescriptor<V> descriptor) throws OntoDriverException {
ensureStateAndArgumentValid(descriptor);
adapter.getReferencedListHandler().updateList(descriptor);
afterChangeCallback.execute();
Expand Down
Loading

0 comments on commit 08d83dc

Please sign in to comment.