| /* |
| * 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 org.apache.rya.reasoning; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.DataInputStream; |
| import java.io.DataOutput; |
| import java.io.DataOutputStream; |
| import java.io.ObjectOutputStream; |
| import java.io.Serializable; |
| |
| import org.apache.rya.reasoning.mr.SchemaWritable; |
| |
| import org.eclipse.rdf4j.model.IRI; |
| import org.eclipse.rdf4j.model.Resource; |
| import org.eclipse.rdf4j.model.vocabulary.OWL; |
| import org.eclipse.rdf4j.model.vocabulary.RDF; |
| import org.eclipse.rdf4j.model.vocabulary.RDFS; |
| import org.eclipse.rdf4j.model.vocabulary.SKOS; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| public class SchemaTest implements Serializable { |
| private static final long serialVersionUID = -3616030386119902719L; |
| |
| IRI lubm(String s) { |
| return TestUtils.uri("http://swat.cse.lehigh.edu/onto/univ-bench.owl", s); |
| } |
| |
| // Recognize useful schema data |
| @Test |
| public void testAcceptSubclass() throws Exception { |
| Assert.assertTrue(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("Lecturer"), RDFS.SUBCLASSOF, lubm("Faculty")))); |
| } |
| @Test |
| public void testAcceptSubproperty() throws Exception { |
| Assert.assertTrue(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("mastersDegreeFrom"), RDFS.SUBPROPERTYOF, lubm("degreeFrom")))); |
| } |
| @Test |
| public void testAcceptDomain() throws Exception { |
| Assert.assertTrue(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("degreeFrom"), RDFS.DOMAIN, lubm("Person")))); |
| } |
| @Test |
| public void testAcceptRange() throws Exception { |
| Assert.assertTrue(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("degreeFrom"), RDFS.RANGE, lubm("University")))); |
| } |
| @Test |
| public void testAcceptInverse() throws Exception { |
| Assert.assertTrue(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("degreeFrom"), OWL.INVERSEOF, lubm("hasAlumnus")))); |
| } |
| |
| // Reject trivial schema information |
| @Test |
| public void testRejectClassAssertion() throws Exception { |
| Assert.assertFalse(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("TeachingAssistant"), RDF.TYPE, OWL.CLASS))); |
| } |
| @Test |
| public void testRejectObjectPropertyAssertion() throws Exception { |
| Assert.assertFalse(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("researchProject"), RDF.TYPE, OWL.OBJECTPROPERTY))); |
| } |
| @Test |
| public void testRejectDatatypePropertyAssertion() throws Exception { |
| Assert.assertFalse(Schema.isSchemaTriple(TestUtils.statement( |
| lubm("researchInterest"), RDF.TYPE, OWL.DATATYPEPROPERTY))); |
| } |
| |
| // Save and retrieve schema information correctly. |
| @Test |
| public void testInputSubclass() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(lubm("Dean"), |
| RDFS.SUBCLASSOF, lubm("Professor"))); |
| Assert.assertTrue("Professor should be a superclass of Dean", |
| schema.getClass(lubm("Dean")).getSuperClasses().contains(lubm("Professor"))); |
| } |
| @Test |
| public void testInputDisjointClass() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(SKOS.CONCEPT, |
| OWL.DISJOINTWITH, SKOS.COLLECTION)); |
| Assert.assertTrue("(x disjointWith y): y not found in x's disjoint classes", |
| schema.getClass(SKOS.CONCEPT).getDisjointClasses().contains(SKOS.COLLECTION)); |
| } |
| @Test |
| public void testInputDisjointClassReverse() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(SKOS.CONCEPT, |
| OWL.DISJOINTWITH, SKOS.COLLECTION)); |
| Assert.assertTrue("(x disjointWith y): x not found in y's disjoint classes", |
| schema.getClass(SKOS.COLLECTION).getDisjointClasses().contains(SKOS.CONCEPT)); |
| } |
| @Test |
| public void testInputComplementaryClass() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("A"), |
| OWL.COMPLEMENTOF, TestUtils.uri("NotA"))); |
| Assert.assertTrue("(x complementOf y): y not found in x's complementary classes", |
| schema.getClass(TestUtils.uri("A")).getComplementaryClasses().contains(TestUtils.uri("NotA"))); |
| } |
| @Test |
| public void testInputComplementaryClassReverse() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("A"), |
| OWL.COMPLEMENTOF, TestUtils.uri("NotA"))); |
| Assert.assertTrue("(x complementOf y): x not found in y's complementary classes", |
| schema.getClass(TestUtils.uri("NotA")).getComplementaryClasses().contains(TestUtils.uri("A"))); |
| } |
| |
| @Test |
| public void testInputSubproperty() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(lubm("worksFor"), |
| RDFS.SUBPROPERTYOF, lubm("memberOf"))); |
| Assert.assertTrue("memberOf should be a superproperty of worksFor", |
| schema.getProperty(lubm("worksFor")).getSuperProperties().contains(lubm("memberOf"))); |
| } |
| @Test |
| public void testInputDomain() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(lubm("hasAlumnus"), |
| RDFS.DOMAIN, lubm("University"))); |
| Assert.assertTrue("Domain information not correctly returned", |
| schema.getProperty(lubm("hasAlumnus")).getDomain().contains(lubm("University"))); |
| } |
| @Test |
| public void testInputRange() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(lubm("advisor"), RDFS.RANGE, lubm("Professor"))); |
| Assert.assertTrue("Range information not correctly returned", |
| schema.getProperty(lubm("advisor")).getRange().contains(lubm("Professor"))); |
| } |
| @Test |
| public void testInputInverse() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(lubm("memberOf"), |
| OWL.INVERSEOF, lubm("memberOf"))); |
| Assert.assertTrue("inverseOf relation not returned", |
| schema.getProperty(lubm("memberOf")).getInverseProperties().contains(lubm("memberOf"))); |
| } |
| @Test |
| public void testInputInverseReverse() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(lubm("memberOf"), |
| OWL.INVERSEOF, lubm("memberOf"))); |
| Assert.assertTrue("symmetric inverseOf relation not returned", |
| schema.getProperty(lubm("memberOf")).getInverseProperties().contains(lubm("memberOf"))); |
| } |
| @Test |
| public void testInputSymmetric() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(SKOS.RELATED, |
| RDF.TYPE, OWL.SYMMETRICPROPERTY)); |
| Assert.assertTrue("Property should be identified as symmetric", |
| schema.getProperty(SKOS.RELATED).isSymmetric()); |
| } |
| @Test |
| public void testInputAsymmetric() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("hasChild"), |
| RDF.TYPE, OWL2.ASYMMETRICPROPERTY)); |
| Assert.assertTrue("Property should be identified as asymmetric", |
| schema.getProperty(TestUtils.uri("hasChild")).isAsymmetric()); |
| } |
| @Test |
| public void testInputIrreflexive() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("hasParent"), |
| RDF.TYPE, OWL2.IRREFLEXIVEPROPERTY)); |
| Assert.assertTrue("Property should be identified as irreflexive", |
| schema.getProperty(TestUtils.uri("hasParent")).isIrreflexive()); |
| } |
| @Test |
| public void testInputTransitive() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(lubm("subOrganizationOf"), |
| RDF.TYPE, OWL.TRANSITIVEPROPERTY)); |
| Assert.assertTrue("Property should be identified as transitive", |
| schema.getProperty(lubm("subOrganizationOf")).isTransitive()); |
| } |
| @Test |
| public void testInputDisjointProperty() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("p1"), |
| OWL2.PROPERTYDISJOINTWITH, TestUtils.uri("p2"))); |
| Assert.assertTrue("(x propertyDisjointWith y): y not one of x's disjoint properties", |
| schema.getProperty(TestUtils.uri("p1")).getDisjointProperties().contains(TestUtils.uri("p2"))); |
| } |
| @Test |
| public void testInputDisjointPropertyReverse() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("p1"), |
| OWL2.PROPERTYDISJOINTWITH, TestUtils.uri("p2"))); |
| Assert.assertTrue("(x propertyDisjointWith y): x not one of y's disjoint properties", |
| schema.getProperty(TestUtils.uri("p2")).getDisjointProperties().contains(TestUtils.uri("p1"))); |
| } |
| |
| @Test |
| public void testInputOnPropertyRestriction() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("x"), |
| OWL.ONPROPERTY, lubm("headOf"))); |
| Assert.assertTrue("onProperty not returned for restriction x", |
| schema.getClass(TestUtils.uri("x")).getOnProperty().contains(lubm("headOf"))); |
| } |
| @Test |
| public void testInputOnPropertyReverse() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("x"), |
| OWL.ONPROPERTY, lubm("headOf"))); |
| Assert.assertTrue("onProperty restriction not returned given property", |
| schema.getProperty(lubm("headOf")).getRestrictions().contains(TestUtils.uri("x"))); |
| } |
| @Test |
| public void testInputSvfRestriction() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("x"), |
| OWL.SOMEVALUESFROM, lubm("Department"))); |
| Assert.assertTrue("target of someValuesFrom restriction not returned", |
| schema.getClass(TestUtils.uri("x")).someValuesFrom().contains(lubm("Department"))); |
| } |
| @Test |
| public void testInputAvfRestriction() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("x"), |
| OWL.ALLVALUESFROM, lubm("Department"))); |
| Assert.assertTrue("target of allValuesFrom restriction not returned", |
| schema.getClass(TestUtils.uri("x")).allValuesFrom().contains(lubm("Department"))); |
| } |
| @Test |
| public void testInputOnClassRestriction() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("x"), |
| OWL2.ONCLASS, lubm("Department"))); |
| Assert.assertTrue("onClass not returned for restriction x", |
| schema.getClass(TestUtils.uri("x")).onClass().contains(lubm("Department"))); |
| } |
| @Test |
| public void testInputHasValueRestriction() throws Exception { |
| Schema schema = new Schema(); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("x"), |
| OWL.HASVALUE, TestUtils.uri("y"))); |
| Assert.assertTrue("hasValue not returned for restriction x", |
| schema.getClass(TestUtils.uri("x")).hasValue().contains(TestUtils.uri("y"))); |
| } |
| |
| @Test |
| public void testWritabe() throws Exception { |
| Resource c1 = TestUtils.bnode("c1"); |
| Resource c2 = TestUtils.bnode("c2"); |
| ByteArrayOutputStream outToArray = null; |
| { |
| SchemaWritable schema = new SchemaWritable(); |
| // Load up as much variety to make sure it gets de/serialized. |
| schema.processTriple(TestUtils.statement(TestUtils.uri("x"), OWL.HASVALUE, TestUtils.uri("y"))); |
| schema.processTriple(TestUtils.statement(c1, OWL.SOMEVALUESFROM, TestUtils.uri("Organization"))); |
| schema.processTriple(TestUtils.statement(c1, OWL.ONPROPERTY, TestUtils.uri("worksFor"))); |
| schema.processTriple(TestUtils.statement(c2, OWL.SOMEVALUESFROM, TestUtils.uri("Organization"))); |
| schema.processTriple(TestUtils.statement(c2, OWL.ONPROPERTY, TestUtils.uri("memberOf"))); |
| schema.processTriple(TestUtils.statement(TestUtils.uri("worksFor"), RDFS.SUBPROPERTYOF, TestUtils.uri("memberOf"))); |
| schema.closure(); |
| |
| // now serialize and then read/deserialize |
| outToArray = new ByteArrayOutputStream(); |
| DataOutput out = new java.io.DataOutputStream(outToArray); |
| schema.write(out); |
| } |
| byte inputArray[] = outToArray.toByteArray(); |
| SchemaWritable schema2 = new SchemaWritable(); |
| schema2.readFields(new DataInputStream(new ByteArrayInputStream(inputArray))); |
| Assert.assertTrue("hasValue should be returned for restriction x after serializeing and deserializing.", schema2.getClass(TestUtils.uri("x")).hasValue().contains(TestUtils.uri("y"))); |
| Assert.assertTrue("[someValuesFrom y on <subproperty>] should be subclass of" + " [someValuesFrom y on <superproperty>]", schema2.getClass(c1).getSuperClasses().contains(c2)); |
| } |
| |
| @Test(expected = java.io.InvalidClassException.class) |
| public void testWritabeRejectWrongClass() throws Exception { |
| // String trouble = "Trouble"; |
| SchemaTest trouble = new SchemaTest(); |
| ByteArrayOutputStream bytes = new ByteArrayOutputStream(); |
| ObjectOutputStream stream = new ObjectOutputStream(bytes); |
| stream.writeObject(trouble); |
| stream.writeObject(trouble); |
| byte[] troubleArray = bytes.toByteArray(); |
| stream.close(); |
| final ByteArrayOutputStream outToArray = new ByteArrayOutputStream(); |
| DataOutputStream out = new DataOutputStream(outToArray); |
| out.writeInt(troubleArray.length); |
| out.write(troubleArray); |
| out.close(); |
| byte inputArray[] = outToArray.toByteArray(); |
| SchemaWritable schema2 = new SchemaWritable(); |
| schema2.readFields(new DataInputStream(new ByteArrayInputStream(inputArray))); |
| Assert.assertTrue("hasValue should be returned for restriction x after serializeing and deserializing.", schema2.getClass(TestUtils.uri("x")).hasValue().contains(TestUtils.uri("y"))); |
| } |
| |
| @Test |
| public void testInputMaxCardinality() throws Exception { |
| Schema schema = new Schema(); |
| IRI s = TestUtils.uri("x"); |
| IRI p = OWL.MAXCARDINALITY; |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("7"))); |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("4"))); |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("-1"))); |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("3"))); |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("5"))); |
| Assert.assertEquals("Incorrect value returned for maxCardinality", 3, |
| schema.getClass(s).getMaxCardinality()); |
| } |
| |
| @Test |
| public void testInputMaxQualifiedCardinality() throws Exception { |
| Schema schema = new Schema(); |
| IRI s = TestUtils.uri("x"); |
| IRI p = OWL2.MAXQUALIFIEDCARDINALITY; |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("-20"))); |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("100"))); |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("0"))); |
| schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("42"))); |
| Assert.assertEquals("Incorrect value returned for maxQualifiedCardinality", 0, |
| schema.getClass(s).getMaxQualifiedCardinality()); |
| } |
| } |