From 95ce8a58286cb63498f06193436252d13319c67f Mon Sep 17 00:00:00 2001 From: j2blake Date: Wed, 6 Nov 2013 13:07:25 -0500 Subject: [PATCH] VIVO-483 Obsolete VIVO URIs in Vitro search code. Break out the mechanism for building a list of Additional URI Finder instances. Override that in VIVO. Move AdditionalURIsForContextNodes to VIVO. References to obsolete URIs are in comments. --- .../AdditionalURIsForContextNodes.java | 789 ++++++++++++++++++ .../search/indexing/AdditionalUriFinders.java | 30 + .../AdditionalURIsForContextNodesTest.java | 670 +++++++++++++++ 3 files changed, 1489 insertions(+) create mode 100644 src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java create mode 100644 src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java create mode 100644 test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodesTest.java diff --git a/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java b/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java new file mode 100644 index 00000000..90bbc95e --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java @@ -0,0 +1,789 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.search.indexing; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.query.Query; +import com.hp.hpl.jena.query.QueryExecution; +import com.hp.hpl.jena.query.QueryExecutionFactory; +import com.hp.hpl.jena.query.QueryFactory; +import com.hp.hpl.jena.query.QuerySolution; +import com.hp.hpl.jena.query.QuerySolutionMap; +import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.query.Syntax; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.shared.Lock; + +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; + +public class AdditionalURIsForContextNodes implements StatementToURIsToUpdate { + + private OntModel model; + private Set alreadyChecked; + private long accumulatedTime = 0; + + private static final List multiValuedQueriesForAgent = new ArrayList(); + private static final String multiValuedQueryForInformationContentEntity; + private static final List multiValuedQueriesForRole = new ArrayList(); + private static final ListqueryList; + + private Log log = LogFactory.getLog(AdditionalURIsForContextNodes.class); + + + public AdditionalURIsForContextNodes( OntModel jenaOntModel){ + this.model = jenaOntModel; + } + + @Override + public List findAdditionalURIsToIndex(Statement stmt) { + + if( stmt != null ){ + long start = System.currentTimeMillis(); + + ListurisToIndex = new ArrayList(); + if(stmt.getSubject() != null && stmt.getSubject().isURIResource() ){ + String subjUri = stmt.getSubject().getURI(); + if( subjUri != null && ! alreadyChecked.contains( subjUri )){ + urisToIndex.addAll( findAdditionalURIsToIndex(subjUri)); + alreadyChecked.add(subjUri); + } + } + + if( stmt.getObject() != null && stmt.getObject().isURIResource() ){ + String objUri = stmt.getSubject().getURI(); + if( objUri != null && ! alreadyChecked.contains(objUri)){ + urisToIndex.addAll( findAdditionalURIsToIndex(objUri)); + alreadyChecked.add(objUri); + } + } + + accumulatedTime += (System.currentTimeMillis() - start ) ; + return urisToIndex; + }else{ + return Collections.emptyList(); + } + } + + @Override + public void startIndexing() { + alreadyChecked = new HashSet(); + accumulatedTime = 0L; + } + + @Override + public void endIndxing() { + log.debug( "Accumulated time for this run of the index: " + accumulatedTime + " msec"); + alreadyChecked = null; + } + + protected List findAdditionalURIsToIndex(String uri) { + + List uriList = new ArrayList(); + + for(String query : queryList){ + + //log.info("Executing query: "+ query); + + QuerySolutionMap initialBinding = new QuerySolutionMap(); + Resource uriResource = ResourceFactory.createResource(uri); + initialBinding.add("uri", uriResource); + + Query sparqlQuery = QueryFactory.create( query, Syntax.syntaxARQ); + model.getLock().enterCriticalSection(Lock.READ); + try{ + QueryExecution qExec = QueryExecutionFactory.create(sparqlQuery, model, initialBinding); + try{ + ResultSet results = qExec.execSelect(); + while(results.hasNext()){ + QuerySolution soln = results.nextSolution(); + Iterator iter = soln.varNames() ; + while( iter.hasNext()){ + String name = iter.next(); + RDFNode node = soln.get( name ); + if( node != null ){ + uriList.add("" + node.toString()); + }else{ + log.debug(name + " is null"); + } + } + } + }catch(Throwable t){ + log.error(t,t); + } finally{ + qExec.close(); + } + }finally{ + model.getLock().leaveCriticalSection(); + } + } + + if( log.isDebugEnabled() ) + log.debug( "additional uris for " + uri + " are " + uriList); + + return uriList; + } + + + private static final String prefix = "prefix owl: \n" + + " prefix vitroDisplay: \n" + + " prefix rdf: \n" + + " prefix core: \n" + + " prefix foaf: \n" + + " prefix obo: \n" + + " prefix vcard: \n" + + " prefix event: \n" + + " prefix rdfs: \n" + + " prefix localNav: \n" + + " prefix bibo: \n"; + + static{ + + // If a person changes then update + // organizations for positions + multiValuedQueriesForAgent.add(prefix + + "SELECT DISTINCT \n" + + " (str(?i) as ?positionInOrganization) \n" + + " WHERE {\n" + + + "?uri rdf:type foaf:Agent ; core:relatedBy ?c . \n" + + " ?c rdf:type core:Position . \n" + + + " OPTIONAL { ?c core:relates ?i . ?i rdf:type foaf:Organization } . \n" + + " }"); + + // If a person changes then update + // advisee, linkedAuthor and informationResource + multiValuedQueriesForAgent.add(prefix + + "SELECT (str(?d) as ?advisee) \n" + + " (str(?f) as ?linkedAuthor) (str(?h) as ?linkedInformationResource) WHERE { {\n" + + + "?uri rdf:type foaf:Agent . \n" + + "?uri core:relatedBy ?c . \n" + + "?c rdf:type core:AdvisingRelationship . \n" + + "?c core:relates ?d . \n" + + "?d rdf:type core:AdviseeRole . \n" + + "?d obo:RO_0000052 ?e . \n" + + "?e rdf:type foaf:Person . \n" + + "} \n" + + "UNION { \n" + + " ?uri rdf:type foaf:Agent . \n" + + " ?uri core:relatedBy ?c . \n" + + " ?c rdf:type core:Authorship . \n" + + " OPTIONAL {?c core:relates ?f . \n" + + " ?f rdf:type foaf:Person . } \n" + + " OPTIONAL { ?c core:relates ?h . \n" + + " ?h rdf:type obo:IAO_0000030 . } \n" + + " } } "); + + // If a person changes then update + // award giver + multiValuedQueriesForAgent.add(prefix + + "SELECT (str(?d) as ?awardConferredBy) \n" + + "WHERE {\n" + + + "?uri rdf:type foaf:Agent ; ?b ?c . \n" + + " ?c rdf:type core:AwardReceipt . \n" + + + " OPTIONAL { ?c core:assignedBy ?d . } . \n" + + " }"); + + // If a person changes then update + // organization for role + multiValuedQueriesForAgent.add(prefix + + "SELECT (str(?Organization) as ?organization) \n" + + "WHERE {\n" + + + "?uri rdf:type foaf:Agent ; ?b ?c . \n" + + " ?c rdf:type obo:BFO_0000023 ; obo:BFO_0000054 ?Organization .\n" + + " }"); + + // If a person changes then update + // organization in educational training + multiValuedQueriesForAgent.add(prefix + + "SELECT \n" + + "(str(?e) as ?trainingAtOrganization) WHERE {\n" + + + " ?uri rdf:type foaf:Agent ; ?b ?c . \n" + + " ?c rdf:type core:EducationalProcess . \n" + + + " OPTIONAL { ?c obo:RO_0000057 ?e . \n" + + " ?e rdf:type foaf:Organization . } . " + +"}"); + + // If an organization changes then update + // people in head of relations + multiValuedQueriesForAgent.add( + " # for organization, get leader \n" + + prefix + + "SELECT \n" + + "(str(?e) as ?LeaderPerson ) WHERE {\n" + + + " ?uri rdf:type foaf:Agent . \n" + + " ?uri core:contributingRole ?c . \n" + + " ?c rdf:type core:LeaderRole . \n" + + + " OPTIONAL { ?c obo:RO_0000052 ?e . \n" + + " ?e rdf:type foaf:Person . } . " + +"}"); + + } + + //multivalued query for obo:IAO_0000030 (Information Content Entity) + static { + + multiValuedQueryForInformationContentEntity = prefix + + "SELECT (str(?b) as ?linkedAuthor) (str(?d) as ?linkedInformationResource) \n" + + "(str(?f) as ?editor) \n" + + "(str(?i) as ?features) WHERE {\n" + + + " ?uri rdf:type obo:IAO_0000030 . \n" + + + " OPTIONAL { ?uri core:relatedBy ?a . \n" + + " ?a rdf:type core:Authorship . \n" + + " ?a core:relates ?b . ?b rdf:type foaf:Person .\n" + + " ?a core:relates ?d . ?d rdf:type obo:IAO_0000030 .\n" + + "} . " + + + " OPTIONAL { ?uri core:relatedBy ?e . \n" + + " ?e rdf:type core:Editorship . \n" + + " ?e core:relates ?f . ?f rdf:type foaf:Person .\n" + + "} . " + + " OPTIONAL { ?uri core:features ?i . } . \n" + + +"}" ; + + } + + protected static List queriesForAuthorship(){ + List queries = new ArrayList(); + + //get additional URIs of information resources from author side + queries.add( + prefix + + "SELECT (str(?a) as ?infoResource) WHERE {\n" + + + " ?uri rdf:type foaf:Person . \n" + + " ?uri core:relatedBy ?aship .\n" + + " ?aship rdf:type core:Authorship .\n" + + "OPTIONAL { ?aship core:relates ?a . ?a rdf:type obo:IAO_0000030 } .\n" + +"}" ); + + //get additional URIs of authors from information resource side + queries.add( + prefix + + "SELECT (str(?a) as ?author ) WHERE {\n" + + + " ?uri rdf:type obo:IAO_0000030 . \n" + + " ?uri core:relatedBy ?aship . ?aship rdf:type core:Authorship . \n" + + "OPTIONAL { ?aship core:relates ?a . ?a rdf:type foaf:Person } .\n" + +"}" ); + return queries; + } + + protected static List queriesForURLLink(){ + List queries = new ArrayList(); + + //get additional URIs when URLLink is changed + queries.add( + prefix + + "SELECT (str(?x) as ?individual) WHERE {\n" + + + " ?i rdf:type vcard:Individual . \n" + + " ?i vcard:hasURL ?uri . \n" + + " ?i obo:ARG_2000029 ?x . \n" + +"}" ); + + return queries; + } + + protected static List queriesForEducationalTraining(){ + List queries = new ArrayList(); + + //if person changes, no additional URIs need to be + //changed because the person is not displayed on the + //degree individual or on the degree granting organization + + //if the degree changes, the person needs to be updated + //since the degree name is shown on the person page. + queries.add( + prefix + + " SELECT (str(?person) as ?personUri) WHERE {\n" + + + " ?uri rdf:type core:AcademicDegree . \n" + + " ?uri core:relatedBy ?awardedDegree .\n" + + " ?awardedDegree rdf:type core:AwardedDegree .\n" + + " ?awardedDegree core:relates ?person .\n" + + " ?person rdf:type foaf:Person .\n" + +"}" ); + + //if the organization changes the person needs to be updated + //since the organization name is shown on the person page. + queries.add( + prefix + + " SELECT (str(?person) as ?personUri) WHERE {\n" + + + " ?uri rdf:type foaf:Organization . \n" + + " ?uri obo:RO_0000056 ?edTrainingNode .\n" + + " ?edTrainingNode rdf:type core:EducationalProcess . \n" + + " ?edTrainingNode obo:RO_0000057 ?person . \n" + + " ?person rdf:type foaf:Person ." + +"}" ); + return queries; + } + + protected static List queriesForPosition(){ + List queries = new ArrayList(); + + //If an organization changes, update people + queries.add( + prefix + + " SELECT (str(?person) as ?personUri) WHERE {\n" + + + " ?uri rdf:type foaf:Organization . \n" + + " ?uri core:relatedBy ?positionNode .\n" + + " ?positionNode rdf:type core:Position .\n" + + " ?positionNode core:relates ?person . \n" + + " ?person rdf:type foaf:Person .\n" + +"}" ); + + + //if people change, update organizations + queries.add( + prefix + + " SELECT (str(?org) as ?orgUri) WHERE {\n" + + + " ?uri rdf:type foaf:Person . \n" + + " ?uri core:relatedBy ?positionNode .\n" + + " ?positionNode rdf:type core:Position .\n" + + " ?positionNode core:relates ?org . \n" + + " ?org rdf:type foaf:Organization .\n" + +"}" ); + return queries; + } + + static{ + // core:AttendeeRole + // If the person changes, update the attendee role in organization + // core:AttendeeRole applies to events, not organizations; updating accordingly - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?event) \n " + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + "?c rdf:type core:AttendeeRole . \n" + + "?c obo:BFO_0000054 ?d . \n" + + "?d rdf:type event:Event .\n" + + " }"); + + // If the organization changes, update the attendee role of person + // core:AttendeeRole applies to events, not organizations; updating accordingly - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + + "?uri rdf:type event:Event . \n" + + "?uri obo:BFO_0000055 ?c . \n" + + "?c rdf:type core:AttendeeRole . \n" + + "?c obo:RO_0000052 ?d . \n" + + "?d rdf:type foaf:Person .\n" + + " }"); + + // core:ClinicalRole -- core:clinicalRoleOf + + // If the person changes, update the clinical role in project + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?project) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + "?c rdf:type core:ClinicalRole . \n" + + "?c obo:BFO_0000054 ?d .\n" + + "?d rdf:type core:Project .\n" + + " }"); + + + // If the person changes, update the clinical role in service + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?service) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + "?c rdf:type core:ClinicalRole . \n" + + "?c core:roleContributesTo ?d .\n" + + "?d rdf:type obo:ERO_0000005 .\n" + + " }"); + + // If the project changes, update the clinical role of person + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type core:Project . \n" + + "?uri obo:BFO_0000055 ?c . \n" + + "?c rdf:type core:ClinicalRole . \n" + + "?c obo:RO_0000052 ?d .\n " + + "?d rdf:type foaf:Person .\n " + + " }"); + + // If the service changes, update the clinical role of person + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type obo:ERO_0000005 . \n" + + "?uri core:contributingRole ?c . \n" + + "?c rdf:type core:ClinicalRole . \n" + + "?c obo:RO_0000052 ?d .\n " + + "?d rdf:type foaf:Person .\n " + + " }"); + + // If the person changes, update the leader role in organization + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?organization) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + "?c rdf:type core:LeaderRole . \n" + + "?c core:roleContributesTo ?d .\n" + + "?d rdf:type foaf:Organization .\n " + + " }"); + + // If the organization changes, update the leader role of person + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Organization . \n" + + "?uri core:contributingRole ?c . \n" + + "?c rdf:type core:LeaderRole . \n" + + "?c obo:RO_0000052 ?d .\n " + + "?d rdf:type foaf:Person .\n " + + " }"); + + // core:MemberRole -- core:memberRoleOf + + // If the person changes, update the member role in organization + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?organization) \n" + + "WHERE \n{" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + "?c rdf:type core:MemberRole . \n" + + "?c core:roleContributesTo ?d .\n" + + "?d rdf:type foaf:Organization .\n " + + " }"); + + // If the organization changes, update the member role of person + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {" + + "?uri rdf:type foaf:Organization . \n" + + "?uri core:contributingRole ?c . \n" + + "?c rdf:type core:MemberRole . \n" + + "?c obo:RO_0000052 ?d .\n " + + "?d rdf:type foaf:Person .\n " + + " }"); + + // core:OrganizerRole -- core:organizerRoleOf + + // If the person changes, update the organizer role in organization + // organizerRole appplies to events not organizations; updating accordingly - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?event) \n" + + "WHERE {" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + "?c rdf:type core:OrganizerRole .\n" + + "?c obo:BFO_0000054 ?d .\n" + + "?d rdf:type event:Event .\n " + + " }"); + + // If the organization changes, update the organizer role of person + // organizerRole appplies to events not organizations; updating accordingly - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type event:Event . \n" + + "?uri obo:BFO_0000055 ?c . \n" + + "?c rdf:type core:OrganizerRole . \n" + + "?c obo:RO_0000052 ?d .\n " + + "?d rdf:type foaf:Person .\n " + + " }"); + + // core:OutreachProviderRole -- core:outreachProviderRoleOf + + // If the person changes, update the outreach provider role in organization + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?organization) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + "?c rdf:type core:OutreachProviderRole .\n" + + "?c core:roleContributesTo ?d .\n" + + "?d rdf:type foaf:Organization .\n " + + " }"); + + // If the organization changes, update the outreach provider role of person + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Organization . \n" + + "?uri core:contributingRole ?c . \n" + + "?c rdf:type core:OutreachProviderRole . \n" + + "?c obo:RO_0000052 ?d .\n " + + "?d rdf:type foaf:Person .\n " + + " }"); + + // core:PresenterRole -- core:presenterRoleOf + + // If the person changes, update the presentation + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?presentation) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + " ?c rdf:type core:PresenterRole . \n" + + " ?c obo:BFO_0000054 ?d .\n" + + " ?d rdf:type core:Presentation . \n" + + " }"); + + // If the presentation changes, update the person + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type core:Presentation . \n" + + "?uri obo:BFO_0000055 ?c . \n" + + " ?c rdf:type core:PresenterRole . \n " + + "?c obo:RO_0000052 ?d .\n " + + "?d rdf:type foaf:Person .\n " + + " }"); + + // core:ResearcherRole -- core:researcherRoleOf + + // If the person changes, update the grant + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?grant) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + " ?c rdf:type core:ResearcherRole . \n " + + " ?c core:relatedBy ?d .\n" + + " ?d rdf:type core:Grant . \n" + + " }"); + + // If the grant changes, update the researcher + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type core:Grant . \n" + + "?uri core:relates ?c . \n" + + " ?c rdf:type core:ResearcherRole . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + // If the grant changes, update the principal investigator + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type core:Grant . \n" + + " ?uri core:relates ?c . \n" + + " ?c rdf:type core:PrincipalInvestigatorRole . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + // If the grant changes, update the co-principal investigator + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type core:Grant . \n" + + " ?uri core:relates ?c . \n" + + " ?c rdf:type core:CoPrincipalInvestigatorRole . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + + // If the grant changes, update the investigator + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type core:Grant . \n" + + " ?uri core:relates ?c . \n" + + " ?c rdf:type core:InvestigatorRole . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + // If the person changes, update the project + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?project) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + " ?c rdf:type core:ResearcherRole . \n " + + " ?c obo:BFO_0000054 ?d .\n" + + " ?d rdf:type core:Project . \n" + + " }"); + + // If the project changes, update the researcher + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type core:Project . \n" + + " ?uri obo:BFO_0000055 ?c .\n" + + " ?c rdf:type core:ResearcherRole . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + // core:EditorRole -- core:editorRoleOf, core:forInformationResource (person, informationresource) + + // If the person changes, update the editor role of the info resource + // changing foaf:Organization to info content entity. Org no longer applies here - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?informationResource) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + " ?c rdf:type core:EditorRole . \n " + + " ?c core:roleContributesTo ?d .\n" + + "?d rdf:type obo:IAO_0000030 .\n " + + " }"); + + + // If the info respource changes, update the editor role of person + // changing foaf:Organization to info content entity. Org no longer applies here - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type obo:IAO_0000030 . \n" + + "?uri core:contributingRole ?c . \n" + + " ?c rdf:type core:EditorRole . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + // Next two queries are covered by the previous two. Commenting them out - tlw72 + // If the person changes, update the information resource associated with editor role +/* multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?informationResource) \n" + + "WHERE {\n" + + + "?uri rdf:type foaf:Person ; ?b ?c . \n" + + " ?c rdf:type core:EditorRole ; core:forInformationResource ?d .\n" + + " }"); + + // If the organization changes, update the information resource associated with editor role + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?informationResource) \n" + + "WHERE {\n" + + + "?uri rdf:type foaf:Organization ; ?b ?c . \n" + + " ?c rdf:type core:EditorRole ; core:forInformationResource ?d .\n" + + " }"); +*/ + // core:ServiceProviderRole -- core:serviceProviderRoleOf + + // If the person changes, update the service provider role in organization + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?organization) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + " ?c rdf:type obo:ERO_0000012 . \n" + + " ?c core:roleContributesTo ?d .\n" + + " ?d rdf:type foaf:Organization .\n " + + " }"); + + // If the organization changes, update the service provider role of person + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Organization . \n" + + "?uri core:contributingRole ?c . \n" + + " ?c rdf:type obo:ERO_0000012 . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + + // core:TeacherRole -- core:teacherRoleOf + + // If the person changes, update the teacher role in organization + // updated to make this an Event (e.g., a course) not an organization - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?event) \n" + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + " ?c rdf:type core:TeacherRole . \n" + + " ?c obo:BFO_0000054 ?d .\n" + + " ?d rdf:type event:Event .\n " + + " }"); + + // If the organization changes, update the teacher role of person + // updated to make this an Event (e.g., a course) not an organization - tlw72 + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?person) \n" + + "WHERE {\n" + + "?uri rdf:type event:Event . \n" + + "?uri obo:BFO_0000055 ?c . \n" + + " ?c rdf:type core:TeacherRole . \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + + // core:ReviewerRole -- core:forInformationResource, core:reviewerRoleOf +// core:PeerReviewerRole -- core:forInformationResource, core:reviewerRoleOf + + // If the person changes, update the information resource associated with reviewer role + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?informationResource) \n " + + "WHERE {\n" + + "?uri rdf:type foaf:Person . \n" + + "?uri obo:RO_0000053 ?c . \n" + + " ?c rdf:type core:ReviewerRole . \n" + + " ?c core:roleContributesTo ?d .\n" + + " ?d rdf:type obo:IAO_0000030 .\n " + + " }"); + + // If the organization changes, update the information resource associated with reviewer role + multiValuedQueriesForRole.add(prefix + + "SELECT (str(?d) as ?informationResource) \n" + + "WHERE {\n" + + "?uri rdf:type obo:IAO_0000030 . \n" + + "?uri core:contributingRole ?c . \n" + + " ?c rdf:type core:ReviewerRole. \n " + + " ?c obo:RO_0000052 ?d .\n" + + "?d rdf:type foaf:Person .\n " + + " }"); + + } + + static{ + List tmpList = new ArrayList(); + tmpList.add(multiValuedQueryForInformationContentEntity); + tmpList.addAll(multiValuedQueriesForAgent); + tmpList.addAll(multiValuedQueriesForRole); + tmpList.addAll( queriesForAuthorship()); + tmpList.addAll(queriesForURLLink()); + tmpList.addAll(queriesForEducationalTraining()); + tmpList.addAll(queriesForPosition()); + + queryList = Collections.unmodifiableList(tmpList); + } + +} diff --git a/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java b/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java new file mode 100644 index 00000000..6c48cded --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java @@ -0,0 +1,30 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.search.indexing; + +import java.util.ArrayList; +import java.util.List; + +import com.hp.hpl.jena.ontology.OntModel; + +import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; + +/** + * Make a list of StatementToURIsToUpdate objects for use by the + * IndexBuidler. + */ +public class AdditionalUriFinders { + + public static List getList(OntModel jenaOntModel, + IndividualDao indDao) { + List uriFinders = new ArrayList<>(); + uriFinders.add(new AdditionalURIsForDataProperties()); + uriFinders.add(new AdditionalURIsForObjectProperties(jenaOntModel)); + uriFinders.add(new AdditionalURIsForContextNodes(jenaOntModel)); + uriFinders.add(new AdditionalURIsForTypeStatements()); + uriFinders.add(new URIsForClassGroupChange(indDao)); + return uriFinders; + } + +} diff --git a/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodesTest.java b/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodesTest.java new file mode 100644 index 00000000..f73674d8 --- /dev/null +++ b/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodesTest.java @@ -0,0 +1,670 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.search.indexing; + +import static org.junit.Assert.assertTrue; + +import java.io.StringReader; +import java.util.List; + +import org.junit.Test; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.ModelFactory; + +import edu.cornell.mannlib.vitro.webapp.search.indexing.AdditionalURIsForContextNodes; + + +public class AdditionalURIsForContextNodesTest { + + @Test + public void testPositionChanges(){ + String n3 = + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + //make a test model with an person, an authorship context node and a book + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the org needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://caruso-laptop.mannlib.cornell.edu:8090/vivo/individual/n932"); + assertTrue("did not find org for context node", uris.contains("http://caruso-laptop.mannlib.cornell.edu:8090/vivo/individual/n5423" )); + + //if the org changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://caruso-laptop.mannlib.cornell.edu:8090/vivo/individual/n5423"); + assertTrue("did not find person for context node", uris.contains("http://caruso-laptop.mannlib.cornell.edu:8090/vivo/individual/n932" )); + } + + @Test + public void testPersonOnOrgChange() { + + String n3 ="@prefix dc: . \n" + + "@prefix rdfs: . \n" + + "@prefix swrl: . \n" + + "@prefix vitro: . \n" + + "@prefix xsd: . \n" + + "@prefix swrlb: . \n" + + "@prefix owl: . \n" + + "@prefix rdf: . \n" + + "@prefix core: . \n" + + "@prefix vivo: . \n" + + "@prefix obo: . \n" + + " " + + " \n" + + " a owl:Thing , core:Role , core:LeaderRole ; \n" + + " rdfs:label \"head\"^^xsd:string ; \n" + + " vitro:mostSpecificType \n" + + " core:LeaderRole ; \n" + + " core:dateTimeInterval \n" + + " ; \n" + + " obo:RO_0000052 ; \n" + + " core:roleContributesTo . \n" + + " \n" + + " a , owl:Thing , , core:ClinicalOrganization ; \n" + + " rdfs:label \"Organization XYZ\"^^xsd:string ; \n" + + " vitro:mostSpecificType \n" + + " core:ClinicalOrganization ; \n" + + " core:contributingRole . \n" + + " a , owl:Thing , . \n"; + + + //make a test model with an person, an authorship context node and a book + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //get additional uris for org + List uris = uriFinder.findAdditionalURIsToIndex( "http://caruso-laptop.mannlib.cornell.edu:8090/vivo/individual/n2592"); + + assertTrue("did not find person for context node", uris.contains("http://vivo.scripps.edu/individual/n14979" )); + + } + + @Test + public void testLeaderRoleChanges(){ + String n3= + + " \"1, Test\" . \n " + +// " \"1\"^^ . \n " + +// " \"Test\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + + " \"Leader Role\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + " \"University1\"^^ . \n " + + " . \n " + + " .\n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " ; + + + //make a test model with an person, a leader role node and a university + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the university needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n2027"); + assertTrue("did not find org for context node", uris.contains("http://vivo.scripps.edu/individual/n7080" )); + + //if the university changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n7080"); + assertTrue("did not find person for context node", uris.contains("http://vivo.scripps.edu/individual/n2027" )); + + + } + + + @Test + public void testMemberRoleChanges(){ + String n3 = + + " . \n " + + " \"2, Test\" . \n " + +// " \"2\"^^ . \n " + +// " \"Test\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + " \"Member Role\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + + " \"University2\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " ; + + + + //make a test model with an person, a member role node and a university + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the university needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4519"); + assertTrue("did not find org for context node", uris.contains("http://vivo.scripps.edu/individual/n6004" )); + + //if the university changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n6004"); + assertTrue("did not find person for context node", uris.contains("http://vivo.scripps.edu/individual/n4519" )); + + + } + + + @Test + public void testClinicalRoleChangesForProject(){ + + String n3 = + + " \"3, Test\" . \n" + +// " \"3\"^^ .\n" + +// " \"Test\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " \"Clinical Role\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Project1\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + + + //make a test model with an person, a clinical role node and a project + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the project needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4858"); + assertTrue("did not find project for clinical role", uris.contains("http://vivo.scripps.edu/individual/n5177" )); + + //if the project changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n5177"); + assertTrue("did not find person for clinical role", uris.contains("http://vivo.scripps.edu/individual/n4858" )); + + } + + @Test + public void testClinicalRoleChangesForService(){ + + String n3 = + + " \"4, Test\" . \n" + +// " \"4\"^^ . \n" + +// " \"Test\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " \"Clinical Role 2\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Service1\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + //make a test model with an person, a clinical role node and a service + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the service needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n5651"); + assertTrue("did not find service for clinical role", uris.contains("http://vivo.scripps.edu/individual/n4442" )); + + //if the service changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4442"); + assertTrue("did not find person for clinical role", uris.contains("http://vivo.scripps.edu/individual/n5651" )); + + + } + + + @Test + public void testPresenterRoleChangesForPresentation(){ + String n3 = + " . \n" + + " \"5, Test\" . \n" + +// " \"5\"^^ . \n" + +// " \"Test\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " \"Presenter Role\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Presentation 1\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + + //make a test model with an person, a presenter role node and a presentation + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the presentation needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n5596"); + assertTrue("did not find service for clinical role", uris.contains("http://vivo.scripps.edu/individual/n1305" )); + + //if the presentation changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n1305"); + assertTrue("did not find person for clinical role", uris.contains("http://vivo.scripps.edu/individual/n5596" )); + + } + + + @Test + public void testPresenterRoleChangesForInvitedTalk(){ + String n3 = + + " . \n " + + " \"6, Test\" . \n " + +// " \"6\"^^ . \n " + +// " \"Test\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + " . \n " + + " \"Presenter Role 2\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + " \"Invited Talk 1\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " ; + + //make a test model with an person, a presenter role node and an invited talk + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the invited talk needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4112"); + assertTrue("did not find invited talk for person", uris.contains("http://vivo.scripps.edu/individual/n4107" )); + + //if the invited talk changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4107"); + assertTrue("did not find person for invited talk", uris.contains("http://vivo.scripps.edu/individual/n4112" )); + + } + + + @Test + public void testResearcherRoleForGrant(){ + + String n3 = + + " \"7, Test\" . \n" + +// " \"7\"^^ . \n" + +// " \"Test\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Researcher Role\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Grant1\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + + //make a test model with an person, a researcher role node and a grant + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the grant needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4957"); + assertTrue("did not find service for clinical role", uris.contains("http://vivo.scripps.edu/individual/n4252" )); + + //if the grant changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4252"); + assertTrue("did not find person for clinical role", uris.contains("http://vivo.scripps.edu/individual/n4957" )); + + + } + + @Test + public void testResearcherRoleForProject(){ + + String n3 = + + " \"8, Test\" . \n " + +// " \"8\"^^ . \n " + +// " \"Test\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + " \"Researcher Role 2\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + + + " \"Project2\"^^ . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " + + " . \n " ; + + + + //make a test model with an person, a researcher role node and a project + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the project needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n2029"); + assertTrue("did not find service for clinical role", uris.contains("http://vivo.scripps.edu/individual/n564" )); + + //if the project changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n564"); + assertTrue("did not find person for clinical role", uris.contains("http://vivo.scripps.edu/individual/n2029" )); + + + } + + @Test + public void testPrincipalInvestigatorRoleChanges(){ + + String n3 = + + " . \n" + + " \"8, Test\" . \n" + +// " \"8\"^^ . \n" + +// " \"Test\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Grant 2\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + + //make a test model with an person, a principal investigator role node and a grant + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the person changes then the grant needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n2368"); + assertTrue("did not find grant for pi", uris.contains("http://vivo.scripps.edu/individual/n1742" )); + + //if the grant changes then the person needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n1742"); + assertTrue("did not find pi for grant", uris.contains("http://vivo.scripps.edu/individual/n2368" )); + + + } + + @Test + public void testCoPrincipalInvestigatorRoleChanges(){ + + String n3 = + + " \"9, Test\" . \n" + +// " \"9\"^^ . \n" + +// " \"Test\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Grant 3\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + //make a test model with an person, a co-principal investigator role node and a grant + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the copi changes then the grant needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n1373"); + assertTrue("did not find grant for co-pi", uris.contains("http://vivo.scripps.edu/individual/n4931" )); + + //if the grant changes then the copi needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n4931"); + assertTrue("did not find co-pi for grant", uris.contains("http://vivo.scripps.edu/individual/n1373" )); + + } + + + @Test + public void testInvestigatorRoleChanges(){ + + String n3 = + + " \"10, Test\" . \n" + +// " \"10\"^^ . \n" + +// " \"Test\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + + " \"Grant 4\"^^ . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" + + " . \n" ; + + + //make a test model with an person, a investigator role node and a grant + OntModel model = ModelFactory.createOntologyModel(); + model.read( new StringReader(n3), null, "N3"); + + //make an AdditionalURIsForContextNodesTest object with that model + AdditionalURIsForContextNodes uriFinder = new AdditionalURIsForContextNodes( model ); + + //if the investigator changes then the grant needs to be updated + List uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n5282"); + assertTrue("did not find grant for investigator", uris.contains("http://vivo.scripps.edu/individual/n160" )); + + //if the grant changes then the investigator needs to be updated + uris = uriFinder.findAdditionalURIsToIndex( "http://vivo.scripps.edu/individual/n160"); + assertTrue("did not find investigator for grant", uris.contains("http://vivo.scripps.edu/individual/n5282" )); + + + + } + + +}