adding some unit tests to JenaIngestUtils
This commit is contained in:
parent
1baf710499
commit
d65cc2b106
16 changed files with 328 additions and 4 deletions
|
@ -598,7 +598,8 @@ public class JenaIngestController extends BaseEditController {
|
|||
private void processMergeResourceRequest(VitroRequest vreq) {
|
||||
String uri1 = vreq.getParameter("uri1"); // get primary uri
|
||||
String uri2 = vreq.getParameter("uri2"); // get secondary uri
|
||||
String usePrimaryLabelOnly = vreq.getParameter("usePrimaryLabelOnly");
|
||||
String usePrimaryLabelOnlyStr = vreq.getParameter("usePrimaryLabelOnly");;
|
||||
boolean usePrimaryLabelOnly = usePrimaryLabelOnlyStr != null && !usePrimaryLabelOnlyStr.isEmpty();
|
||||
|
||||
if(uri1!=null){
|
||||
JenaIngestUtils utils = new JenaIngestUtils();
|
||||
|
|
|
@ -615,8 +615,17 @@ public class JenaIngestUtils {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges statements about resource uri2 into resource uri1 and delete uri2.
|
||||
* @param uri1 The resource to merge to
|
||||
* @param uri2 The resource to merge from
|
||||
* @param baseOntModel The model containing the relevant statements
|
||||
* @param tboxOntModel The model containing class and property data
|
||||
* @param usePrimaryLabelOnly If true, discard rdfs:labels from uri2. Otherwise retain.
|
||||
* @return
|
||||
*/
|
||||
public MergeResult doMerge(String uri1, String uri2, OntModel baseOntModel,
|
||||
OntModel tboxOntModel, String usePrimaryLabelOnly){
|
||||
OntModel tboxOntModel, boolean usePrimaryLabelOnly){
|
||||
|
||||
boolean functionalPresent = false;
|
||||
|
||||
|
@ -660,8 +669,7 @@ public class JenaIngestUtils {
|
|||
// part of the primary resource.
|
||||
leftoverModel.add(res2, stmt.getPredicate(), stmt.getObject());
|
||||
functionalPresent = true;
|
||||
} else if (stmt.getPredicate().equals(RDFS.label) &&
|
||||
usePrimaryLabelOnly!=null && !usePrimaryLabelOnly.isEmpty()) {
|
||||
} else if (stmt.getPredicate().equals(RDFS.label) && usePrimaryLabelOnly) {
|
||||
// if the checkbox is checked, use primary resource rdfs:labels only
|
||||
// and dump secondary resource rdfs:labels into leftoverModel
|
||||
leftoverModel.add(res2, stmt.getPredicate(), stmt.getObject());
|
||||
|
|
|
@ -0,0 +1,127 @@
|
|||
package edu.cornell.mannlib.vitro.webapp.utils.ingest;
|
||||
|
||||
import java.io.StringWriter;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.hp.hpl.jena.ontology.OntModel;
|
||||
import com.hp.hpl.jena.ontology.OntModelSpec;
|
||||
import com.hp.hpl.jena.rdf.model.Model;
|
||||
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
||||
import com.hp.hpl.jena.rdf.model.Statement;
|
||||
import com.hp.hpl.jena.rdf.model.StmtIterator;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel;
|
||||
import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils;
|
||||
|
||||
public class JenaIngestUtilsTest {
|
||||
|
||||
private final Log log = LogFactory.getLog(JenaIngestUtilsTest.class);
|
||||
|
||||
protected JenaIngestUtils utils = new JenaIngestUtils();
|
||||
|
||||
protected Model makeModel() {
|
||||
Model base = ModelFactory.createDefaultModel();
|
||||
RDFService rdfService = new RDFServiceModel(base);
|
||||
return RDFServiceGraph.createRDFServiceModel(
|
||||
new RDFServiceGraph(rdfService));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSmush() {
|
||||
Model model = makeModel();
|
||||
model.read(JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"smush.start.n3"), null, "N3");
|
||||
JenaIngestUtils utils = new JenaIngestUtils();
|
||||
Model actualResult = utils.smushResources(
|
||||
model, model.getProperty("http://example.com/ns/duckCode"));
|
||||
boolean matchesPossibleResult = false;
|
||||
for(int i = 1; i < 7; i++) {
|
||||
Model possibleResult = ModelFactory.createDefaultModel();
|
||||
possibleResult.read(JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"smush.end." + i + ".n3"), null, "N3");
|
||||
if(actualResult.isIsomorphicWith(possibleResult)) {
|
||||
matchesPossibleResult = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!matchesPossibleResult) {
|
||||
StringWriter s = new StringWriter();
|
||||
actualResult.write(s, "N3");
|
||||
Assert.fail("Smushed model does not match one of the possible results:\n" +
|
||||
s.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRenameBNodes() {
|
||||
Model initialState = ModelFactory.createDefaultModel();
|
||||
initialState.read(JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"renameBlank.n3"), null, "N3");
|
||||
Model renamedState = utils.renameBNodes(
|
||||
initialState, "http://example.org/node/n");
|
||||
Assert.assertEquals("Post-rename model is not the same size as the " +
|
||||
"initial model", initialState.size(), renamedState.size());
|
||||
StmtIterator sit = renamedState.listStatements();
|
||||
boolean lingeringBNodes = false;
|
||||
while(sit.hasNext()) {
|
||||
Statement stmt = sit.nextStatement();
|
||||
if(stmt.getSubject().isAnon() || stmt.getObject().isAnon()) {
|
||||
lingeringBNodes = true;
|
||||
}
|
||||
}
|
||||
if(lingeringBNodes) {
|
||||
StringWriter s = new StringWriter();
|
||||
renamedState.write(s, "N3");
|
||||
Assert.fail("Renamed model still contains blank nodes \n" +
|
||||
s.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGenerateTBox() {
|
||||
Model abox = ModelFactory.createDefaultModel();
|
||||
abox.read(JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"abox.n3"), null, "N3");
|
||||
Model tbox = ModelFactory.createDefaultModel();
|
||||
tbox.read(JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"tbox.n3"), null, "N3");
|
||||
Model generatedTBox = utils.generateTBox(abox);
|
||||
//log.warn(tbox.toString());
|
||||
Assert.assertTrue("Generated TBox does not match expected result",
|
||||
tbox.isIsomorphicWith(generatedTBox));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDoMerge() {
|
||||
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, makeModel());
|
||||
OntModel tbox = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, makeModel());
|
||||
model.read(JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"merge.n3"), null, "N3");
|
||||
tbox.read(JenaIngestUtilsTest.class.getResourceAsStream("tbox.n3"), null, "N3");
|
||||
Model expectedMergeMultipleLabels = model.read(
|
||||
JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"mergeResultMultipleLabels.n3"), null, "N3");
|
||||
utils.doMerge("http://example.com/ns/n1", "http://example.com/ns/n1", model, tbox, false);
|
||||
Assert.assertTrue("Merged model with multiple labels does not match " +
|
||||
"expected result", expectedMergeMultipleLabels.isIsomorphicWith(model));
|
||||
|
||||
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, makeModel());
|
||||
model.read(JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"merge.n3"), null, "N3");
|
||||
Model expectedMergeSingleLabel = model.read(
|
||||
JenaIngestUtilsTest.class.getResourceAsStream(
|
||||
"mergeResultSingleLabel.n3"), null, "N3");
|
||||
utils.doMerge("http://example.com/ns/n1", "http://example.com/ns/n1", model, tbox, true);
|
||||
Assert.assertTrue("Merged model with multiple labels does not match " +
|
||||
"expected result", expectedMergeSingleLabel.isIsomorphicWith(model));
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese"@en-US .
|
||||
ns:n1 ns:o ns:f .
|
||||
ns:n2 a ns:Duck .
|
||||
ns:n2 ns:upcCode "2" .
|
||||
ns:n2 ns:p ns:q .
|
||||
ns:n3 a ns:Duck .
|
||||
ns:n3 ns:productCode "3"^^<http://example.org/datatype> .
|
||||
ns:n3 ns:q ns:z .
|
|
@ -0,0 +1,17 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 rdfs:label "duck" .
|
||||
ns:n1 rdfs:label "duck"@en-US .
|
||||
ns:n1 ns:d "cheese"@en-US .
|
||||
ns:n1 ns:o ns:f .
|
||||
ns:n2 a ns:Duck .
|
||||
ns:n2 rdfs:label "goose" .
|
||||
ns:n2 ns:upcCode "2" .
|
||||
ns:n2 ns:p ns:q .
|
||||
ns:n3 a ns:Duck .
|
||||
ns:n3 ns:productCode "3"^^<http://example.org/datatype> .
|
||||
ns:n3 ns:q ns:z .
|
||||
ns:n4 ns:q ns:n2 .
|
|
@ -0,0 +1,16 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 rdfs:label "duck" .
|
||||
ns:n1 rdfs:label "duck"@en-US .
|
||||
ns:n1 ns:d "cheese"@en-US .
|
||||
ns:n1 ns:o ns:f .
|
||||
ns:n1 rdfs:label "goose" .
|
||||
ns:n1 ns:upcCode "2" .
|
||||
ns:n1 ns:p ns:q .
|
||||
ns:n3 a ns:Duck .
|
||||
ns:n3 ns:productCode "3"^^<http://example.org/datatype> .
|
||||
ns:n3 ns:q ns:z .
|
||||
ns:n4 ns:q ns:n1 .
|
|
@ -0,0 +1,15 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 rdfs:label "duck" .
|
||||
ns:n1 rdfs:label "duck"@en-US .
|
||||
ns:n1 ns:d "cheese"@en-US .
|
||||
ns:n1 ns:o ns:f .
|
||||
ns:n1 ns:upcCode "2" .
|
||||
ns:n1 ns:p ns:q .
|
||||
ns:n3 a ns:Duck .
|
||||
ns:n3 ns:productCode "3"^^<http://example.org/datatype> .
|
||||
ns:n3 ns:q ns:z .
|
||||
ns:n4 ns:q ns:n1 .
|
|
@ -0,0 +1,13 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
[] a ns:Duck ;
|
||||
ns:duckCode "1" ;
|
||||
ns:d [
|
||||
a ns:Duck ;
|
||||
ns:duckCode "2" ;
|
||||
ns:d [
|
||||
a ns:Duck ;
|
||||
ns:duckCode "3" ;
|
||||
ns:d "cake" ;
|
||||
] ;
|
||||
] .
|
|
@ -0,0 +1,14 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese" .
|
||||
ns:n2 a ns:Duck .
|
||||
ns:n2 ns:duckCode "2" .
|
||||
ns:n2 ns:d "strudel" .
|
||||
ns:n2 ns:d "pancake" .
|
||||
ns:n3 a ns:Duck .
|
||||
ns:n3 ns:duckCode "3" .
|
||||
ns:n3 ns:d "cake" .
|
||||
ns:n3 ns:d "bacon" .
|
||||
ns:n3 ns:d "corn" .
|
|
@ -0,0 +1,14 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese" .
|
||||
ns:n2 a ns:Duck .
|
||||
ns:n2 ns:duckCode "2" .
|
||||
ns:n2 ns:d "strudel" .
|
||||
ns:n2 ns:d "pancake" .
|
||||
ns:n6 a ns:Duck .
|
||||
ns:n6 ns:duckCode "3" .
|
||||
ns:n6 ns:d "cake" .
|
||||
ns:n6 ns:d "bacon" .
|
||||
ns:n6 ns:d "corn" .
|
|
@ -0,0 +1,14 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese" .
|
||||
ns:n2 a ns:Duck .
|
||||
ns:n2 ns:duckCode "2" .
|
||||
ns:n2 ns:d "strudel" .
|
||||
ns:n2 ns:d "pancake" .
|
||||
ns:n8 a ns:Duck .
|
||||
ns:n8 ns:duckCode "3" .
|
||||
ns:n8 ns:d "cake" .
|
||||
ns:n8 ns:d "bacon" .
|
||||
ns:n8 ns:d "corn" .
|
|
@ -0,0 +1,14 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese" .
|
||||
ns:n5 a ns:Duck .
|
||||
ns:n5 ns:duckCode "2" .
|
||||
ns:n5 ns:d "strudel" .
|
||||
ns:n5 ns:d "pancake" .
|
||||
ns:n3 a ns:Duck .
|
||||
ns:n3 ns:duckCode "3" .
|
||||
ns:n3 ns:d "cake" .
|
||||
ns:n3 ns:d "bacon" .
|
||||
ns:n3 ns:d "corn" .
|
|
@ -0,0 +1,14 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese" .
|
||||
ns:n5 a ns:Duck .
|
||||
ns:n5 ns:duckCode "2" .
|
||||
ns:n5 ns:d "strudel" .
|
||||
ns:n5 ns:d "pancake" .
|
||||
ns:n6 a ns:Duck .
|
||||
ns:n6 ns:duckCode "3" .
|
||||
ns:n6 ns:d "cake" .
|
||||
ns:n6 ns:d "bacon" .
|
||||
ns:n6 ns:d "corn" .
|
|
@ -0,0 +1,14 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese" .
|
||||
ns:n5 a ns:Duck .
|
||||
ns:n5 ns:duckCode "2" .
|
||||
ns:n5 ns:d "strudel" .
|
||||
ns:n5 ns:d "pancake" .
|
||||
ns:n8 a ns:Duck .
|
||||
ns:n8 ns:duckCode "3" .
|
||||
ns:n8 ns:d "cake" .
|
||||
ns:n8 ns:d "bacon" .
|
||||
ns:n8 ns:d "corn" .
|
|
@ -0,0 +1,20 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
|
||||
ns:n1 a ns:Duck .
|
||||
ns:n1 ns:duckCode "1" .
|
||||
ns:n1 ns:d "cheese" .
|
||||
ns:n2 a ns:Duck .
|
||||
ns:n2 ns:duckCode "2" .
|
||||
ns:n2 ns:d "strudel" .
|
||||
ns:n3 a ns:Duck .
|
||||
ns:n3 ns:duckCode "3" .
|
||||
ns:n3 ns:d "cake" .
|
||||
ns:n5 a ns:Duck .
|
||||
ns:n5 ns:duckCode "2" .
|
||||
ns:n5 ns:d "pancake" .
|
||||
ns:n6 a ns:Duck .
|
||||
ns:n6 ns:duckCode "3" .
|
||||
ns:n6 ns:d "bacon" .
|
||||
ns:n8 a ns:Duck .
|
||||
ns:n8 ns:duckCode "3" .
|
||||
ns:n8 ns:d "corn" .
|
|
@ -0,0 +1,11 @@
|
|||
@prefix ns: <http://example.com/ns/> .
|
||||
@prefix owl: <http://www.w3.org/2002/07/owl#> .
|
||||
|
||||
ns:Duck a owl:Class .
|
||||
ns:duckCode a owl:DatatypeProperty .
|
||||
ns:d a owl:DatatypeProperty .
|
||||
ns:o a owl:ObjectProperty .
|
||||
ns:upcCode a owl:DatatypeProperty .
|
||||
ns:p a owl:ObjectProperty .
|
||||
ns:productCode a owl:DatatypeProperty .
|
||||
ns:q a owl:ObjectProperty .
|
Loading…
Add table
Reference in a new issue