package com.google.refine.test.org.deri.reconcile.factories; import static org.testng.Assert.assertEquals; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; import com.google.refine.org.deri.reconcile.model.ReconciliationRequest; import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext; import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext.IdentifiedValueContext; import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext.PropertyContext; import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext.TextualValueContext; import com.google.refine.org.deri.reconcile.rdf.factories.PlainSparqlQueryFactory; public class PlainSparqlQueryFactoryTest { PlainSparqlQueryFactory factory = new PlainSparqlQueryFactory(); int limit = 3; String query = "The Godfather"; @Test public void oneLabelSimpleReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label"); ReconciliationRequest request = new ReconciliationRequest(query, limit); String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity ?label1 " + "WHERE" + "{" + "?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. " + "FILTER regex(str(?label1),'" + query + "','i'). " + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void oneLabelOneTypeReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label"); ReconciliationRequest request = new ReconciliationRequest(query, limit); request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film"}); String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity ?label1 " + "WHERE" + "{" + "?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. " + "FILTER regex(str(?label1),'" + query + "','i'). " + "?entity rdf:type <http://data.linkedmdb.org/resource/movie/film>. " + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void multiLabelsWithTypesReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label", "http://purl.org/dc/terms/title"); ReconciliationRequest request = new ReconciliationRequest(query, limit); request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film", "http://data.linkedmdb.org/resource/movie/film_series"}); String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity ?label1 ?label2 " + "WHERE" + "{" + "{" + "OPTIONAL{ ?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. " + "FILTER regex(str(?label1),'" + query + "','i')" + "}" + "OPTIONAL{ ?entity <http://purl.org/dc/terms/title> ?label2. " + "FILTER regex(str(?label2),'" + query + "','i')" + "}" + "FILTER ( bound(?label1) || bound(?label2))" + "}" + "{" + "{?entity rdf:type <http://data.linkedmdb.org/resource/movie/film>. } " + "UNION " + "{?entity rdf:type <http://data.linkedmdb.org/resource/movie/film_series>. } " + "}" + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void multiLabelsSimpleReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label", "http://purl.org/dc/terms/title"); ReconciliationRequest request = new ReconciliationRequest(query, limit); //this will assure that empty string for type is ignored request.setTypes(new String[] {""}); String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity ?label1 ?label2 " + "WHERE" + "{" + "{" + "OPTIONAL{ ?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. " + "FILTER regex(str(?label1),'" + query + "','i')" + "}" + "OPTIONAL{ ?entity <http://purl.org/dc/terms/title> ?label2. " + "FILTER regex(str(?label2),'" + query + "','i')" + "}" + "FILTER ( bound(?label1) || bound(?label2))" + "}" + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void oneLabelOneTypeExactMatchReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label"); ReconciliationRequest request = new ReconciliationRequest(query, limit); request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film"}); String sparql = factory.getExactMatchReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity " + "WHERE" + "{" + "?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label. FILTER (str(?label) = '" + query + "'). " + "?entity rdf:type <http://data.linkedmdb.org/resource/movie/film>. " + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void multiLabelsWithTypesExactMatchReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label", "http://purl.org/dc/terms/title"); ReconciliationRequest request = new ReconciliationRequest(query, limit); request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film", "http://data.linkedmdb.org/resource/movie/film_series"}); String sparql = factory.getExactMatchReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity " + "WHERE" + "{" + "{" + "{ ?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. FILTER (str(?label1) = '" + query + "'). " + "}UNION " + "{ ?entity <http://purl.org/dc/terms/title> ?label2. FILTER (str(?label2) = '" + query + "'). " + "}" + "}" + "{" + "{?entity rdf:type <http://data.linkedmdb.org/resource/movie/film>. } " + "UNION " + "{?entity rdf:type <http://data.linkedmdb.org/resource/movie/film_series>. } " + "}" + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void multiLabelsExactMatchReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label", "http://purl.org/dc/terms/title"); ReconciliationRequest request = new ReconciliationRequest(query, limit); String sparql = factory.getExactMatchReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity " + "WHERE" + "{" + "{" + "{ ?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. FILTER (str(?label1) = '" + query + "'). " + "}UNION " + "{ ?entity <http://purl.org/dc/terms/title> ?label2. FILTER (str(?label2) = '" + query + "'). " + "}" + "}" + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void multiLabelsWithTypeWithContextReconciliationTest(){ ReconciliationRequest request = new ReconciliationRequest(query, limit); request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film" , "http://data.linkedmdb.org/resource/movie/film_series"}); PropertyContext prop1 = new PropertyContext("http://example.org/ontology/worksFor", new IdentifiedValueContext("http://example.org/resource/DERI")); PropertyContext prop2 = new PropertyContext("http://xmlns.com/foaf/0.1/nick", new TextualValueContext("fadmaa")); request.setContext(new ReconciliationRequestContext(prop1, prop2)); ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label", "http://purl.org/dc/terms/title"); String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity ?label1 ?label2 " + "WHERE" + "{" + "{" + "OPTIONAL{ ?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. " + "FILTER regex(str(?label1),'" + query + "','i')" + "}" + "OPTIONAL{ ?entity <http://purl.org/dc/terms/title> ?label2. " + "FILTER regex(str(?label2),'" + query + "','i')" + "}" + "FILTER ( bound(?label1) || bound(?label2))" + "}" + "{" + "{?entity rdf:type <http://data.linkedmdb.org/resource/movie/film>. } " + "UNION " + "{?entity rdf:type <http://data.linkedmdb.org/resource/movie/film_series>. } " + "}" + "?entity <http://example.org/ontology/worksFor> <http://example.org/resource/DERI>. " + "?entity <http://xmlns.com/foaf/0.1/nick> 'fadmaa'. " + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } @Test public void oneLabelOneTypeWithContextExactMatchReconcileTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label"); ReconciliationRequest request = new ReconciliationRequest(query, limit); request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film"}); PropertyContext prop1 = new PropertyContext("http://example.org/ontology/worksFor", new IdentifiedValueContext("http://example.org/resource/DERI")); PropertyContext prop2 = new PropertyContext("http://xmlns.com/foaf/0.1/nick", new TextualValueContext("fadmaa")); request.setContext(new ReconciliationRequestContext(prop1, prop2)); String sparql = factory.getExactMatchReconciliationSparqlQuery(request, searchPropertyUris); String expected = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + "SELECT ?entity " + "WHERE" + "{" + "?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label. FILTER (str(?label) = '" + query + "'). " + "?entity rdf:type <http://data.linkedmdb.org/resource/movie/film>. " + "?entity <http://example.org/ontology/worksFor> <http://example.org/resource/DERI>. " + "?entity <http://xmlns.com/foaf/0.1/nick> 'fadmaa'. " + "FILTER isIRI(?entity). }LIMIT " +limit; assertEquals(sparql, expected); } /* * SUGGEST TYPE TESTS */ @Test public void suggestTypeTest(){ String prefix = "Pers"; String sparql = factory.getTypeSuggestSparqlQuery(prefix, limit); String expected = "SELECT DISTINCT ?type ?label " + "WHERE{" + "[] a ?type. " + "?type ?p ?label. " + "FILTER (?p=<http://www.w3.org/2000/01/rdf-schema#label> || ?p=<http://www.w3.org/2004/02/skos/core#prefLabel>). " + "FILTER regex(str(?label),'^" + prefix + "','i')" + "} LIMIT " + limit; assertEquals(sparql, expected); } /* * SUGGEST PROPERTY TESTS */ @Test public void suggestPropertyWithSpecificSiubjectsTypeTest(){ String prefix = "labe"; String typeUri = "http://xmlns.com/foaf/0.1/Person"; String sparql = factory.getPropertySuggestSparqlQuery(prefix, typeUri, limit); String expected = "SELECT DISTINCT ?p ?label " + "WHERE{" + "[] a <http://xmlns.com/foaf/0.1/Person>;" + "?p ?v." + "?p ?label_prop ?label. " + "FILTER (?label_prop=<http://www.w3.org/2000/01/rdf-schema#label> || ?label_prop=<http://www.w3.org/2004/02/skos/core#prefLabel>). " + "FILTER regex(str(?label),'^" + prefix + "','i')" + "} LIMIT " + limit; assertEquals(sparql, expected); } @Test public void suggestPropertyTest(){ String prefix = "labe"; String sparql = factory.getPropertySuggestSparqlQuery(prefix, limit); String expected = "SELECT DISTINCT ?p ?label " + "WHERE{" + "[] ?p ?v." + "?p ?label_prop ?label. " + "FILTER (?label_prop=<http://www.w3.org/2000/01/rdf-schema#label> || ?label_prop=<http://www.w3.org/2004/02/skos/core#prefLabel>). " + "FILTER regex(str(?label),'^" + prefix + "','i')" + "} LIMIT " + limit; assertEquals(sparql, expected); } /* * SAMPLE INSTANCES */ @Test public void sampleInstancesQueryTest(){ String sparql = factory.getSampleInstancesSparqlQuery("http://data.linkedmdb.org/resource/movie/film", ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label"), 10); String expected = "SELECT DISTINCT ?entity ?label1 " + "WHERE{" + "?entity a <http://data.linkedmdb.org/resource/movie/film>. " + "OPTIONAL {?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1} " + "}LIMIT 10" ; assertEquals(sparql, expected); } /* * search entity */ @Test public void searchEntityQueryTest(){ ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label", "http://www.w3.org/2004/02/skos/core#prefLabel"); String prefix = "fad"; String sparql = factory.getEntitySearchSparqlQuery(prefix, searchPropertyUris, limit); String expected = "SELECT ?entity ?label1 ?label2 " + "WHERE" + "{" + "OPTIONAL{ ?entity <http://www.w3.org/2000/01/rdf-schema#label> ?label1. " + "FILTER regex(str(?label1),'" + prefix + "','i')" + "}" + "OPTIONAL{ ?entity <http://www.w3.org/2004/02/skos/core#prefLabel> ?label2. " + "FILTER regex(str(?label2),'" + prefix + "','i')" + "}" + "FILTER ( bound(?label1) || bound(?label2)). " + "FILTER isIRI(?entity). }LIMIT " +limit; ; assertEquals(sparql, expected); } }