[VIVO-1076] Generate person level Map of Science "live", unless it is slow and there are already organisation caches

This commit is contained in:
grahamtriggs 2015-10-19 15:52:58 +01:00
parent 8fc40fcf98
commit 1781b974d1
2 changed files with 142 additions and 56 deletions

View file

@ -9,8 +9,12 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.hp.hpl.jena.query.QuerySolution;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer;
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
import edu.cornell.mannlib.vitro.webapp.visualization.utilities.OrgUtils;
import edu.cornell.mannlib.vitro.webapp.visualization.utilities.VisualizationCaches;
import mapping.ScienceMapping;
@ -84,25 +88,100 @@ public class MapOfScienceVisualizationRequestHandler implements VisualizationReq
return prepareStandaloneMarkupResponse(vitroRequest, entityURI);
}
private Set<String> getPublicationsForPerson(RDFService rdfService, String personUri) {
if (preferCachesForPersonMap() && VisualizationCaches.personToPublication.isCached()) {
Map<String, Set<String>> personToPublicationMap = VisualizationCaches.personToPublication.get(rdfService);
return personToPublicationMap.get(personUri);
} else {
final Set<String> queryResults = new HashSet<String>();
String query = QueryConstants.getSparqlPrefixQuery() +
"SELECT ?document\n" +
"WHERE\n" +
"{\n" +
" <" + personUri + "> core:relatedBy ?authorship .\n" +
" ?authorship a core:Authorship .\n" +
" ?authorship core:relates ?document .\n" +
" ?document a bibo:Document .\n" +
"}\n";
try {
rdfService.sparqlSelectQuery(query, new ResultSetConsumer() {
@Override
protected void processQuerySolution(QuerySolution qs) {
queryResults.add(qs.getResource("document").getURI());
}
});
} catch (RDFServiceException e) {
}
return queryResults;
}
}
private Map<String, String> getJournalsForPerson(RDFService rdfService, String personUri) {
if (preferCachesForPersonMap() && VisualizationCaches.publicationToJournal.isCached()) {
return VisualizationCaches.publicationToJournal.get(rdfService);
} else {
final Map<String, String> queryResults = new HashMap<String, String>();
String query = QueryConstants.getSparqlPrefixQuery() +
"SELECT ?document ?journalLabel\n" +
"WHERE\n" +
"{\n" +
" <" + personUri + "> core:relatedBy ?authorship .\n" +
" ?authorship a core:Authorship .\n" +
" ?authorship core:relates ?document .\n" +
" ?document a bibo:Document .\n" +
" ?document core:hasPublicationVenue ?journal . \n" +
" ?journal rdfs:label ?journalLabel . \n" +
"}\n";
try {
rdfService.sparqlSelectQuery(query, new ResultSetConsumer() {
@Override
protected void processQuerySolution(QuerySolution qs) {
queryResults.put(qs.getResource("document").getURI(), qs.getLiteral("journalLabel").getString());
}
});
} catch (RDFServiceException e) {
}
return queryResults;
}
}
private static boolean preferCachesForPersonMap() {
return timeToGeneratePersonMap > 2000;
}
private static long timeToGeneratePersonMap = -1;
private synchronized static void recordExecutionTimeForPersonMap(long time) {
timeToGeneratePersonMap = Math.max(timeToGeneratePersonMap, time);
}
private Map<String, String> getSubjectPersonEntityAndGenerateDataResponse(
VitroRequest vitroRequest, String subjectEntityURI, String entityLabel, VisConstants.DataVisMode dataOuputFormat)
throws MalformedQueryParametersException {
long startTime = System.currentTimeMillis();
try {
RDFService rdfService = vitroRequest.getRDFService();
Map<String, Set<String>> personToPublicationMap = VisualizationCaches.personToPublication.get(rdfService);
Map<String, String> publicationToJournalMap = VisualizationCaches.publicationToJournal.get(rdfService);
Set<String> publicationsForPerson = getPublicationsForPerson(rdfService, subjectEntityURI);
if (!personToPublicationMap.containsKey(subjectEntityURI)) {
if (publicationsForPerson == null || publicationsForPerson.size() == 0) {
if (VisConstants.DataVisMode.JSON.equals(dataOuputFormat)) {
return prepareStandaloneDataErrorResponse();
} else {
return prepareDataErrorResponse();
}
} else {
Map<String, String> publicationToJournalMap = getJournalsForPerson(rdfService, subjectEntityURI);
JournalPublicationCounts journalCounts = new JournalPublicationCounts();
for (String publication : personToPublicationMap.get(subjectEntityURI)) {
for (String publication : publicationsForPerson) {
journalCounts.increment(publicationToJournalMap.get(publication));
}
@ -151,6 +230,9 @@ public class MapOfScienceVisualizationRequestHandler implements VisualizationReq
return fileData;
}
} finally {
recordExecutionTimeForPersonMap(System.currentTimeMillis() - startTime);
}
}
private Map<String, String> getSubjectEntityAndGenerateDataResponse(

View file

@ -44,6 +44,10 @@ public class CachingRDFServiceExecutor<T> {
this.resultBuilder = resultBuilder;
}
public boolean isCached() {
return cachedResults != null;
}
/**
* Return the cached results if present, or start the task.
* Will wait for completion if the cache is not already populated, otherwise the refresh will happen in the background.