Skip to content

Commit d983932

Browse files
committed
ont-api: add OWLOntology#objectPropertyDomainAxioms(OWLObjectExpression) optimization (issue #12) + tests
1 parent 433d5b0 commit d983932

File tree

5 files changed

+96
-13
lines changed

5 files changed

+96
-13
lines changed

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

+11
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ public class InternalModel extends OntGraphModelImpl
164164
= new ObjectAssertionBySubject();
165165
protected final ByObjectSearcher<OWLObjectPropertyRangeAxiom, OWLObjectPropertyExpression> objectPropertyRangeByProperty
166166
= new ObjectPropertyRangeBySubject();
167+
protected final ByObjectSearcher<OWLObjectPropertyDomainAxiom, OWLObjectPropertyExpression> objectPropertyDomainByProperty
168+
= new ObjectPropertyDomainBySubject();
167169
protected final ByObjectSearcher<OWLSubClassOfAxiom, OWLClass> subClassOfBySubject = new SubClassOfBySubject();
168170
protected final ByObjectSearcher<OWLSubClassOfAxiom, OWLClass> subClassOfByObject = new SubClassOfByObject();
169171
protected final ByObjectSearcher<OWLEquivalentClassesAxiom, OWLClass> equivalentClassesByClass
@@ -690,6 +692,15 @@ public Stream<OWLObjectPropertyRangeAxiom> listOWLObjectPropertyRangeAxioms(OWLO
690692
return listOWLAxioms(objectPropertyRangeByProperty, OWLObjectPropertyRangeAxiom.class, subject, config);
691693
}
692694

695+
@Override
696+
public Stream<OWLObjectPropertyDomainAxiom> listOWLObjectPropertyDomainAxioms(OWLObjectPropertyExpression subject) {
697+
InternalConfig config = getConfig();
698+
if (!ObjectPropertyRangeBySubject.isSupported(subject) || !useAxiomsSearchOptimization(config)) {
699+
return ListAxioms.super.listOWLObjectPropertyDomainAxioms(subject);
700+
}
701+
return listOWLAxioms(objectPropertyDomainByProperty, OWLObjectPropertyDomainAxiom.class, subject, config);
702+
}
703+
693704
@Override
694705
public Stream<OWLClassAssertionAxiom> listOWLClassAssertionAxioms(OWLIndividual subject) {
695706
InternalConfig config = getConfig();

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

+7
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,13 @@ default Stream<OWLSubObjectPropertyOfAxiom> listOWLSubObjectPropertyOfAxiomsByOb
182182
return listOWLSubPropertyOfAxiomsByObject(OWLSubObjectPropertyOfAxiom.class, object);
183183
}
184184

185+
/**
186+
* Lists {@link OWLObjectPropertyDomainAxiom ObjectPropertyDomain Axiom}s
187+
* by the given {@link OWLObjectPropertyExpression property}-subject.
188+
*
189+
* @param subject {@link OWLObjectPropertyExpression}, not {@code null}
190+
* @return a {@code Stream} of {@link OWLObjectPropertyDomainAxiom}s
191+
*/
185192
default Stream<OWLObjectPropertyDomainAxiom> listOWLObjectPropertyDomainAxioms(OWLObjectPropertyExpression subject) {
186193
return listOWLPropertyAxioms(OWLObjectPropertyDomainAxiom.class, subject);
187194
}

src/main/java/com/github/owlcs/ontapi/internal/axioms/ObjectPropertyDomainTranslator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Class<OntObjectProperty> getView() {
4949
}
5050

5151
@Override
52-
protected boolean filter(OntStatement statement, AxiomsSettings config) {
52+
public boolean filter(OntStatement statement, AxiomsSettings config) {
5353
return super.filter(statement, config) && statement.getObject().canAs(OntClass.class);
5454
}
5555

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* This file is part of the ONT API.
3+
* The contents of this file are subject to the LGPL License, Version 3.0.
4+
* Copyright (c) 2020, The University of Manchester, owl.cs group.
5+
*
6+
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
7+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8+
* You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
9+
*
10+
* Alternatively, the contents of this file may be used under the terms of the Apache License, Version 2.0 in which case, the provisions of the Apache License Version 2.0 are applicable instead of those above.
11+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
12+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
13+
*/
14+
15+
package com.github.owlcs.ontapi.internal.searchers.axioms;
16+
17+
import com.github.owlcs.ontapi.config.AxiomsSettings;
18+
import com.github.owlcs.ontapi.internal.ONTObject;
19+
import com.github.owlcs.ontapi.internal.ONTObjectFactory;
20+
import com.github.owlcs.ontapi.internal.OWLTopObjectType;
21+
import com.github.owlcs.ontapi.internal.axioms.ObjectPropertyDomainTranslator;
22+
import com.github.owlcs.ontapi.jena.model.OntModel;
23+
import org.apache.jena.util.iterator.ExtendedIterator;
24+
import org.apache.jena.vocabulary.RDFS;
25+
import org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom;
26+
import org.semanticweb.owlapi.model.OWLObjectPropertyExpression;
27+
28+
/**
29+
* Created by @ssz on 19.05.2020.
30+
*/
31+
public class ObjectPropertyDomainBySubject extends BaseByObject<OWLObjectPropertyDomainAxiom, OWLObjectPropertyExpression> {
32+
private static final ObjectPropertyDomainTranslator TRANSLATOR = getTranslator(OWLTopObjectType.OBJECT_PROPERTY_DOMAIN);
33+
34+
@Override
35+
public ExtendedIterator<ONTObject<OWLObjectPropertyDomainAxiom>> listONTAxioms(OWLObjectPropertyExpression subject,
36+
OntModel model,
37+
ONTObjectFactory factory,
38+
AxiomsSettings config) {
39+
return translate(TRANSLATOR, listBySubjectAndPredicate(model, asResource(subject), RDFS.domain)
40+
.filterKeep(s -> TRANSLATOR.filter(s, config)), factory, config);
41+
}
42+
}

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

+35-12
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ public void testObjectPropertyRangeAxioms() {
103103
data.doTest(T.OBJECT_PROPERTY_RANGE_BY_SUBJECT, HasObjectPropertiesInSignature::objectPropertiesInSignature);
104104
}
105105

106+
@Test
107+
public void testObjectPropertyDomainAxioms() {
108+
data.doTest(T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT, HasObjectPropertiesInSignature::objectPropertiesInSignature);
109+
}
110+
106111
@Test
107112
public void testClassAssertionAxiomsForIndividual() {
108113
data.doTest(T.CLASS_ASSERTION_BY_SUBJECT,
@@ -126,7 +131,8 @@ enum TestData {
126131
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(),
127132
T.CLASS_ASSERTION_BY_SUBJECT.of(-3513486065L),
128133
T.CLASS_ASSERTION_BY_OBJECT.of(-3513486065L),
129-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-5171741903L)
134+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-5171741903L),
135+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(-1378986021L)
130136
),
131137
FAMILY(ModelData.FAMILY,
132138
T.DECLARATIONS.of(34226271096L),
@@ -139,7 +145,8 @@ enum TestData {
139145
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(-44647629109L),
140146
T.CLASS_ASSERTION_BY_SUBJECT.of(-2344424939L),
141147
T.CLASS_ASSERTION_BY_OBJECT.of(-2344424939L),
142-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(11112139379L)
148+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(11112139379L),
149+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(-1766543680L)
143150
),
144151
PEOPLE(ModelData.PEOPLE,
145152
T.DECLARATIONS.of(-31040926516L),
@@ -152,7 +159,8 @@ enum TestData {
152159
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(-1008566325L),
153160
T.CLASS_ASSERTION_BY_SUBJECT.of(295642609L),
154161
T.CLASS_ASSERTION_BY_OBJECT.of(295642609L), // see https://github.com/owlcs/owlapi/issues/930
155-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-2697317876L)
162+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-2697317876L),
163+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(215400502L)
156164
),
157165
CAMERA(ModelData.CAMERA,
158166
T.DECLARATIONS.of(2967944221L),
@@ -165,7 +173,8 @@ enum TestData {
165173
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(),
166174
T.CLASS_ASSERTION_BY_SUBJECT.of(-546744276L),
167175
T.CLASS_ASSERTION_BY_OBJECT.of(-546744276L),
168-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-4417906154L)
176+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-4417906154L),
177+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(1118203354L)
169178
),
170179
KOALA(ModelData.KOALA,
171180
T.DECLARATIONS.of(6488467972L),
@@ -178,7 +187,8 @@ enum TestData {
178187
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(),
179188
T.CLASS_ASSERTION_BY_SUBJECT.of(-6315703213L),
180189
T.CLASS_ASSERTION_BY_OBJECT.of(-6315703213L),
181-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(166159343L)
190+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(166159343L),
191+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(1335386108L)
182192
),
183193
TRAVEL(ModelData.TRAVEL,
184194
T.DECLARATIONS.of(-25825023334L),
@@ -191,7 +201,8 @@ enum TestData {
191201
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(1580148819L),
192202
T.CLASS_ASSERTION_BY_SUBJECT.of(156661309L),
193203
T.CLASS_ASSERTION_BY_OBJECT.of(156661309L),
194-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(3821903939L)
204+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(3821903939L),
205+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(-1174852943L)
195206
),
196207
WINE(ModelData.WINE,
197208
T.DECLARATIONS.of(20065711780L),
@@ -204,7 +215,8 @@ enum TestData {
204215
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(24229827352L),
205216
T.CLASS_ASSERTION_BY_SUBJECT.of(-13302103928L),
206217
T.CLASS_ASSERTION_BY_OBJECT.of(-13302103928L),
207-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-3535340229L)
218+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-3535340229L),
219+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(-435085258L)
208220
),
209221
FOOD(ModelData.FOOD,
210222
T.DECLARATIONS.of(6794851452L),
@@ -217,7 +229,8 @@ enum TestData {
217229
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(),
218230
T.CLASS_ASSERTION_BY_SUBJECT.of(696330992L),
219231
T.CLASS_ASSERTION_BY_OBJECT.of(696330992L),
220-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-144528768L)
232+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-144528768L),
233+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(4534229856L)
221234
),
222235
NCBITAXON_CUT(ModelData.NCBITAXON_CUT,
223236
T.DECLARATIONS.of(244310200631L),
@@ -230,7 +243,8 @@ enum TestData {
230243
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(),
231244
T.CLASS_ASSERTION_BY_SUBJECT.of(),
232245
T.CLASS_ASSERTION_BY_OBJECT.of(),
233-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-5754775670L)
246+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(-5754775670L),
247+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of(-6535019425L)
234248
),
235249
HP_CUT(ModelData.HP_CUT,
236250
T.DECLARATIONS.of(-14640456193L),
@@ -243,7 +257,8 @@ enum TestData {
243257
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(),
244258
T.CLASS_ASSERTION_BY_SUBJECT.of(),
245259
T.CLASS_ASSERTION_BY_OBJECT.of(),
246-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of()
260+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(),
261+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of()
247262
),
248263
FAMILY_PEOPLE_UNION(ModelData.FAMILY_PEOPLE_UNION,
249264
T.DECLARATIONS.of(-637777500L),
@@ -256,7 +271,8 @@ enum TestData {
256271
T.OBJECT_PROPERTY_ASSERTION_BY_SUBJECT.of(),
257272
T.CLASS_ASSERTION_BY_SUBJECT.of(-25907713L),
258273
T.CLASS_ASSERTION_BY_OBJECT.of(-25907713L),
259-
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of()
274+
T.OBJECT_PROPERTY_RANGE_BY_SUBJECT.of(),
275+
T.OBJECT_PROPERTY_DOMAIN_BY_SUBJECT.of()
260276
),
261277
;
262278
private final ModelData resource;
@@ -349,7 +365,14 @@ Stream<? extends OWLObject> listAxioms(OWLOntology ont, OWLObject param) {
349365
Stream<? extends OWLObject> listAxioms(OWLOntology ont, OWLObject param) {
350366
return ont.objectPropertyRangeAxioms((OWLObjectPropertyExpression) param);
351367
}
352-
};
368+
},
369+
OBJECT_PROPERTY_DOMAIN_BY_SUBJECT {
370+
@Override
371+
Stream<? extends OWLObject> listAxioms(OWLOntology ont, OWLObject param) {
372+
return ont.objectPropertyDomainAxioms((OWLObjectPropertyExpression) param);
373+
}
374+
},
375+
;
353376

354377
private ByPrimitiveTester of() {
355378
return of(0);

0 commit comments

Comments
 (0)