Skip to content

Commit 31977e9

Browse files
committed
ont-api: minor changes in axiom searchers and InternalModel (related to #reduce() and list* #methods) + add tests for OWLOntology#subClassAxiomsForSuperClass (#12)
1 parent 5cc4249 commit 31977e9

File tree

5 files changed

+69
-23
lines changed

5 files changed

+69
-23
lines changed

src/main/java/com/github/owlcs/ontapi/OntBaseModelImpl.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public <T extends OWLAxiom> Stream<T> axioms(AxiomType<T> axiomType) {
369369
*/
370370
@Override
371371
public Stream<OWLClassAxiom> axioms(OWLClass clazz) {
372-
Stream<? extends OWLClassAxiom> subClassOf = base.listOWLSubClassOfAxioms(clazz);
372+
Stream<? extends OWLClassAxiom> subClassOf = base.listOWLSubClassOfAxiomsBySubject(clazz);
373373
Stream<? extends OWLClassAxiom> disjointUnion = base.listOWLAxioms(OWLDisjointUnionAxiom.class)
374374
.filter(a -> Objects.equals(a.getOWLClass(), clazz));
375375
Stream<? extends OWLClassAxiom> disjoint = base.listOWLAxioms(OWLDisjointClassesAxiom.class)
@@ -588,7 +588,7 @@ public <A extends OWLAxiom> Stream<A> axioms(Class<A> type, OWLObject object, bo
588588
if (OWLSubClassOfAxiom.class.equals(type) && object instanceof OWLClassExpression) {
589589
OWLClassExpression c = (OWLClassExpression) object;
590590
if (c.isOWLClass() && sub) {
591-
return (Stream<A>) base.listOWLSubClassOfAxioms(c.asOWLClass());
591+
return (Stream<A>) base.listOWLSubClassOfAxiomsBySubject(c.asOWLClass());
592592
}
593593
return (Stream<A>) base.listOWLAxioms(OWLSubClassOfAxiom.class)
594594
.filter(a -> c.equals(sub ? a.getSubClass() : a.getSuperClass()));

src/main/java/com/github/owlcs/ontapi/internal/BaseSearcher.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ protected final ExtendedIterator<OntStatement> listStatements(OntModel model) {
153153
return listStatements(model, null, null, null);
154154
}
155155

156-
private ExtendedIterator<OntStatement> listStatements(OntModel model, Resource s, Property p, RDFNode o) {
156+
protected final ExtendedIterator<OntStatement> listStatements(OntModel model, Resource s, Property p, RDFNode o) {
157157
return OntModels.listLocalStatements(model, s, p, o);
158158
}
159159
}

src/main/java/com/github/owlcs/ontapi/internal/InternalModel.java

+38-15
Original file line numberDiff line numberDiff line change
@@ -653,17 +653,16 @@ public Stream<OWLDeclarationAxiom> listOWLDeclarationAxioms(OWLEntity e) {
653653
* with the given {@link OWLAnnotationSubject subject}.
654654
* Note: method returns non-cached axioms.
655655
*
656-
* @param s {@link OWLAnnotationSubject}, not {@code null}
656+
* @param subject {@link OWLAnnotationSubject}, not {@code null}
657657
* @return {@code Stream} of {@link OWLAnnotationAssertionAxiom}s
658658
*/
659-
public Stream<OWLAnnotationAssertionAxiom> listOWLAnnotationAssertionAxioms(OWLAnnotationSubject s) {
659+
public Stream<OWLAnnotationAssertionAxiom> listOWLAnnotationAssertionAxioms(OWLAnnotationSubject subject) {
660660
InternalConfig config = getConfig();
661661
if (!config.isLoadAnnotationAxioms()) return Stream.empty();
662662
if (!useAxiomsSearchOptimization(config)) {
663-
return listOWLAxioms(OWLAnnotationAssertionAxiom.class).filter(a -> s.equals(a.getSubject()));
663+
return listOWLAxioms(OWLAnnotationAssertionAxiom.class).filter(a -> subject.equals(a.getSubject()));
664664
}
665-
return reduce(Iter.asStream(annotationAssertionsBySubject.listONTAxioms(s, getSearchModel(), getObjectFactory(), config)
666-
.mapWith(ONTObject::getOWLObject)));
665+
return listOWLAxioms(annotationAssertionsBySubject, subject, config);
667666
}
668667

669668
/**
@@ -673,30 +672,35 @@ public Stream<OWLAnnotationAssertionAxiom> listOWLAnnotationAssertionAxioms(OWLA
673672
* @param sub {@link OWLClass}, not {@code null}
674673
* @return {@code Stream} of {@link OWLSubClassOfAxiom}s
675674
*/
676-
public Stream<OWLSubClassOfAxiom> listOWLSubClassOfAxioms(OWLClass sub) {
675+
public Stream<OWLSubClassOfAxiom> listOWLSubClassOfAxiomsBySubject(OWLClass sub) {
677676
InternalConfig config = getConfig();
678677
if (!useAxiomsSearchOptimization(config)) {
679678
return listOWLAxioms(OWLSubClassOfAxiom.class).filter(a -> Objects.equals(a.getSubClass(), sub));
680679
}
681-
return reduce(Iter.asStream(subClassOfBySubject.listONTAxioms(sub, getSearchModel(), getObjectFactory(), config)
682-
.mapWith(ONTObject::getOWLObject)));
680+
return listOWLAxioms(subClassOfBySubject, sub, config);
683681
}
684682

685683
/**
686684
* Lists {@link OWLEquivalentClassesAxiom EquivalentClasses Axiom}s by the given {@link OWLClass class}-component.
687685
* Note: method returns non-cached axioms.
688686
*
689-
* @param c {@link OWLClass}, not {@code null}
687+
* @param clazz {@link OWLClass}, not {@code null}
690688
* @return {@code Stream} of {@link OWLEquivalentClassesAxiom}s
691689
* @see AbstractNaryTranslator#axioms(OntModel)
692690
*/
693-
public Stream<OWLEquivalentClassesAxiom> listOWLEquivalentClassesAxioms(OWLClass c) {
691+
public Stream<OWLEquivalentClassesAxiom> listOWLEquivalentClassesAxioms(OWLClass clazz) {
694692
InternalConfig config = getConfig();
695693
if (!useAxiomsSearchOptimization(config)) {
696-
return listOWLAxioms(OWLEquivalentClassesAxiom.class).filter(a -> a.operands().anyMatch(c::equals));
694+
return listOWLAxioms(OWLEquivalentClassesAxiom.class).filter(a -> a.operands().anyMatch(clazz::equals));
697695
}
698-
return reduce(Iter.asStream(equivalentClassesByOperand.listONTAxioms(c, getSearchModel(), getObjectFactory(), config)
699-
.mapWith(ONTObject::getOWLObject)));
696+
return listOWLAxioms(equivalentClassesByOperand, clazz, config);
697+
}
698+
699+
protected <A extends OWLAxiom, K extends OWLObject> Stream<A> listOWLAxioms(ByObjectSearcher<A, K> searcher,
700+
K parameter,
701+
InternalConfig config) {
702+
return reduce(searcher.listONTAxioms(parameter, getSearchModel(), getObjectFactory(), config)
703+
.mapWith(ONTObject::getOWLObject));
700704
}
701705

702706
/**
@@ -733,7 +737,7 @@ public Stream<OWLAxiom> listOWLAxioms(OWLPrimitive primitive) {
733737
} else {
734738
throw new OntApiException.IllegalArgument("Wrong type: " + filter);
735739
}
736-
return reduce(Iter.asStream(res.mapWith(ONTObject::getOWLObject)));
740+
return reduce(res.mapWith(ONTObject::getOWLObject));
737741
}
738742
// the default way:
739743
if (OWLTopObjectType.ANNOTATION.hasComponent(filter)) {
@@ -922,7 +926,26 @@ protected <R> Stream<R> reduce(Stream<R> stream) {
922926
// Uniqueness is guaranteed by other mechanisms.
923927
// 1024 is a magic approximate number of axioms/objects; it is not tested yet.
924928
ArrayList<R> res = new ArrayList<>(1024);
925-
stream.collect(Collectors.toCollection(() -> res));
929+
stream.forEach(res::add);
930+
res.trimToSize();
931+
return res.stream();
932+
}
933+
934+
/**
935+
* Performs a final operation over the specified {@code stream} before releasing it out.
936+
*
937+
* @param stream {@code ExtendedIterator} of {@link R}s
938+
* @param <R> anything
939+
* @return {@code Stream} of {@link R}s
940+
* @see #reduce(Stream)
941+
*/
942+
protected <R> Stream<R> reduce(ExtendedIterator<R> stream) {
943+
InternalConfig conf = getConfig();
944+
if (!conf.parallel() || !conf.useContentCache()) {
945+
return Iter.asStream(stream);
946+
}
947+
ArrayList<R> res = new ArrayList<>(1024);
948+
stream.forEachRemaining(res::add);
926949
res.trimToSize();
927950
return res.stream();
928951
}

src/main/java/com/github/owlcs/ontapi/internal/searchers/axioms/DeclarationByEntity.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import com.github.owlcs.ontapi.jena.model.OntStatement;
2727
import com.github.owlcs.ontapi.jena.utils.Iter;
2828
import com.github.owlcs.ontapi.jena.vocabulary.RDF;
29-
import org.apache.jena.graph.Node;
29+
import org.apache.jena.rdf.model.Resource;
3030
import org.apache.jena.util.iterator.ExtendedIterator;
3131
import org.semanticweb.owlapi.model.OWLDeclarationAxiom;
3232
import org.semanticweb.owlapi.model.OWLEntity;
@@ -42,11 +42,12 @@ public ExtendedIterator<ONTObject<OWLDeclarationAxiom>> listONTAxioms(OWLEntity
4242
OntModel model,
4343
ONTObjectFactory factory,
4444
AxiomsSettings config) {
45-
Node node = WriteHelper.toNode(entity);
46-
if (!model.independent() && !model.getBaseGraph().contains(node, RDF.type.asNode(), WriteHelper.getRDFType(entity).asNode())) {
47-
return Iter.of();
45+
Resource subject = WriteHelper.toResource(entity.getIRI());
46+
if (!model.independent()) {
47+
return listStatements(model, subject, RDF.type, WriteHelper.getRDFType(entity))
48+
.mapWith(x -> toAxiom(TRANSLATOR, x, factory, config));
4849
}
49-
OntEntity res = PersonalityModel.asPersonalityModel(model).findNodeAs(node, WriteHelper.getEntityType(entity));
50+
OntEntity res = PersonalityModel.asPersonalityModel(model).findNodeAs(subject.asNode(), WriteHelper.getEntityType(entity));
5051
if (res == null) return Iter.of();
5152
OntStatement statement = res.getMainStatement();
5253
return statement == null ? Iter.of() : Iter.of(toAxiom(TRANSLATOR, statement, factory, config));

src/test/java/com/github/owlcs/ontapi/tests/model/SearchByObjectTest.java

+22
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ public void testSubClassAxiomsForSubClass() {
7171
data.doTest(T.SUB_CLASS_OF_BY_SUBJECT, HasClassesInSignature::classesInSignature);
7272
}
7373

74+
@Test
75+
public void testSubClassAxiomsForSuperClass() {
76+
data.doTest(T.SUB_CLASS_OF_BY_OBJECT, HasClassesInSignature::classesInSignature);
77+
}
78+
7479
@Test
7580
public void testEquivalentClassesAxioms() {
7681
data.doTest(T.EQUIVALENT_CLASS_BY_OPERAND, HasClassesInSignature::classesInSignature);
@@ -81,66 +86,77 @@ enum TestData {
8186
T.DECLARATIONS.of(-5190508530L),
8287
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(5847447319L),
8388
T.SUB_CLASS_OF_BY_SUBJECT.of(23994790843L),
89+
T.SUB_CLASS_OF_BY_OBJECT.of(15875097811L),
8490
T.EQUIVALENT_CLASS_BY_OPERAND.of(743207879L)
8591
),
8692
FAMILY(ModelData.FAMILY,
8793
T.DECLARATIONS.of(34226271096L),
8894
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(375920279L),
8995
T.SUB_CLASS_OF_BY_SUBJECT.of(-405443220L),
96+
T.SUB_CLASS_OF_BY_OBJECT.of(30468706L),
9097
T.EQUIVALENT_CLASS_BY_OPERAND.of(1149278276L)
9198
),
9299
PEOPLE(ModelData.PEOPLE,
93100
T.DECLARATIONS.of(-31040926516L),
94101
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(14660248630L),
95102
T.SUB_CLASS_OF_BY_SUBJECT.of(-6044474129L),
103+
T.SUB_CLASS_OF_BY_OBJECT.of(-8307389053L),
96104
T.EQUIVALENT_CLASS_BY_OPERAND.of(229986282L)
97105
),
98106
CAMERA(ModelData.CAMERA,
99107
T.DECLARATIONS.of(2967944221L),
100108
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(),
101109
T.SUB_CLASS_OF_BY_SUBJECT.of(3537056616L),
110+
T.SUB_CLASS_OF_BY_OBJECT.of(5364459487L),
102111
T.EQUIVALENT_CLASS_BY_OPERAND.of(2619197590L)
103112
),
104113
KOALA(ModelData.KOALA,
105114
T.DECLARATIONS.of(6488467972L),
106115
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(2255627747L),
107116
T.SUB_CLASS_OF_BY_SUBJECT.of(-4740693142L),
117+
T.SUB_CLASS_OF_BY_OBJECT.of(-6410317539L),
108118
T.EQUIVALENT_CLASS_BY_OPERAND.of(1433290824L)
109119
),
110120
TRAVEL(ModelData.TRAVEL,
111121
T.DECLARATIONS.of(-25825023334L),
112122
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(-3973926788L),
113123
T.SUB_CLASS_OF_BY_SUBJECT.of(3792566851L),
124+
T.SUB_CLASS_OF_BY_OBJECT.of(1596226755L),
114125
T.EQUIVALENT_CLASS_BY_OPERAND.of(-1797460855L)
115126
),
116127
WINE(ModelData.WINE,
117128
T.DECLARATIONS.of(20065711780L),
118129
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(1282021579L),
119130
T.SUB_CLASS_OF_BY_SUBJECT.of(23989074593L),
131+
T.SUB_CLASS_OF_BY_OBJECT.of(-2872929990L),
120132
T.EQUIVALENT_CLASS_BY_OPERAND.of(15637987080L)
121133
),
122134
FOOD(ModelData.FOOD,
123135
T.DECLARATIONS.of(6794851452L),
124136
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(),
125137
T.SUB_CLASS_OF_BY_SUBJECT.of(-2766054837L),
138+
T.SUB_CLASS_OF_BY_OBJECT.of(-490371437L),
126139
T.EQUIVALENT_CLASS_BY_OPERAND.of(16744408703L)
127140
),
128141
NCBITAXON_CUT(ModelData.NCBITAXON_CUT,
129142
T.DECLARATIONS.of(244310200631L),
130143
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(120569949408L),
131144
T.SUB_CLASS_OF_BY_SUBJECT.of(-1220817325L),
145+
T.SUB_CLASS_OF_BY_OBJECT.of(-1220817325L),
132146
T.EQUIVALENT_CLASS_BY_OPERAND.of()
133147
),
134148
HP_CUT(ModelData.HP_CUT,
135149
T.DECLARATIONS.of(-14640456193L),
136150
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(2061724906L),
137151
T.SUB_CLASS_OF_BY_SUBJECT.of(-2245851740L),
152+
T.SUB_CLASS_OF_BY_OBJECT.of(-2245851740L),
138153
T.EQUIVALENT_CLASS_BY_OPERAND.of(-1475922263L)
139154
),
140155
FAMILY_PEOPLE_UNION(ModelData.FAMILY_PEOPLE_UNION,
141156
T.DECLARATIONS.of(-637777500L),
142157
T.ANNOTATION_ASSERTIONS_BY_SUBJECT.of(-311728567L),
143158
T.SUB_CLASS_OF_BY_SUBJECT.of(-730374961L),
159+
T.SUB_CLASS_OF_BY_OBJECT.of(-730374961L),
144160
T.EQUIVALENT_CLASS_BY_OPERAND.of(1108552553L)
145161
),
146162
;
@@ -187,6 +203,12 @@ Stream<? extends OWLObject> listAxioms(OWLOntology ont, OWLObject param) {
187203
return ont.subClassAxiomsForSubClass((OWLClass) param);
188204
}
189205
},
206+
SUB_CLASS_OF_BY_OBJECT {
207+
@Override
208+
Stream<? extends OWLObject> listAxioms(OWLOntology ont, OWLObject param) {
209+
return ont.subClassAxiomsForSuperClass((OWLClass) param);
210+
}
211+
},
190212
EQUIVALENT_CLASS_BY_OPERAND {
191213
@Override
192214
Stream<? extends OWLObject> listAxioms(OWLOntology ont, OWLObject param) {

0 commit comments

Comments
 (0)