Skip to content

Commit 3492b63

Browse files
committed
ont-api: ClassSearcher -- add contains and find functionality
1 parent f3f987c commit 3492b63

File tree

7 files changed

+92
-27
lines changed

7 files changed

+92
-27
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,7 @@ protected ObjectMap<OWLObject> createComponentObjectMap(OWLComponentType type) {
13911391
if (!conf.useComponentCache()) {
13921392
ObjectsSearcher<OWLObject> searcher;
13931393
if (OWLComponentType.CLASS == type) {
1394-
searcher = (ObjectsSearcher<OWLObject>) (ObjectsSearcher<?>) classSearcher;
1394+
searcher = cast(classSearcher);
13951395
} else { // TODO: other types
13961396
return new DirectObjectMapImpl<>(loader);
13971397
}
@@ -1404,6 +1404,10 @@ protected ObjectMap<OWLObject> createComponentObjectMap(OWLComponentType type) {
14041404
return new CacheObjectMapImpl<>(loader, false, parallel, fastIterator);
14051405
}
14061406

1407+
private static ObjectsSearcher<OWLObject> cast(ObjectsSearcher<?> x) {
1408+
return (ObjectsSearcher<OWLObject>) x;
1409+
}
1410+
14071411
/**
14081412
* Lists all objects of the specified {@code type}.
14091413
*

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package com.github.owlcs.ontapi.internal;
1616

1717
import com.github.owlcs.ontapi.DataFactory;
18+
import com.github.owlcs.ontapi.OntApiException;
1819
import com.github.owlcs.ontapi.internal.objects.*;
1920
import com.github.owlcs.ontapi.jena.model.*;
2021
import org.apache.jena.graph.BlankNodeId;
@@ -43,6 +44,21 @@ public InternalObjectFactory(DataFactory factory, Supplier<OntModel> model) {
4344
this.model = Objects.requireNonNull(model);
4445
}
4546

47+
/**
48+
* Using the {@code factory} finds or creates an {@link OWLClass} instance.
49+
*
50+
* @param uri {@code String}, not {@code null}
51+
* @param factory {@link ONTObjectFactory}, not {@code null}
52+
* @param model {@link OntModel}
53+
* @return an {@link ONTObject} which is {@link OWLClass}
54+
*/
55+
public static ONTObject<OWLClass> getONTClass(String uri, OntModel model, ONTObjectFactory factory) {
56+
if (factory instanceof ModelObjectFactory) {
57+
return ((ModelObjectFactory) factory).getClass(uri);
58+
}
59+
return factory.getClass(OntApiException.mustNotBeNull(model.getOntClass(uri)));
60+
}
61+
4662
@Override
4763
public Supplier<OntModel> model() {
4864
return model;

src/main/java/com/github/owlcs/ontapi/internal/searchers/objects/ClassSearcher.java

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.github.owlcs.ontapi.jena.model.OntModel;
2525
import com.github.owlcs.ontapi.jena.model.OntStatement;
2626
import com.github.owlcs.ontapi.jena.utils.Iter;
27+
import com.github.owlcs.ontapi.jena.utils.OntModels;
2728
import com.github.owlcs.ontapi.jena.vocabulary.OWL;
2829
import com.github.owlcs.ontapi.jena.vocabulary.RDF;
2930
import org.apache.jena.rdf.model.RDFNode;
@@ -34,7 +35,9 @@
3435
import org.semanticweb.owlapi.model.OWLClass;
3536

3637
import java.util.HashSet;
38+
import java.util.Optional;
3739
import java.util.Set;
40+
import java.util.function.Function;
3841

3942
/**
4043
* Created by @ssz on 19.04.2020.
@@ -47,26 +50,54 @@ protected static OntPersonality.Builtins getBuiltins(OntModel m) {
4750
return PersonalityModel.asPersonalityModel(m).getOntPersonality().getBuiltins();
4851
}
4952

50-
/**
51-
* Using the {@code factory} finds or creates an {@link OWLClass} instance.
52-
*
53-
* @param uri {@code String}, not {@code null}
54-
* @param factory {@link ONTObjectFactory}, not {@code null}
55-
* @param model {@link OntModel}
56-
* @return an {@link ONTObject} which is {@link OWLClass}
57-
*/
58-
public static ONTObject<OWLClass> find(String uri, OntModel model, ONTObjectFactory factory) {
53+
private static Function<String, ONTObject<OWLClass>> factoryMapping(OntModel model, ONTObjectFactory factory) {
5954
if (factory instanceof ModelObjectFactory) {
60-
return ((ModelObjectFactory) factory).getClass(uri);
55+
return ((ModelObjectFactory) factory)::getClass;
6156
}
62-
return factory.getClass(OntApiException.mustNotBeNull(model.getOntClass(uri)));
57+
return uri -> factory.getClass(OntApiException.mustNotBeNull(model.getOntClass(uri)));
6358
}
6459

6560
@Override
6661
public ExtendedIterator<ONTObject<OWLClass>> listONTObjects(OntModel model,
6762
ONTObjectFactory factory,
6863
AxiomsSettings config) {
69-
return listClasses(model, config).mapWith(u -> find(u, model, factory));
64+
return listClasses(model, config).mapWith(factoryMapping(model, factory));
65+
}
66+
67+
@Override
68+
public boolean containsONTObject(OWLClass object, OntModel model, ONTObjectFactory factory, AxiomsSettings config) {
69+
return containsClass(object.getIRI().getIRIString(), model, config);
70+
}
71+
72+
@Override
73+
public Optional<ONTObject<OWLClass>> findONTObject(OWLClass object,
74+
OntModel model,
75+
ONTObjectFactory factory,
76+
AxiomsSettings config) {
77+
String uri = object.getIRI().getIRIString();
78+
if (containsClass(uri, model, config)) {
79+
return Optional.of(InternalObjectFactory.getONTClass(uri, model, factory));
80+
}
81+
return Optional.empty();
82+
}
83+
84+
protected boolean containsClass(String uri, OntModel m, AxiomsSettings conf) {
85+
Resource clazz = m.getResource(uri);
86+
if (getBuiltins(m).getClasses().contains(clazz.asNode())) {
87+
if (OWL.Thing.equals(clazz)) {
88+
if (containAxiom(Iter.flatMap(listImplicitStatements(m), s -> listRootStatements(m, s)), conf)) {
89+
return true;
90+
}
91+
}
92+
return containAxiom(listStatements(m, clazz), conf);
93+
}
94+
if (m.independent()) {
95+
return m.getBaseGraph().contains(clazz.asNode(), RDF.type.asNode(), OWL.Class.asNode());
96+
}
97+
if (!m.contains(clazz, RDF.type, OWL.Class)) {
98+
return false;
99+
}
100+
return containAxiom(listStatements(m, clazz), conf);
70101
}
71102

72103
protected ExtendedIterator<String> listClasses(OntModel m, AxiomsSettings conf) {
@@ -104,7 +135,7 @@ protected ExtendedIterator<OntStatement> listImplicitStatements(OntModel m) {
104135
}
105136

106137
protected ExtendedIterator<String> listClassesFromImports(OntModel m) {
107-
ExtendedIterator<OntModel> imports = Iter.create(m.imports().iterator());
138+
ExtendedIterator<OntModel> imports = OntModels.listImports(m);
108139
return Iter.distinct(Iter.flatMap(imports, i -> i.listStatements(null, RDF.type, OWL.Class))
109140
.mapWith(Statement::getSubject).filterKeep(RDFNode::isURIResource).mapWith(Resource::getURI));
110141
}

src/main/java/com/github/owlcs/ontapi/jena/impl/OntGraphModelImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ protected final ExtendedIterator<OntGraphModelImpl> listAllModels(OntPersonality
354354
* @param personality {@link OntPersonality}, not {@code null}
355355
* @return <b>non-distinct</b> {@code ExtendedIterator} of {@link OntGraphModelImpl}s
356356
*/
357-
protected final ExtendedIterator<OntGraphModelImpl> listImportModels(OntPersonality personality) {
357+
public final ExtendedIterator<OntGraphModelImpl> listImportModels(OntPersonality personality) {
358358
return listImportGraphs().mapWith(u -> new OntGraphModelImpl(u, personality));
359359
}
360360

src/main/java/com/github/owlcs/ontapi/jena/utils/OntModels.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,23 @@ public static Stream<OntModel> importsClosure(OntModel m) {
143143
return Stream.concat(Stream.of(m), m.imports().flatMap(OntModels::importsClosure));
144144
}
145145

146+
/**
147+
* Lists all imported models from the given one.
148+
*
149+
* @param model {@link OntModel}
150+
* @return a {@code ExtendedIterator} of {@link OntModel}s
151+
* @see OntModel#imports()
152+
*/
153+
@SuppressWarnings("unchecked")
154+
public static ExtendedIterator<OntModel> listImports(OntModel model) {
155+
if (model instanceof OntGraphModelImpl) {
156+
OntGraphModelImpl m = (OntGraphModelImpl) model;
157+
ExtendedIterator<?> res = m.listImportModels(m.getOntPersonality());
158+
return (ExtendedIterator<OntModel>) res;
159+
}
160+
return Iter.create(model.imports().iterator());
161+
}
162+
146163
/**
147164
* Lists all ontology objects with the given {@code type} that are defined in the base graph.
148165
* See also {@link OntModels#listLocalStatements(OntModel, Resource, Property, RDFNode)} description.
@@ -153,8 +170,7 @@ public static Stream<OntModel> importsClosure(OntModel m) {
153170
* @return {@link ExtendedIterator} of ontology objects of the type {@link O} that are local to the base graph
154171
* @see OntModel#ontObjects(Class)
155172
*/
156-
public static <O extends OntObject> ExtendedIterator<O> listLocalObjects(OntModel model,
157-
Class<? extends O> type) {
173+
public static <O extends OntObject> ExtendedIterator<O> listLocalObjects(OntModel model, Class<? extends O> type) {
158174
if (model instanceof OntGraphModelImpl) {
159175
return ((OntGraphModelImpl) model).listLocalOntObjects(type);
160176
}

src/test/java/com/github/owlcs/ontapi/tests/internal/NoComponentCacheSignatureTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.github.owlcs.ontapi.tests.ModelData;
2222
import com.github.owlcs.ontapi.tests.model.ContainsSignatureTest;
2323
import org.junit.Assert;
24-
import org.semanticweb.owlapi.model.OWLEntity;
2524
import org.semanticweb.owlapi.model.OWLOntologyManager;
2625

2726
/**
@@ -31,6 +30,7 @@
3130
* @see com.github.owlcs.ontapi.tests.managers.CacheConfigTest;
3231
*/
3332
public class NoComponentCacheSignatureTest extends ContainsSignatureTest {
33+
3434
public NoComponentCacheSignatureTest(ModelData data) {
3535
super(data);
3636
}
@@ -43,9 +43,4 @@ protected OWLOntologyManager newManager() {
4343
Assert.assertFalse(conf.useComponentCache());
4444
return m;
4545
}
46-
47-
@Override
48-
protected void testContains(Class<? extends OWLEntity> type) {
49-
super.testContains(type);
50-
}
5146
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
@RunWith(Parameterized.class)
3737
public class ContainsSignatureTest {
3838

39-
private final ModelData data;
39+
protected final ModelData data;
4040

4141
public ContainsSignatureTest(ModelData data) {
4242
this.data = data;
@@ -93,9 +93,12 @@ protected void testContains(Class<? extends OWLEntity> type) {
9393
}
9494

9595
protected void testContains(Class<? extends OWLEntity> type, Map<String, Boolean> entities) {
96-
OWLOntologyManager m = newManager();
97-
OWLOntology o = data.fetch(m);
98-
OWLDataFactory df = m.getOWLDataFactory();
96+
OWLOntology o = data.fetch(newManager());
97+
testContains(o, type, entities);
98+
}
99+
100+
protected void testContains(OWLOntology o, Class<? extends OWLEntity> type, Map<String, Boolean> entities) {
101+
OWLDataFactory df = o.getOWLOntologyManager().getOWLDataFactory();
99102
entities.forEach((s, v) -> {
100103
EntityType<?> t = OWLEntityUtils.getEntityType(type);
101104
OWLEntity e = df.getOWLEntity(t, IRI.create(s));

0 commit comments

Comments
 (0)