/** * This file is part of General Entity Annotator Benchmark. * * General Entity Annotator Benchmark is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * General Entity Annotator Benchmark is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with General Entity Annotator Benchmark. If not, see <http://www.gnu.org/licenses/>. */ package org.aksw.gerbil.semantic.kb; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Random; import org.aksw.gerbil.semantic.subclass.ClassNode; import org.aksw.gerbil.semantic.subclass.ClassSet; import org.aksw.gerbil.semantic.subclass.ClassifiedClassNode; import org.aksw.gerbil.semantic.subclass.ClassifyingClassNodeFactory; import org.aksw.gerbil.semantic.subclass.SimpleClassNode; import org.aksw.gerbil.semantic.subclass.SimpleClassNodeFactory; import org.aksw.gerbil.semantic.subclass.SimpleClassSet; import org.aksw.gerbil.semantic.subclass.SimpleSubClassInferencerFactory; import org.aksw.gerbil.semantic.subclass.SubClassInferencer; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import com.hp.hpl.jena.rdf.model.InfModel; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.rdf.model.impl.ResourceImpl; import com.hp.hpl.jena.reasoner.Derivation; import com.hp.hpl.jena.reasoner.Reasoner; import com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner; import com.hp.hpl.jena.reasoner.rulesys.Rule; import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.RDF; import com.hp.hpl.jena.vocabulary.RDFS; @RunWith(Parameterized.class) public class SimpleSubClassInferencerTest { @Parameters public static Collection<Object[]> data() { List<Object[]> testConfigs = new ArrayList<Object[]>(); // The extractor returns nothing testConfigs.add(new Object[] { "http://example.org/A", new SimpleClassNode[] { new SimpleClassNode("http://example.org/A"), new SimpleClassNode("http://example.org/B"), new SimpleClassNode("http://example2.org/D"), new SimpleClassNode("http://example3.org/D"), new SimpleClassNode(new HashSet<String>(Arrays.asList("http://example.org/C", "http://example2.org/C", "http://example3.org/C"))) } }); testConfigs.add(new Object[] { "http://example2.org/C", new SimpleClassNode[] { new SimpleClassNode("http://example2.org/D"), new SimpleClassNode("http://example3.org/D"), new SimpleClassNode(new HashSet<String>(Arrays.asList("http://example.org/C", "http://example2.org/C", "http://example3.org/C"))) } }); testConfigs.add(new Object[] { "http://example2.org/D", new SimpleClassNode[] { new SimpleClassNode("http://example2.org/D") } }); return testConfigs; } public static void main(String[] args) { // String rules = // "[sameAsRule: (?a owl:sameAs ?b) -> (?a owl:equivalentClass ?b)]\n[eqClassRule: (?a owl:equivalentClass ?b) -> (?b owl:equivalentClass ?a)]\n[subClass1: (?a rdfs:subClassOf ?b), (?a owl:sameAs ?c) -> (?c rdfs:subClassOf ?b)]\n[subClass1: (?a rdfs:subClassOf ?b), (?a owl:equivalentClass ?c) -> (?c rdfs:subClassOf ?b)]\n[subClass3: (?a rdfs:subClassOf ?b), (?b rdfs:subClassOf ?c) -> (?a rdfs:subClassOf ?c)]"; String rules = "[sameAsReplaceRule: (?a owl:sameAs ?b) -> (?a owl:equivalentClass ?b), (?b owl:equivalentClass ?a)][eqClassRule1: (?a owl:equivalentClass ?b) -> (?b owl:equivalentClass ?a)][eqClassRule2: (?a owl:equivalentClass ?b), (?b owl:equivalentClass ?c) -> (?a owl:equivalentClass ?c), (?c owl:equivalentClass ?a)][subClass1: (?a rdfs:subClassOf ?b), (?a owl:equivalentClass ?c) -> (?c rdfs:subClassOf ?b)][subClass2: (?a rdfs:subClassOf ?b), (?b owl:equivalentClass ?c) -> (?a rdfs:subClassOf ?c)][subClass3: (?a rdfs:subClassOf ?b), (?b rdfs:subClassOf ?c) -> (?a rdfs:subClassOf ?c)]"; Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules)); // Reasoner reasoner = ReasonerRegistry.getOWLReasoner(); // reasoner.bindSchema(rawData); // Reasoner reasoner = ReasonerRegistry.getRDFSReasoner(); reasoner.setDerivationLogging(true); InfModel inf = ModelFactory.createInfModel(reasoner, createModel()); Resource A = new ResourceImpl("http://example.org/A"); PrintWriter out = new PrintWriter(System.out); for (StmtIterator i = inf.listStatements(null, RDFS.subClassOf, A); i.hasNext();) { Statement s = i.nextStatement(); System.out.println("Statement is " + s); Iterator<Derivation> iterator = inf.getDerivation(s); if (iterator != null) { while (iterator.hasNext()) { iterator.next().printTrace(out, true); } } } out.flush(); Resource C2 = new ResourceImpl("http://example2.org/C"); for (StmtIterator i = inf.listStatements(null, OWL.equivalentClass, C2); i.hasNext();) { Statement s = i.nextStatement(); System.out.println("Statement is " + s); Iterator<Derivation> iterator = inf.getDerivation(s); if (iterator != null) { while (iterator.hasNext()) { iterator.next().printTrace(out, true); } } } out.flush(); } private String classUri; private SimpleClassNode expectedNodes[]; private Random rand = new Random(); public SimpleSubClassInferencerTest(String classUri, SimpleClassNode[] expectedNodes) { this.classUri = classUri; this.expectedNodes = expectedNodes; } @Test public void testInference() { SubClassInferencer inferencer = SimpleSubClassInferencerFactory.createInferencer(createModel()); ClassSet classes = new SimpleClassSet(); inferencer.inferSubClasses(classUri, classes, new SimpleClassNodeFactory()); ClassNode node; for (int i = 0; i < expectedNodes.length; ++i) { node = classes.getNode(expectedNodes[i].getUris().iterator().next()); Assert.assertEquals(expectedNodes[i], node); } } @Test public void testInferenceWithClassification() { SubClassInferencer inferencer = SimpleSubClassInferencerFactory.createInferencer(createModel()); ClassSet classes = new SimpleClassSet(); int classId = rand.nextInt(); inferencer.inferSubClasses(classUri, classes, new ClassifyingClassNodeFactory(classId)); ClassNode node; for (int i = 0; i < expectedNodes.length; ++i) { node = classes.getNode(expectedNodes[i].getUris().iterator().next()); Assert.assertEquals(expectedNodes[i], node); Assert.assertTrue(((ClassifiedClassNode) node).getClassIds().contains(classId)); } } private static Model createModel() { Model classModel = ModelFactory.createDefaultModel(); Resource A = classModel.createResource("http://example.org/A"); Resource B = classModel.createResource("http://example.org/B"); Resource C = classModel.createResource("http://example.org/C"); Resource C2 = classModel.createResource("http://example2.org/C"); Resource C3 = classModel.createResource("http://example3.org/C"); Resource D2 = classModel.createResource("http://example2.org/D"); Resource D3 = classModel.createResource("http://example3.org/D"); classModel.add(A, RDF.type, RDFS.Class); classModel.add(B, RDF.type, RDFS.Class); classModel.add(C, RDF.type, RDFS.Class); classModel.add(C2, RDF.type, RDFS.Class); classModel.add(C3, RDF.type, RDFS.Class); classModel.add(D2, RDF.type, RDFS.Class); classModel.add(D3, RDF.type, RDFS.Class); classModel.add(B, RDFS.subClassOf, A); classModel.add(C, RDFS.subClassOf, B); classModel.add(C, OWL.sameAs, C2); classModel.add(C3, OWL.equivalentClass, C); classModel.add(D2, RDFS.subClassOf, C2); classModel.add(D3, RDFS.subClassOf, C3); return classModel; } }