blob: 3c4636b919663383cb6f8627a3c289ccacc40bac [file] [log] [blame]
package org.apache.rya.reasoning;
/*
* 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.
*/
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.util.ArrayList;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.eclipse.rdf4j.model.vocabulary.OWL;
import org.eclipse.rdf4j.model.vocabulary.RDFS;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class ReasonerFactTest {
static final String wordnet = "http://www.w3.org/2006/03/wn/wn20/instances/";
static final String wnSchema = "http://www.w3.org/2006/03/wn/wn20/schema/";
static final IRI[] nodes = {
TestUtils.uri(wordnet, "synset-entity-noun-1"),
TestUtils.uri(wordnet, "synset-physical_entity-noun-1"),
TestUtils.uri(wordnet, "synset-object-noun-1"),
TestUtils.uri(wordnet, "synset-whole-noun-2"),
TestUtils.uri(wordnet, "synset-living_thing-noun-1"),
TestUtils.uri(wordnet, "synset-organism-noun-1"),
TestUtils.uri(wordnet, "synset-person-noun-1"),
TestUtils.uri(wordnet, "synset-engineer-noun-1"),
TestUtils.uri(wordnet, "synset-programmer-noun-1")
};
static final IRI hyper = TestUtils.uri(wnSchema, "hypernymOf");
static final Schema schema = new Schema();
static final ArrayList<ArrayList<Fact>> hierarchy = new ArrayList<>();
static final int MAX_LEVEL = 3;
static Fact connect(int i, int j) {
return new Fact(nodes[i], hyper, nodes[j]);
}
static Fact connectTransitive(int i, int j, int source, int t) {
return new Fact(nodes[i], hyper, nodes[j], t, OwlRule.PRP_TRP,
nodes[source]);
}
@Before
public void buildHierarchy() {
hierarchy.add(new ArrayList<Fact>());
int max = 8;
for (int i = 0; i < max; i++) {
hierarchy.get(0).add(connect(i, i+1));
}
for (int level = 1; level <= MAX_LEVEL; level++) {
max = max / 2;
hierarchy.add(new ArrayList<Fact>());
int d = (int) Math.pow(2, level);
for (int i = 0; i < max; i++) {
Fact fact = connectTransitive(i*d, (i*d)+d, (i*d)+(d/2), level);
ArrayList<Fact> previousLevel = hierarchy.get(level-1);
Fact sourceA = previousLevel.get(i*2);
Fact sourceB = previousLevel.get((i*2)+1);
fact.addSource(sourceA);
fact.addSource(sourceB);
hierarchy.get(level).add(fact);
}
}
}
@Test
public void testBaseSpan() {
Assert.assertEquals("Input triple should have span=1",
1, hierarchy.get(0).get(0).span());
}
@Test
public void testSpan() {
Assert.assertEquals("Iteration 1 triple should have span=2",
2, hierarchy.get(1).get(0).span());
}
@Test
public void testMultilevelSpan() {
Assert.assertEquals("Iteration 3 triple should have span=8",
8, hierarchy.get(3).get(0).span());
}
@Test
public void testSourceNodes() {
Assert.assertTrue("Transitive link 0 to 4 should have source nodes 1-3",
hierarchy.get(2).get(0).derivation.sourceNodes.contains(nodes[1]) &&
hierarchy.get(2).get(0).derivation.sourceNodes.contains(nodes[2]) &&
hierarchy.get(2).get(0).derivation.sourceNodes.contains(nodes[3]) &&
hierarchy.get(2).get(0).derivation.sourceNodes.size() == 3);
}
@Test
public void testTripleEquality() {
Fact a = hierarchy.get(2).get(0);
String s = a.getSubject().stringValue();
String p = a.getPredicate().stringValue();
String o = a.getObject().stringValue();
Fact b = new Fact(TestUtils.uri("", s),
TestUtils.uri("", p), TestUtils.uri("", o));
Assert.assertEquals("Triple equality should be based on (s, p, o) alone", a, b);
}
@Test
public void testTripleHashCode() {
Fact a = hierarchy.get(2).get(0);
String s = a.getSubject().stringValue();
String p = a.getPredicate().stringValue();
String o = a.getObject().stringValue();
Fact b = new Fact(TestUtils.uri("", s),
TestUtils.uri("", p), TestUtils.uri("", o));
Assert.assertEquals("hashCode should be based on (s, p, o) alone",
a.hashCode(), b.hashCode());
}
@Test
public void testTripleInequality() {
Fact a = hierarchy.get(2).get(0);
Fact b = a.clone();
Statement stmt = SimpleValueFactory.getInstance().createStatement(TestUtils.uri(a.getSubject().stringValue()),
a.getPredicate(), a.getObject()); // subject will have extra prefix
b.setTriple(stmt);
Assert.assertFalse("Triple equality should be based on (s, p, o)", a.equals(b));
}
@Test
public void testClone() {
Fact a = hierarchy.get(2).get(0);
Fact b = a.clone();
Assert.assertEquals("clone should equal() original", a, b);
Assert.assertEquals("clone.subject should be equal to original",
a.getSubject(), b.getSubject());
Assert.assertEquals("clone.predicate should be equal to original",
a.getPredicate(), b.getPredicate());
Assert.assertEquals("clone.object should be equal to original",
a.getObject(), b.getObject());
Assert.assertEquals("clone.derivation should be equal to original",
a.getDerivation(), b.getDerivation());
Assert.assertEquals("clone.useful should be equal to original",
a.isUseful(), b.isUseful());
Assert.assertEquals("clone.span() should equal original",
a.span(), b.span());
}
@Test
public void testSerializeDeserialize() throws Exception {
Fact a = hierarchy.get(2).get(0);
Fact b = new Fact();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
a.write(new DataOutputStream(bytes));
b.readFields(new DataInputStream(new ByteArrayInputStream(bytes.toByteArray())));
Assert.assertEquals("deserialized triple should equal() original", a, b);
Assert.assertEquals("deserialized subject should be equal to original",
a.getSubject(), b.getSubject());
Assert.assertEquals("deserialized predicate should be equal to original",
a.getPredicate(), b.getPredicate());
Assert.assertEquals("deserialized object should be equal to original",
a.getObject(), b.getObject());
Assert.assertEquals("deserialized derivation should be equal to original",
a.getDerivation(), b.getDerivation());
Assert.assertEquals("deserialized useful should be equal to original",
a.isUseful(), b.isUseful());
Assert.assertEquals("deserialized span() should equal original", a.span(), b.span());
}
@Test
public void testSerializeDeserializeString() throws Exception {
Fact a = TestUtils.fact(hyper, TestUtils.uri(wnSchema, "gloss"),
TestUtils.stringLiteral("(a word that is more generic than a given word)"));
Fact b = new Fact();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
a.write(new DataOutputStream(bytes));
b.readFields(new DataInputStream(new ByteArrayInputStream(bytes.toByteArray())));
Assert.assertEquals("deserialized triple should equal() original", a, b);
Assert.assertEquals("deserialized subject should be equal to original",
a.getSubject(), b.getSubject());
Assert.assertEquals("deserialized predicate should be equal to original",
a.getPredicate(), b.getPredicate());
Assert.assertEquals("deserialized object should be equal to original",
a.getObject(), b.getObject());
Assert.assertEquals("deserialized derivation should be equal to original",
a.getDerivation(), b.getDerivation());
Assert.assertEquals("deserialized useful should be equal to original",
a.isUseful(), b.isUseful());
Assert.assertEquals("deserialized span() should equal original", a.span(), b.span());
}
@Test
public void testSerializeDeserializeLanguage() throws Exception {
Fact a = TestUtils.fact(hyper, TestUtils.uri(wnSchema, "gloss"),
TestUtils.stringLiteral("(a word that is more generic than a given word)", "e"));
Fact b = new Fact();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
a.write(new DataOutputStream(bytes));
b.readFields(new DataInputStream(new ByteArrayInputStream(bytes.toByteArray())));
Assert.assertEquals("deserialized triple should equal() original", a, b);
Assert.assertEquals("deserialized subject should be equal to original",
a.getSubject(), b.getSubject());
Assert.assertEquals("deserialized predicate should be equal to original",
a.getPredicate(), b.getPredicate());
Assert.assertEquals("deserialized object should be equal to original",
a.getObject(), b.getObject());
Assert.assertEquals("deserialized derivation should be equal to original",
a.getDerivation(), b.getDerivation());
Assert.assertEquals("deserialized useful should be equal to original",
a.isUseful(), b.isUseful());
Assert.assertEquals("deserialized span() should equal original", a.span(), b.span());
}
@Test
public void testSerializeDeserializeInt() throws Exception {
Fact a = TestUtils.fact(TestUtils.uri(wnSchema, "inSynset"),
OWL.MAXCARDINALITY,
TestUtils.intLiteral("1"));
Fact b = new Fact();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
a.write(new DataOutputStream(bytes));
b.readFields(new DataInputStream(new ByteArrayInputStream(bytes.toByteArray())));
Assert.assertEquals("deserialized triple should equal() original", a, b);
Assert.assertEquals("deserialized subject should be equal to original",
a.getSubject(), b.getSubject());
Assert.assertEquals("deserialized predicate should be equal to original",
a.getPredicate(), b.getPredicate());
Assert.assertEquals("deserialized object should be equal to original",
a.getObject(), b.getObject());
Assert.assertEquals("deserialized derivation should be equal to original",
a.getDerivation(), b.getDerivation());
Assert.assertEquals("deserialized useful should be equal to original",
a.isUseful(), b.isUseful());
Assert.assertEquals("deserialized span() should equal original", a.span(), b.span());
}
@Test
public void testSerializeDeserializeBnode() throws Exception {
Fact a = TestUtils.fact(TestUtils.bnode("foo"),
RDFS.SUBCLASSOF, TestUtils.bnode("bar"));
Fact b = new Fact();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
a.write(new DataOutputStream(bytes));
b.readFields(new DataInputStream(new ByteArrayInputStream(bytes.toByteArray())));
Assert.assertEquals("deserialized triple should equal() original", a, b);
Assert.assertEquals("deserialized subject should be equal to original",
a.getSubject(), b.getSubject());
Assert.assertEquals("deserialized predicate should be equal to original",
a.getPredicate(), b.getPredicate());
Assert.assertEquals("deserialized object should be equal to original",
a.getObject(), b.getObject());
Assert.assertEquals("deserialized derivation should be equal to original",
a.getDerivation(), b.getDerivation());
Assert.assertEquals("deserialized useful should be equal to original",
a.isUseful(), b.isUseful());
Assert.assertEquals("deserialized span() should equal original", a.span(), b.span());
}
}