Skip to content

Commit 4ab015e

Browse files
committed
ont-api: add OWLEquivalentObjectPropertiesAxiom model-implementation (issue #2) + add/change tests
1 parent f2b7cdd commit 4ab015e

19 files changed

+334
-88
lines changed

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@
1515
package com.github.owlcs.ontapi.internal;
1616

1717
import com.github.owlcs.ontapi.DataFactory;
18-
import org.apache.jena.graph.Node;
19-
import org.apache.jena.shared.JenaException;
20-
import org.apache.jena.util.iterator.ExtendedIterator;
21-
import org.semanticweb.owlapi.model.AxiomType;
22-
import org.semanticweb.owlapi.model.OWLAxiom;
2318
import com.github.owlcs.ontapi.jena.impl.PersonalityModel;
2419
import com.github.owlcs.ontapi.jena.model.OntClass;
2520
import com.github.owlcs.ontapi.jena.model.OntGraphModel;
2621
import com.github.owlcs.ontapi.jena.model.OntStatement;
2722
import com.github.owlcs.ontapi.jena.utils.Iter;
2823
import com.github.owlcs.ontapi.jena.utils.OntModels;
24+
import org.apache.jena.graph.Node;
25+
import org.apache.jena.shared.JenaException;
26+
import org.apache.jena.util.iterator.ExtendedIterator;
27+
import org.semanticweb.owlapi.model.AxiomType;
28+
import org.semanticweb.owlapi.model.OWLAxiom;
2929

3030
import java.util.Collections;
3131
import java.util.Objects;
@@ -254,7 +254,7 @@ public final ONTObject<Axiom> toAxiom(OntStatement statement) throws JenaExcepti
254254
* Impl note: the method returns a simple {@link ONTWrapperImpl ONT Wrapper} with an {@link Axiom} inside,
255255
* an axiom is created from the system-wide {@link DataFactory Data Factory}.
256256
* TODO: will be replaced with {@link #toAxiom(OntStatement, Supplier, InternalObjectFactory, InternalConfig)},
257-
* see <a href='https://github.com/avicomp/ont-api/issues/87'>#87</a>
257+
* see <a href='https://github.com/owlcs/ont-api/issues/2'>#87</a>
258258
*
259259
* @param statement {@link OntStatement} the statement which determines the axiom
260260
* @param factory {@link InternalObjectFactory} the data factory to create OWL-API objects

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,7 @@ public Set<OWLEntity> getSignatureSet() {
222222

223223
@Override
224224
public boolean containsNamedIndividual(OWLNamedIndividual individual) {
225-
String uri = ONTEntityImpl.getURI(individual);
226-
return subject.equals(uri) || object.equals(uri);
225+
return hasURIResource(ONTEntityImpl.getURI(individual));
227226
}
228227

229228
@Override

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,7 @@ public Set<OWLEntity> getSignatureSet() {
224224

225225
@Override
226226
public boolean containsNamedClass(OWLClass clazz) {
227-
String uri = ONTEntityImpl.getURI(clazz);
228-
return subject.equals(uri) || object.equals(uri);
227+
return hasURIResource(ONTEntityImpl.getURI(clazz));
229228
}
230229

231230
@Override

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@
4949
* </ul>
5050
* <p>
5151
* Created by szuev on 12.10.2016.
52-
*
53-
* @see OWLDisjointObjectPropertiesAxiom
5452
*/
5553
public class DisjointObjectPropertiesTranslator
5654
extends AbstractTwoWayNaryTranslator<OWLDisjointObjectPropertiesAxiom, OWLObjectPropertyExpression, OntOPE> {
@@ -213,8 +211,7 @@ public Set<OWLEntity> getSignatureSet() {
213211

214212
@Override
215213
public boolean containsObjectProperty(OWLObjectProperty property) {
216-
String uri = ONTEntityImpl.getURI(property);
217-
return subject.equals(uri) || object.equals(uri);
214+
return hasURIResource(ONTEntityImpl.getURI(property));
218215
}
219216
}
220217

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

+191-20
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,33 @@
1414

1515
package com.github.owlcs.ontapi.internal.axioms;
1616

17-
import org.apache.jena.rdf.model.Property;
18-
import org.semanticweb.owlapi.model.OWLAnnotation;
19-
import org.semanticweb.owlapi.model.OWLEquivalentObjectPropertiesAxiom;
20-
import org.semanticweb.owlapi.model.OWLObjectPropertyExpression;
21-
import com.github.owlcs.ontapi.internal.InternalConfig;
22-
import com.github.owlcs.ontapi.internal.InternalObjectFactory;
23-
import com.github.owlcs.ontapi.internal.ONTObject;
24-
import com.github.owlcs.ontapi.internal.ONTWrapperImpl;
17+
import com.github.owlcs.ontapi.DataFactory;
18+
import com.github.owlcs.ontapi.internal.*;
19+
import com.github.owlcs.ontapi.internal.objects.FactoryAccessor;
20+
import com.github.owlcs.ontapi.internal.objects.ONTEntityImpl;
21+
import com.github.owlcs.ontapi.internal.objects.ONTStatementImpl;
22+
import com.github.owlcs.ontapi.jena.model.OntGraphModel;
2523
import com.github.owlcs.ontapi.jena.model.OntOPE;
2624
import com.github.owlcs.ontapi.jena.model.OntStatement;
2725
import com.github.owlcs.ontapi.jena.vocabulary.OWL;
26+
import org.apache.jena.graph.Triple;
27+
import org.apache.jena.rdf.model.Property;
28+
import org.semanticweb.owlapi.model.*;
2829

30+
import java.util.Arrays;
2931
import java.util.Collection;
32+
import java.util.Set;
33+
import java.util.function.BiFunction;
34+
import java.util.function.Supplier;
35+
import java.util.stream.Stream;
3036

3137
/**
32-
* example:
33-
* <pre>
34-
* {@code
38+
* A translator that provides {@link OWLEquivalentObjectPropertiesAxiom} implementations.
39+
* Example:
40+
* <pre>{@code
3541
* <http://schema.org/image> rdf:type owl:ObjectProperty ; owl:equivalentProperty foaf:depiction .
36-
* }
37-
* </pre>
42+
* }</pre>
3843
* Created by @szuev on 01.10.2016.
39-
*
40-
* @see OWLEquivalentObjectPropertiesAxiom
4144
*/
4245
public class EquivalentObjectPropertiesTranslator
4346
extends AbstractNaryTranslator<OWLEquivalentObjectPropertiesAxiom, OWLObjectPropertyExpression, OntOPE> {
@@ -54,14 +57,182 @@ Class<OntOPE> getView() {
5457

5558
@Override
5659
public ONTObject<OWLEquivalentObjectPropertiesAxiom> toAxiom(OntStatement statement,
57-
InternalObjectFactory reader,
60+
Supplier<OntGraphModel> model,
61+
InternalObjectFactory factory,
5862
InternalConfig config) {
59-
ONTObject<? extends OWLObjectPropertyExpression> a = reader.getProperty(statement.getSubject(getView()));
60-
ONTObject<? extends OWLObjectPropertyExpression> b = reader.getProperty(statement.getObject().as(getView()));
61-
Collection<ONTObject<OWLAnnotation>> annotations = reader.getAnnotations(statement, config);
62-
OWLEquivalentObjectPropertiesAxiom res = reader.getOWLDataFactory()
63+
return AxiomImpl.create(statement, model, factory, config);
64+
}
65+
66+
@Override
67+
public ONTObject<OWLEquivalentObjectPropertiesAxiom> toAxiom(OntStatement statement,
68+
InternalObjectFactory factory,
69+
InternalConfig config) {
70+
ONTObject<? extends OWLObjectPropertyExpression> a = factory.getProperty(statement.getSubject(getView()));
71+
ONTObject<? extends OWLObjectPropertyExpression> b = factory.getProperty(statement.getObject().as(getView()));
72+
Collection<ONTObject<OWLAnnotation>> annotations = factory.getAnnotations(statement, config);
73+
OWLEquivalentObjectPropertiesAxiom res = factory.getOWLDataFactory()
6374
.getOWLEquivalentObjectPropertiesAxiom(a.getOWLObject(), b.getOWLObject(), ONTObject.toSet(annotations));
6475
return ONTWrapperImpl.create(res, statement).append(annotations).append(a).append(b);
6576
}
6677

78+
/**
79+
* @see com.github.owlcs.ontapi.owlapi.axioms.OWLEquivalentObjectPropertiesAxiomImpl
80+
*/
81+
public abstract static class AxiomImpl extends ObjectPropertyNaryAxiomImpl<OWLEquivalentObjectPropertiesAxiom>
82+
implements OWLEquivalentObjectPropertiesAxiom {
83+
84+
protected AxiomImpl(Triple t, Supplier<OntGraphModel> m) {
85+
this(strip(t.getSubject()), t.getPredicate().getURI(), strip(t.getObject()), m);
86+
}
87+
88+
protected AxiomImpl(Object s, String p, Object o, Supplier<OntGraphModel> m) {
89+
super(s, p, o, m);
90+
}
91+
92+
/**
93+
* Creates an {@link ONTObject} container, that is also {@link OWLEquivalentObjectPropertiesAxiom}.
94+
*
95+
* @param statement {@link OntStatement}, not {@code null}
96+
* @param model {@link OntGraphModel} provider, not {@code null}
97+
* @param factory {@link InternalObjectFactory}, not {@code null}
98+
* @param config {@link InternalConfig}, not {@code null}
99+
* @return {@link AxiomImpl}
100+
*/
101+
public static AxiomImpl create(OntStatement statement,
102+
Supplier<OntGraphModel> model,
103+
InternalObjectFactory factory,
104+
InternalConfig config) {
105+
return WithManyObjects.create(statement, model,
106+
SimpleImpl.FACTORY, ComplexImpl.FACTORY, SET_HASH_CODE, factory, config);
107+
}
108+
109+
@Override
110+
protected final long count() {
111+
return 2;
112+
}
113+
114+
@FactoryAccessor
115+
@Override
116+
protected OWLEquivalentObjectPropertiesAxiom createAxiom(Collection<OWLObjectPropertyExpression> members,
117+
Collection<OWLAnnotation> annotations) {
118+
return getDataFactory().getOWLEquivalentObjectPropertiesAxiom(members,
119+
annotations == null ? NO_ANNOTATIONS : annotations);
120+
}
121+
122+
@FactoryAccessor
123+
OWLSubObjectPropertyOfAxiom createSubPropertyOf(OWLObjectPropertyExpression a,
124+
OWLObjectPropertyExpression b) {
125+
DataFactory df = getDataFactory();
126+
return df.getOWLSubObjectPropertyOfAxiom(a, b);
127+
}
128+
129+
@FactoryAccessor
130+
@Override
131+
public Collection<OWLSubObjectPropertyOfAxiom> asSubObjectPropertyOfAxioms() {
132+
return walkAllPairwise((a, b) -> createSubPropertyOf(eraseModel(a), eraseModel(b)));
133+
}
134+
135+
/**
136+
* An {@link OWLEquivalentObjectPropertiesAxiom} that has named object property expressions
137+
* as subject and object and has no annotations.
138+
*/
139+
protected static class SimpleImpl extends AxiomImpl implements Simple<OWLObjectPropertyExpression> {
140+
141+
private static final BiFunction<Triple, Supplier<OntGraphModel>, SimpleImpl> FACTORY = SimpleImpl::new;
142+
143+
protected SimpleImpl(Triple t, Supplier<OntGraphModel> m) {
144+
super(t, m);
145+
}
146+
147+
protected SimpleImpl(Object s, String p, Object o, Supplier<OntGraphModel> m) {
148+
super(s, p, o, m);
149+
}
150+
151+
@Override
152+
protected boolean sameContent(ONTStatementImpl other) {
153+
return other instanceof SimpleImpl && isReverseTriple((SimpleImpl) other);
154+
}
155+
156+
@Override
157+
protected AxiomImpl makeCopyWith(ONTObject<OWLEquivalentObjectPropertiesAxiom> other) {
158+
if (other instanceof SimpleImpl) {
159+
Triple t = ((SimpleImpl) other).asTriple();
160+
return new SimpleImpl(subject, predicate, object, model) {
161+
162+
@Override
163+
public Stream<Triple> triples() {
164+
return Stream.concat(SimpleImpl.this.triples(), Stream.of(t));
165+
}
166+
};
167+
}
168+
return new SimpleImpl(subject, predicate, object, model) {
169+
@Override
170+
public Stream<Triple> triples() {
171+
return Stream.concat(SimpleImpl.this.triples(), other.triples());
172+
}
173+
};
174+
}
175+
176+
@SuppressWarnings("unchecked")
177+
@Override
178+
public Set<OWLObjectProperty> getObjectPropertySet() {
179+
return (Set<OWLObjectProperty>) getOWLComponentsAsSet();
180+
}
181+
182+
@SuppressWarnings("unchecked")
183+
@Override
184+
public Set<OWLEntity> getSignatureSet() {
185+
return (Set<OWLEntity>) getOWLComponentsAsSet();
186+
}
187+
188+
@Override
189+
public boolean containsObjectProperty(OWLObjectProperty property) {
190+
return hasURIResource(ONTEntityImpl.getURI(property));
191+
}
192+
}
193+
194+
/**
195+
* An {@link OWLEquivalentObjectPropertiesAxiom}
196+
* that either has annotations or anonymous object property expressions in the subject or the object positions.
197+
* It has a public constructor since it is more generic then {@link SimpleImpl}.
198+
*/
199+
public static class ComplexImpl extends AxiomImpl implements Complex<ComplexImpl, OWLObjectPropertyExpression> {
200+
201+
private static final BiFunction<Triple, Supplier<OntGraphModel>, ComplexImpl> FACTORY = ComplexImpl::new;
202+
protected final InternalCache.Loading<ComplexImpl, Object[]> content;
203+
204+
public ComplexImpl(Triple t, Supplier<OntGraphModel> m) {
205+
this(strip(t.getSubject()), t.getPredicate().getURI(), strip(t.getObject()), m);
206+
}
207+
208+
protected ComplexImpl(Object s, String p, Object o, Supplier<OntGraphModel> m) {
209+
super(s, p, o, m);
210+
this.content = createContentCache();
211+
}
212+
213+
@Override
214+
public InternalCache.Loading<ComplexImpl, Object[]> getContentCache() {
215+
return content;
216+
}
217+
218+
@Override
219+
protected boolean sameContent(ONTStatementImpl other) {
220+
return other instanceof ComplexImpl && Arrays.equals(getContent(), ((ComplexImpl) other).getContent());
221+
}
222+
223+
@Override
224+
protected ComplexImpl makeCopyWith(ONTObject<OWLEquivalentObjectPropertiesAxiom> other) {
225+
ComplexImpl res = new ComplexImpl(subject, predicate, object, model) {
226+
@Override
227+
public Stream<Triple> triples() {
228+
return Stream.concat(ComplexImpl.this.triples(), other.triples());
229+
}
230+
};
231+
if (hasContent()) {
232+
res.putContent(getContent());
233+
}
234+
return res;
235+
}
236+
}
237+
}
67238
}

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

+5-7
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414

1515
package com.github.owlcs.ontapi.internal.axioms;
1616

17-
import org.apache.jena.graph.Triple;
18-
import org.apache.jena.util.iterator.ExtendedIterator;
19-
import org.semanticweb.owlapi.model.*;
2017
import com.github.owlcs.ontapi.DataFactory;
2118
import com.github.owlcs.ontapi.internal.*;
2219
import com.github.owlcs.ontapi.internal.objects.*;
@@ -26,6 +23,9 @@
2623
import com.github.owlcs.ontapi.jena.utils.Iter;
2724
import com.github.owlcs.ontapi.jena.utils.OntModels;
2825
import com.github.owlcs.ontapi.jena.vocabulary.OWL;
26+
import org.apache.jena.graph.Triple;
27+
import org.apache.jena.util.iterator.ExtendedIterator;
28+
import org.semanticweb.owlapi.model.*;
2929

3030
import javax.annotation.ParametersAreNonnullByDefault;
3131
import java.util.Arrays;
@@ -302,8 +302,7 @@ public Set<OWLEntity> getSignatureSet() {
302302

303303
@Override
304304
public boolean containsObjectProperty(OWLObjectProperty property) {
305-
String uri = ONTEntityImpl.getURI(property);
306-
return subject.equals(uri) || object.equals(uri);
305+
return hasURIResource(ONTEntityImpl.getURI(property));
307306
}
308307

309308
@Override
@@ -333,8 +332,7 @@ public Stream<Triple> triples() {
333332
* in subject or object positions.
334333
* It has a public constructor since it is more generic then {@link SimpleImpl}.
335334
*/
336-
protected static class ComplexImpl extends AxiomImpl
337-
implements Complex<ComplexImpl, OWLObjectPropertyExpression> {
335+
protected static class ComplexImpl extends AxiomImpl implements Complex<ComplexImpl, OWLObjectPropertyExpression> {
338336

339337
private static final BiFunction<Triple, Supplier<OntGraphModel>, ComplexImpl> FACTORY = ComplexImpl::new;
340338
protected final InternalCache.Loading<ComplexImpl, Object[]> content;

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,7 @@ public boolean canContainAnonymousIndividuals() {
214214
* that either has annotations or anonymous class expressions in subject or object positions.
215215
* It has a public constructor since it is more generic then {@link SimpleImpl}.
216216
*/
217-
public static class ComplexImpl extends AxiomImpl
218-
implements Complex<ComplexImpl, OWLIndividual> {
217+
public static class ComplexImpl extends AxiomImpl implements Complex<ComplexImpl, OWLIndividual> {
219218

220219
private static final BiFunction<Triple, Supplier<OntGraphModel>, ComplexImpl> FACTORY = ComplexImpl::new;
221220
protected final InternalCache.Loading<ComplexImpl, Object[]> content;

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

+5-6
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414

1515
package com.github.owlcs.ontapi.internal.axioms;
1616

17-
import org.apache.jena.graph.Triple;
18-
import org.apache.jena.util.iterator.ExtendedIterator;
19-
import org.apache.jena.util.iterator.NullIterator;
20-
import org.semanticweb.owlapi.model.*;
2117
import com.github.owlcs.ontapi.internal.*;
2218
import com.github.owlcs.ontapi.internal.objects.FactoryAccessor;
2319
import com.github.owlcs.ontapi.internal.objects.ONTAnnotationPropertyImpl;
2420
import com.github.owlcs.ontapi.internal.objects.ONTEntityImpl;
2521
import com.github.owlcs.ontapi.jena.model.OntGraphModel;
2622
import com.github.owlcs.ontapi.jena.model.OntNAP;
2723
import com.github.owlcs.ontapi.jena.model.OntStatement;
24+
import org.apache.jena.graph.Triple;
25+
import org.apache.jena.util.iterator.ExtendedIterator;
26+
import org.apache.jena.util.iterator.NullIterator;
27+
import org.semanticweb.owlapi.model.*;
2828

2929
import java.util.Collection;
3030
import java.util.Set;
@@ -188,8 +188,7 @@ public Set<OWLEntity> getSignatureSet() {
188188

189189
@Override
190190
public boolean containsAnnotationProperty(OWLAnnotationProperty property) {
191-
String uri = ONTEntityImpl.getURI(property);
192-
return subject.equals(uri) || object.equals(uri);
191+
return hasURIResource(ONTEntityImpl.getURI(property));
193192
}
194193
}
195194

0 commit comments

Comments
 (0)