/* * Copyright (c) 2009, MediaEvent Services GmbH & Co. KG * http://mediaeventservices.com * * This file is part of Marbles. * * Marbles is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Marbles 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Marbles. If not, see <http://www.gnu.org/licenses/>. * */ package de.fuberlin.wiwiss.marbles; import static org.junit.Assert.*; import info.aduna.iteration.CloseableIteration; import info.aduna.iteration.Iterations; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openrdf.model.Literal; import org.openrdf.model.Resource; import org.openrdf.model.Statement; import org.openrdf.model.URI; import org.openrdf.model.Value; import org.openrdf.model.ValueFactory; import org.openrdf.model.vocabulary.OWL; import org.openrdf.repository.Repository; import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; import org.openrdf.repository.RepositoryResult; import org.openrdf.repository.sail.SailRepository; import org.openrdf.rio.RDFFormat; import org.openrdf.rio.RDFParseException; import org.openrdf.sail.SailException; import org.openrdf.sail.inferencer.InferencerConnection; import org.openrdf.sail.nativerdf.NativeStore; import org.openrdf.sail.nativerdf.model.NativeLiteral; import org.openrdf.sail.rdbms.mysql.MySqlStore; /** * Testcases for the SameAsInferencer * * @author Christian Becker */ public class SameAsInferencerTest { /** * Path to an empty directory to use for the native store */ final String dbPath = "/Users/Christian/Desktop/Diplomarbeit/data/inferencerTest"; /* Namespaces */ final String geoNamesNS = "http://www.geonames.org/ontology#"; final String dbpediaNS = "http://dbpedia.org/property/"; SameAsInferencer inferencer; Repository dataRepo; RepositoryConnection repoConn; ValueFactory valueFactory; /* Subjects */ URI DBpediaMet, DBpediaImage, geoNamesMet; @BeforeClass public static void classSetup() throws RepositoryException { org.apache.log4j.BasicConfigurator.configure(); } /** * Add data, then sameAs (with delayed autoCommit) * @throws RepositoryException */ @Test public void testInference1() throws RepositoryException { repoConn.setAutoCommit(false); String metName = "Metropolitan Museum of Art"; assertFalse(repoConn.hasStatement((Resource)null, null, null, false)); /* Alias resource as a subject */ repoConn.add(geoNamesMet, valueFactory.createURI(geoNamesNS, "name"), valueFactory.createLiteral(metName)); /* Base resource as object */ repoConn.add(DBpediaImage, valueFactory.createURI(dbpediaNS, "museum"), DBpediaMet); repoConn.add(DBpediaMet, OWL.SAMEAS, geoNamesMet); repoConn.setAutoCommit(true); /* Test: Alias resource as a subject */ List<Statement> statements = repoConn.getStatements(DBpediaMet, valueFactory.createURI(geoNamesNS, "name"), null, true).asList(); assertEquals(statements.size(), 1); Statement st = statements.get(0); Literal obj = (Literal) st.getObject(); assertEquals(obj.getLabel(), metName); /* Test: Base resource as object */ statements = repoConn.getStatements(null, valueFactory.createURI(dbpediaNS, "museum"), geoNamesMet, true).asList(); assertEquals(statements.size(), 1); st = statements.get(0); assertEquals(st.getSubject(), DBpediaImage); } /** * Add sameAs, then data * @throws RepositoryException */ @Test public void testInference2() throws RepositoryException { String metName = "Metropolitan Museum of Art"; assertFalse(repoConn.hasStatement((Resource)null, null, null, false)); repoConn.add(DBpediaMet, OWL.SAMEAS, geoNamesMet); /* Alias resource as a subject */ repoConn.add(geoNamesMet, valueFactory.createURI(geoNamesNS, "name"), valueFactory.createLiteral(metName)); /* Base resource as object */ repoConn.add(DBpediaImage, valueFactory.createURI(dbpediaNS, "museum"), DBpediaMet); /* Test: Alias resource as a subject */ List<Statement> statements = repoConn.getStatements(DBpediaMet, valueFactory.createURI(geoNamesNS, "name"), null, true).asList(); assertEquals(statements.size(), 1); Statement st = statements.get(0); Literal obj = (Literal) st.getObject(); assertEquals(obj.getLabel(), metName); /* Test: Base resource as object */ statements = repoConn.getStatements(null, valueFactory.createURI(dbpediaNS, "museum"), geoNamesMet, true).asList(); assertEquals(statements.size(), 1); st = statements.get(0); assertEquals(st.getSubject(), DBpediaImage); } /** * Manual initialization * @throws RepositoryException * @throws SailException */ @Test public void testInference3() throws RepositoryException, SailException { String metName = "Metropolitan Museum of Art"; assertFalse(repoConn.hasStatement((Resource)null, null, null, false)); inferencer.setAutoInference(false); repoConn.add(DBpediaMet, OWL.SAMEAS, geoNamesMet); /* Alias resource as a subject */ repoConn.add(geoNamesMet, valueFactory.createURI(geoNamesNS, "name"), valueFactory.createLiteral(metName)); /* Base resource as object */ repoConn.add(DBpediaImage, valueFactory.createURI(dbpediaNS, "museum"), DBpediaMet); inferencer.addInferredForResource(DBpediaMet); /* Test: Alias resource as a subject */ List<Statement> statements = repoConn.getStatements(DBpediaMet, valueFactory.createURI(geoNamesNS, "name"), null, true).asList(); assertEquals(statements.size(), 1); Statement st = statements.get(0); Literal obj = (Literal) st.getObject(); assertEquals(obj.getLabel(), metName); /* Test: Base resource as object */ statements = repoConn.getStatements(null, valueFactory.createURI(dbpediaNS, "museum"), geoNamesMet, true).asList(); assertEquals(statements.size(), 1); st = statements.get(0); assertEquals(st.getSubject(), DBpediaImage); } /** * Test with real data * @throws RepositoryException * @throws SailException * @throws RDFParseException * @throws MalformedURLException */ @Test public void testInference4() throws RepositoryException, SailException, RDFParseException, MalformedURLException { loadRDFURL(new URL("http://dbpedia.org/data/Brandenburg_Gate")); loadRDFURL(new URL("http://revyu.com/sparql?query=PREFIX+rev%3A+%3Chttp%3A%2F%2Fpurl.org%2Fstuff%2Frev%23%3E%0D%0APREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0D%0APREFIX+owl%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2002%2F07%2Fowl%23%3E+%0D%0A%0D%0ACONSTRUCT+%7B%0D%0A+%3Frev+%3Fp+%3Fo+.%0D%0A+%3Fthing+%3Fq+%3Fr%0D%0A%7D%0D%0AWHERE%0D%0A%7B%0D%0A++%3Fthing+owl%3AsameAs+%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FBrandenburg_Gate%3E+.%0D%0A++%3Fthing+rev%3AhasReview+%3Frev+.%0D%0A++%3Frev+%3Fp+%3Fo+.%0D%0A++%3Fthing+%3Fq+%3Fr%0D%0A%7D")); Resource bbDBpedia = valueFactory.createURI("http://dbpedia.org/resource/Brandenburg_Gate"); Resource bbRevyu = valueFactory.createURI("http://revyu.com/things/brandenburg-gate-berlin-tourism"); assertTrue(repoConn.hasStatement(bbRevyu, valueFactory.createURI("http://purl.org/stuff/rev#hasReview"), null, false)); assertTrue(repoConn.hasStatement(bbDBpedia, null, null, false)); assertTrue(repoConn.hasStatement(bbDBpedia, valueFactory.createURI("http://purl.org/stuff/rev#hasReview"), null, true)); } @Before public void setUp() throws Exception { inferencer = new SameAsInferencer(new NativeStore(new File(dbPath))); /*MySqlStore myStore = new MySqlStore("DBpediaMobile"); myStore.setServerName("localhost"); myStore.setUser("dbpedia"); myStore.setPassword("dbpedia"); inferencer = new SameAsInferencer(myStore);*/ dataRepo = new SailRepository(inferencer); dataRepo.initialize(); repoConn = dataRepo.getConnection(); valueFactory = dataRepo.getValueFactory(); DBpediaMet = valueFactory.createURI("http://dbpedia.org/resource/Metropolitan_Museum_of_Art"); DBpediaImage = valueFactory.createURI("http://dbpedia.org/resource/A_Girl_Asleep_%28Vermeer%29"); geoNamesMet = valueFactory.createURI("http://sws.geonames.org/5126698/"); repoConn.remove((Resource)null, null, null); /* rest store */ repoConn.commit(); System.out.println(repoConn.hasStatement((Resource)null, null, null, false)); inferencer.setAutoInference(true); } @After public void tearDown() throws Exception { System.out.println("shutdown"); repoConn.commit(); repoConn.close(); dataRepo.shutDown(); } private void loadRDFURL(URL url) throws RDFParseException, RepositoryException { URI urlContext = valueFactory.createURI(url.toString()); try { URLConnection urlConn = url.openConnection(); urlConn.setRequestProperty("Accept", "application/rdf+xml"); InputStream is = urlConn.getInputStream(); /* Read data */ repoConn.add(is, url.toString() /* baseURI */, RDFFormat.RDFXML, urlContext); is.close(); repoConn.commit(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }