package com.google.refine.tests.rdf; import java.util.ArrayList; import java.util.List; import org.json.JSONObject; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import static org.testng.Assert.*; import com.google.refine.util.ParsingUtilities; import com.google.refine.rdf.CellLiteralNode; import com.google.refine.rdf.CellResourceNode; import com.google.refine.rdf.Link; import com.google.refine.rdf.Node; import com.google.refine.rdf.RdfSchema; import com.google.refine.rdf.ResourceNode; import com.google.refine.rdf.ResourceNode.RdfType; public class RdfSchemaTest { private RdfSchema schema; private CellResourceNode root; @BeforeClass public void init()throws Exception{ //see image in docs for the schema //String json = "{\"baseUri\":\"http://data.bis.gov.uk/data/organogram/2010-08-26/\",\"rootNodes\":[{\"nodeType\":\"cell-as-resource\",\"expression\":\"'http://reference.data.gov.uk/id/department/bis/post/' + value\",\"columnName\":\"Post unique reference\",\"rdfTypes\":[{\"uri\":\"http://reference.data.gov.uk/def/central-government/CivilServicePost\",\"curie\":\"gov:CivilServicePost\"}],\"links\":[{\"uri\":\"http://reference.data.gov.uk/def/central-government/heldBy\",\"curie\":\"http://reference.data.gov.uk/def/central-government/heldBy\",\"target\":{\"nodeType\":\"cell-as-resource\",\"columnIndex\":-1,\"expression\":\"('#person' + value).urlify(baseURI)\",\"isRowNumberCell\":true,\"rdfTypes\":[{\"uri\":\"http://xmlns.com/foaf/0.1/Person\",\"curie\":\"foaf:Person\"}],\"links\":[{\"uri\":\"http://xmlns.com/foaf/0.1/name\",\"curie\":\"foaf:name\",\"target\":{\"nodeType\":\"cell-as-literal\",\"columnIndex\":2,\"valueType\":\"untyped\",\"columnName\":\"Name\"}},{\"uri\":\"http://xmlns.com/foaf/0.1/mbox\",\"curie\":\"foaf:mbox\",\"target\":{\"nodeType\":\"cell-as-resource\",\"columnIndex\":12,\"expression\":\"'mailto:' + value\",\"isRowNumberCell\":false,\"columnName\":\"Contact e-mail\",\"rdfTypes\":[],\"links\":[]}}]}},{\"uri\":\"http://www.w3.org/2000/01/rdf-schema#label\",\"curie\":\"rdfs:label\",\"target\":{\"nodeType\":\"cell-as-literal\",\"columnIndex\":5,\"valueType\":\"untyped\",\"lang\":\"en\",\"columnName\":\"Job Title\"}},{\"uri\":\"http://reference.data.gov.uk/def/central-government/postIn\",\"curie\":\"http://reference.data.gov.uk/def/central-government/postIn\",\"target\":{\"nodeType\":\"cell-as-resource\",\"columnIndex\":10,\"expression\":\"value.urlify(baseURI)\",\"isRowNumberCell\":false,\"columnName\":\"Unit\",\"rdfTypes\":[],\"links\":[{\"uri\":\"http://reference.data.gov.uk/def/central-government/hasPost\",\"curie\":\"http://reference.data.gov.uk/def/central-government/hasPost\",\"target\":{\"nodeType\":\"cell-as-resource\",\"columnIndex\":0,\"expression\":\"'http://reference.data.gov.uk/id/department/bis/post/' + value\",\"isRowNumberCell\":false,\"columnName\":\"Post unique reference\",\"rdfTypes\":[],\"links\":[]}}]}}]}]}"; String json = "{\"baseUri\":\"http://data.bis.gov.uk/data/organogram/2010-08-26/\",\"rootNodes\":[{\"nodeType\":\"cell-as-resource\",\"isRowNumberCell\":false,\"expression\":\"'http://reference.data.gov.uk/id/department/bis/post/' + value\",\"columnName\":\"Post unique reference\",\"rdfTypes\":[{\"uri\":\"http://reference.data.gov.uk/def/central-government/CivilServicePost\",\"curie\":\"gov:CivilServicePost\"}],\"links\":[{\"uri\":\"http://reference.data.gov.uk/def/central-government/heldBy\",\"curie\":\"http://reference.data.gov.uk/def/central-government/heldBy\",\"target\":{\"nodeType\":\"cell-as-resource\",\"isRowNumberCell\":true,\"expression\":\"('#person' + value).urlify()\",\"rdfTypes\":[{\"uri\":\"http://xmlns.com/foaf/0.1/Person\",\"curie\":\"foaf:Person\"}],\"links\":[{\"uri\":\"http://xmlns.com/foaf/0.1/name\",\"curie\":\"foaf:name\",\"target\":{\"nodeType\":\"cell-as-literal\",\"isRowNumberCell\":false,\"columnName\":\"Name\"}},{\"uri\":\"http://xmlns.com/foaf/0.1/mbox\",\"curie\":\"foaf:mbox\",\"target\":{\"nodeType\":\"cell-as-resource\",\"isRowNumberCell\":false,\"expression\":\"'mailto:' + value\",\"columnName\":\"Contact e-mail\",\"rdfTypes\":[],\"links\":[]}}]}},{\"uri\":\"http://www.w3.org/2000/01/rdf-schema#label\",\"curie\":\"rdfs:label\",\"target\":{\"nodeType\":\"cell-as-literal\",\"isRowNumberCell\":false,\"lang\":\"en\",\"columnName\":\"Job Title\"}},{\"uri\":\"http://reference.data.gov.uk/def/central-government/postIn\",\"curie\":\"http://reference.data.gov.uk/def/central-government/postIn\",\"target\":{\"nodeType\":\"cell-as-resource\",\"isRowNumberCell\":false,\"expression\":\"value.urlify()\",\"columnName\":\"Unit\",\"rdfTypes\":[],\"links\":[{\"uri\":\"http://reference.data.gov.uk/def/central-government/hasPost\",\"curie\":\"http://reference.data.gov.uk/def/central-government/hasPost\",\"target\":{\"nodeType\":\"cell-as-resource\",\"isRowNumberCell\":false,\"expression\":\"'http://reference.data.gov.uk/id/department/bis/post/' + value\",\"columnName\":\"Post unique reference\",\"rdfTypes\":[],\"links\":[]}}]}}]}]}"; JSONObject o = ParsingUtilities.evaluateJsonStringToObject(json); schema = RdfSchema.reconstruct(o); root = (CellResourceNode)schema.getRoots().get(0); } @Test(groups={"rdf-schema-test"}) public void testRootNodes(){ assertNotNull(root); assertEquals(root.getLinkCount(),3); assertEquals(root.getTypes().size(), 1); assertEquals(root.getUriExpression(),"'http://reference.data.gov.uk/id/department/bis/post/' + value"); } @Test(groups={"rdf-schema-test"}) public void testJobTitleLiteral(){ Node jobTitleNode = getLink(root, "http://www.w3.org/2000/01/rdf-schema#label"); assertNotNull(jobTitleNode); assertTrue(jobTitleNode instanceof CellLiteralNode); CellLiteralNode jobTitle = (CellLiteralNode)jobTitleNode; //test language assertEquals(jobTitle.getLang(),"en"); //test type: null stands for "untyped" assertNull(jobTitle.getValueType()); //test column name assertEquals(jobTitle.getColumnName(), "Job Title"); } @Test(groups={"rdf-schema-test"}) public void testRowNumberCell(){ Node rowNumberNode = getLink(root,"http://reference.data.gov.uk/def/central-government/heldBy"); assertNotNull(rowNumberNode); assertTrue(rowNumberNode instanceof CellResourceNode ); CellResourceNode rowNumber = (CellResourceNode) rowNumberNode; //test URI expression assertEquals(rowNumber.getUriExpression(),"('#person' + value).urlify()"); //test column name assertNull(rowNumber.getColumnName()); testLinks(rowNumber, "http://xmlns.com/foaf/0.1/name","http://xmlns.com/foaf/0.1/mbox"); testRdfTypes(rowNumber, "http://xmlns.com/foaf/0.1/Person"); } @Test(groups={"rdf-schema-test"}) public void testNameCell(){ CellResourceNode rowNumber = (CellResourceNode)getLink(root,"http://reference.data.gov.uk/def/central-government/heldBy"); Node nameNode = getLink(rowNumber, "http://xmlns.com/foaf/0.1/name"); assertTrue(nameNode instanceof CellLiteralNode ); CellLiteralNode name = (CellLiteralNode) nameNode; assertNull(name.getLang()); assertEquals(name.getColumnName(), "Name"); assertNull(name.getValueType()); } @Test(groups={"rdf-schema-test"}) public void testEmailCell(){ CellResourceNode rowNumber = (CellResourceNode)getLink(root,"http://reference.data.gov.uk/def/central-government/heldBy"); Node emailNode = getLink(rowNumber, "http://xmlns.com/foaf/0.1/mbox"); assertTrue(emailNode instanceof CellResourceNode); CellResourceNode email = (CellResourceNode) emailNode; assertEquals(email.getUriExpression(), "'mailto:' + value"); testLinks(email); testRdfTypes(email); } @Test(groups={"rdf-schema-test"}) public void testInverseProperty(){ CellResourceNode n1 = (CellResourceNode)getLink(root,"http://reference.data.gov.uk/def/central-government/postIn"); CellResourceNode n2 = (CellResourceNode)getLink(n1,"http://reference.data.gov.uk/def/central-government/hasPost"); assertEquals(n2.getUriExpression(),"'http://reference.data.gov.uk/id/department/bis/post/' + value"); assertEquals(n2.getColumnName(), "Post unique reference"); testLinks(n2); testRdfTypes(n2); } protected Node getLink(ResourceNode resource, String propertyUri){ for(Link link:resource.getLinks()){ if(link.propertyUri.equals(propertyUri)){ return link.target; } } return null; } void testLinks(ResourceNode node, String... expectedPropertiesUris){ assertEquals(node.getLinkCount(), expectedPropertiesUris.length); List<String> actuals = new ArrayList<String>(); for(Link link:node.getLinks()){ actuals.add(link.propertyUri); } for(int i=0;i<expectedPropertiesUris.length;i++){ String prop = expectedPropertiesUris[i]; assertTrue(actuals.remove(prop)); } assertTrue(actuals.isEmpty()); } void testRdfTypes(ResourceNode node, String... expectedTypesUris){ assertEquals(node.getTypes().size(), expectedTypesUris.length); List<String> actuals = new ArrayList<String>(); for(RdfType type:node.getTypes()){ actuals.add(type.getUri()); } for(int i=0;i<expectedTypesUris.length;i++){ assertTrue(actuals.remove(expectedTypesUris[i])); } assertTrue(actuals.isEmpty()); } }