/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* 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.
*/
// Package
///////////////
package org.apache.jena.ontology.impl;
// Imports
///////////////
import java.util.List ;
import java.util.function.Predicate;
import junit.framework.TestCase ;
import org.apache.jena.ontology.OntClass ;
import org.apache.jena.ontology.OntModel ;
import org.apache.jena.ontology.OntModelSpec ;
import org.apache.jena.ontology.OntTools ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.apache.jena.rdf.model.Property ;
import org.apache.jena.rdf.model.ResourceFactory ;
import org.apache.jena.rdf.model.Statement ;
import org.apache.jena.vocabulary.OWL ;
/**
* <p>
* Unit tests for experimental ontology tools class.
* </p>
*/
public class TestOntTools
extends TestCase
{
// Constants
//////////////////////////////////
String NS = "http://example.com/test#";
// Static variables
//////////////////////////////////
// Instance variables
//////////////////////////////////
OntModel m_model;
OntClass m_a;
OntClass m_b;
OntClass m_c;
OntClass m_d;
OntClass m_e;
OntClass m_f;
OntClass m_g;
OntClass m_top;
// Constructors
//////////////////////////////////
// External signature methods
//////////////////////////////////
/**
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() {
m_model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_MICRO_RULE_INF );
m_a = m_model.createClass( NS + "A" );
m_b = m_model.createClass( NS + "B" );
m_c = m_model.createClass( NS + "C" );
m_d = m_model.createClass( NS + "D" );
m_e = m_model.createClass( NS + "E" );
m_f = m_model.createClass( NS + "F" );
m_g = m_model.createClass( NS + "G" );
m_top = m_model.createClass( OWL.Thing.getURI() );
}
/**
* Test method for <code>org.apache.jena.ontology.OntTools#indexLCA</code>
*/
public void testIndexLCA0() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
assertEquals( m_a, OntTools.getLCA( m_model, m_b, m_c ) );
}
public void testIndexLCA1() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
assertEquals( m_a, OntTools.getLCA( m_model, m_c, m_b ) );
}
public void testIndexLCA2() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
assertEquals( m_a, OntTools.getLCA( m_model, m_a, m_c ) );
}
public void testIndexLCA3() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
assertEquals( m_a, OntTools.getLCA( m_model, m_b, m_a ) );
}
public void testIndexLCA4() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_b.addSubClass( m_d );
assertEquals( m_a, OntTools.getLCA( m_model, m_d, m_c ) );
}
public void testIndexLCA5() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_b.addSubClass( m_d );
assertEquals( m_a, OntTools.getLCA( m_model, m_c, m_d ) );
}
public void testIndexLCA6() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_b.addSubClass( m_d );
m_c.addSubClass( m_e );
assertEquals( m_a, OntTools.getLCA( m_model, m_d, m_e ) );
}
public void testIndexLCA7() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_b.addSubClass( m_d );
m_c.addSubClass( m_e );
assertEquals( m_a, OntTools.getLCA( m_model, m_e, m_d ) );
}
public void testIndexLCA8() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_b.addSubClass( m_d );
m_d.addSubClass( m_e );
assertEquals( m_a, OntTools.getLCA( m_model, m_c, m_e ) );
}
public void testIndexLCA9() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_b.addSubClass( m_d );
m_d.addSubClass( m_e );
assertEquals( m_a, OntTools.getLCA( m_model, m_b, m_c ) );
}
public void testIndexLCA10() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_a.addSubClass( m_d );
m_c.addSubClass( m_e );
m_d.addSubClass( m_f );
assertEquals( m_a, OntTools.getLCA( m_model, m_b, m_e ) );
}
public void testIndexLCA11() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_a.addSubClass( m_d );
m_c.addSubClass( m_e );
m_d.addSubClass( m_f );
assertEquals( m_a, OntTools.getLCA( m_model, m_b, m_f ) );
}
public void testIndexLCA12() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_a.addSubClass( m_d );
m_d.addSubClass( m_e );
m_d.addSubClass( m_f );
assertEquals( m_d, OntTools.getLCA( m_model, m_f, m_e ) );
}
public void testIndexLCA13() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_a.addSubClass( m_d );
m_c.addSubClass( m_e );
m_d.addSubClass( m_e );
m_d.addSubClass( m_f );
assertEquals( m_d, OntTools.getLCA( m_model, m_f, m_e ) );
}
/** Disconnected trees */
public void testIndexLCA14() {
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
assertEquals( OWL.Thing, OntTools.getLCA( m_model, m_b, m_e ) );
assertEquals( OWL.Thing, OntTools.getLCA( m_model, m_c, m_e ) );
assertEquals( OWL.Thing, OntTools.getLCA( m_model, m_a, m_e ) );
}
/** Shortest path tests */
static final Predicate<Statement> ANY = s -> true;
public void testShortestPath0() {
Property p = m_model.createProperty( NS + "p" );
m_a.addProperty( p, m_b );
testPath( OntTools.findShortestPath( m_model, m_a, m_b, ANY ),
new Property[] {p} );
}
public void testShortestPath1() {
Property p = m_model.createProperty( NS + "p" );
m_a.addProperty( p, m_b );
m_b.addProperty( p, m_c );
testPath( OntTools.findShortestPath( m_model, m_a, m_c, ANY ),
new Property[] {p,p} );
}
public void testShortestPath2() {
Property p = m_model.createProperty( NS + "p" );
// a - b - c
m_a.addProperty( p, m_b );
m_b.addProperty( p, m_c );
// a - d - e - f
m_a.addProperty( p, m_d );
m_d.addProperty( p, m_e );
m_e.addProperty( p, m_f );
testPath( OntTools.findShortestPath( m_model, m_a, m_c, ANY ),
new Property[] {p,p} );
testPath( OntTools.findShortestPath( m_model, m_a, m_f, ANY ),
new Property[] {p,p,p} );
}
public void testShortestPath3() {
Property p = m_model.createProperty( NS + "p" );
// a - b - c
m_a.addProperty( p, m_b );
m_b.addProperty( p, m_c );
// a - d - e - f
m_a.addProperty( p, m_d );
m_d.addProperty( p, m_e );
m_e.addProperty( p, m_f );
testPath( OntTools.findShortestPath( m_model, m_a, m_c, new OntTools.PredicatesFilter( p ) ),
new Property[] {p,p} );
testPath( OntTools.findShortestPath( m_model, m_a, m_f, new OntTools.PredicatesFilter( p ) ),
new Property[] {p,p,p} );
}
public void testShortestPath4() {
Property p = m_model.createProperty( NS + "p" );
Property q = m_model.createProperty( NS + "q" );
// a - b - c by q
m_a.addProperty( q, m_b );
m_b.addProperty( q, m_c );
// a - d - e - f by p
m_a.addProperty( p, m_d );
m_d.addProperty( p, m_e );
m_e.addProperty( p, m_f );
assertNull( OntTools.findShortestPath( m_model, m_a, m_c, new OntTools.PredicatesFilter( p ) ) );
testPath( OntTools.findShortestPath( m_model, m_a, m_f, new OntTools.PredicatesFilter( p ) ),
new Property[] {p,p,p} );
}
/** Reflexive loop is allowed */
public void testShortestPath5() {
Property p = m_model.createProperty( NS + "p" );
m_a.addProperty( p, m_a );
testPath( OntTools.findShortestPath( m_model, m_a, m_a, ANY ),
new Property[] {p} );
}
public void testShortestPath6() {
Property p = m_model.createProperty( NS + "p" );
Property q = m_model.createProperty( NS + "q" );
// a - b - a by q
// tests loop detection
m_a.addProperty( q, m_b );
m_b.addProperty( q, m_a );
assertNull( OntTools.findShortestPath( m_model, m_a, m_c, new OntTools.PredicatesFilter( new Property[] {p,q} ) ) );
}
public void testShortestPath7() {
Property p = m_model.createProperty( NS + "p" );
Property q = m_model.createProperty( NS + "q" );
// a - d - e - f by p and q
m_a.addProperty( p, m_d );
m_d.addProperty( q, m_e );
m_d.addProperty( q, m_b );
m_e.addProperty( p, m_f );
testPath( OntTools.findShortestPath( m_model, m_a, m_f, new OntTools.PredicatesFilter( new Property[] {p,q} ) ),
new Property[] {p,q,p} );
}
/** Find a literal target */
public void testShortestPath8() {
Property p = m_model.createProperty( NS + "p" );
Property q = m_model.createProperty( NS + "q" );
// a - d - e - f by p and q
m_a.addProperty( p, m_d );
m_d.addProperty( q, m_e );
m_d.addProperty( q, "bluff" );
m_d.addProperty( q, m_b );
m_e.addProperty( p, m_f );
m_f.addProperty( q, "arnie" );
testPath( OntTools.findShortestPath( m_model, m_a, ResourceFactory.createPlainLiteral( "arnie" ),
new OntTools.PredicatesFilter( new Property[] {p,q} ) ),
new Property[] {p,q,p,q} );
}
/** Tests on {@link OntTools#namedHierarchyRoots(OntModel)} */
public void testNamedHierarchyRoots0() {
m_a.addSubClass( m_b );
m_b.addSubClass( m_c );
m_c.addSubClass( m_d );
m_e.addSubClass( m_e );
m_e.addSubClass( m_f );
List<OntClass> nhr = OntTools.namedHierarchyRoots( m_model );
assertEquals( 3, nhr.size() );
assertTrue( nhr.contains( m_a ));
assertTrue( nhr.contains( m_e ));
assertTrue( nhr.contains( m_g ));
}
public void testNamedHierarchyRoots1() {
m_a.addSubClass( m_b );
m_b.addSubClass( m_c );
m_c.addSubClass( m_d );
m_e.addSubClass( m_e );
m_e.addSubClass( m_f );
OntClass anon0 = m_model.createClass();
anon0.addSubClass( m_a );
anon0.addSubClass( m_e );
List<OntClass> nhr = OntTools.namedHierarchyRoots( m_model );
assertEquals( 3, nhr.size() );
assertTrue( nhr.contains( m_a ));
assertTrue( nhr.contains( m_e ));
assertTrue( nhr.contains( m_g ));
}
public void testNamedHierarchyRoots2() {
OntClass anon0 = m_model.createClass();
OntClass anon1 = m_model.createClass();
anon0.addSubClass( m_a );
anon0.addSubClass( m_e );
anon0.addSubClass( anon1 );
anon1.addSubClass( m_g );
m_a.addSubClass( m_b );
m_b.addSubClass( m_c );
m_c.addSubClass( m_d );
m_e.addSubClass( m_e );
m_e.addSubClass( m_f );
List<OntClass> nhr = OntTools.namedHierarchyRoots( m_model );
assertEquals( 3, nhr.size() );
assertTrue( nhr.contains( m_a ));
assertTrue( nhr.contains( m_e ));
assertTrue( nhr.contains( m_g ));
}
/** Test for no dups in the returned list */
public void testNamedHierarchyRoots3() {
OntClass anon0 = m_model.createClass();
OntClass anon1 = m_model.createClass();
anon0.addSubClass( m_a );
anon1.addSubClass( m_a );
// only a is root
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_a.addSubClass( m_d );
m_a.addSubClass( m_e );
m_a.addSubClass( m_f );
m_a.addSubClass( m_g );
List<OntClass> nhr = OntTools.namedHierarchyRoots( m_model );
assertEquals( 1, nhr.size() );
assertTrue( nhr.contains( m_a ));
}
/** Test for indirect route to a non-root node */
public void testNamedHierarchyRoots4() {
OntClass anon0 = m_model.createClass();
OntClass anon1 = m_model.createClass();
anon0.addSubClass( m_a );
anon1.addSubClass( m_b );
// only a is root, because b is a subclass of a
// even though b is a sub-class of an anon root
m_a.addSubClass( m_b );
m_a.addSubClass( m_c );
m_a.addSubClass( m_d );
m_a.addSubClass( m_e );
m_a.addSubClass( m_f );
m_a.addSubClass( m_g );
List<OntClass> nhr = OntTools.namedHierarchyRoots( m_model );
assertEquals( 1, nhr.size() );
assertTrue( nhr.contains( m_a ));
}
// Internal implementation methods
//////////////////////////////////
private void testPath( OntTools.Path path, Property[] expected ) {
assertEquals( expected.length, path.size() );
int i = 0;
for ( Statement aPath : path )
{
assertEquals( "path position: " + i, expected[i], aPath.getPredicate() );
i++;
}
}
//==============================================================================
// Inner class definitions
//==============================================================================
}