edu.cornell.mannlib.vitro.webapp.search.documentBuilding.CalculateParameters.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.search.documentBuilding.CalculateParameters.java

Source

/* $This file is distributed under the terms of the license in /doc/license.txt$ */

package edu.cornell.mannlib.vitro.webapp.search.documentBuilding;

import java.util.ArrayList;
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.query.Dataset;
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.shared.Lock;

import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchInputDocument;
import edu.cornell.mannlib.vitro.webapp.search.VitroSearchTermNames;
import edu.cornell.mannlib.vitro.webapp.search.documentBuilding.DocumentModifier;

public class CalculateParameters implements DocumentModifier {

    private boolean shutdown = false;
    private Dataset dataset;
    // public static int totalInd=1;

    private static final String prefix = "prefix owl: <http://www.w3.org/2002/07/owl#> "
            + " prefix vitroDisplay: <http://vitro.mannlib.cornell.edu/ontologies/display/1.1#>  "
            + " prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>  "
            + " prefix core: <http://vivoweb.org/ontology/core#>  " + " prefix foaf: <http://xmlns.com/foaf/0.1/> "
            + " prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> "
            + " prefix localNav: <http://vitro.mannlib.cornell.edu/ns/localnav#>  "
            + " prefix obo: <http://purl.obolibrary.org/obo/>  "
            + " prefix bibo: <http://purl.org/ontology/bibo/>  ";

    private static final String betaQuery = prefix + " SELECT count(distinct ?inLinks) " + " WHERE { "
            + " ?uri rdf:type owl:Thing . " + " ?inLinks ?prop ?uri . " + " } ";

    private static final String totalCountQuery = prefix + " SELECT count(distinct ?ind) " + " WHERE { "
            + " ?ind rdf:type owl:Thing . " + " } ";

    private static Log log = LogFactory.getLog(CalculateParameters.class);

    public CalculateParameters(Dataset dataset) {
        this.dataset = dataset;
        // new Thread(new TotalInd(this.dataset,totalCountQuery)).start();
    }

    public CalculateParameters() {
        super();
    }

    public float calculateBeta(String uri) {
        float beta = 0;
        int Conn = 0;
        Query query;
        QuerySolutionMap initialBinding = new QuerySolutionMap();
        QuerySolution soln = null;
        Resource uriResource = ResourceFactory.createResource(uri);
        initialBinding.add("uri", uriResource);
        dataset.getLock().enterCriticalSection(Lock.READ);
        QueryExecution qexec = null;
        try {
            query = QueryFactory.create(betaQuery, Syntax.syntaxARQ);
            qexec = QueryExecutionFactory.create(query, dataset, initialBinding);
            ResultSet results = qexec.execSelect();
            List<String> resultVars = results.getResultVars();
            if (resultVars != null && resultVars.size() != 0) {
                soln = results.next();
                Conn = Integer.parseInt(soln.getLiteral(resultVars.get(0)).getLexicalForm());
            }
        } catch (Throwable t) {
            if (!shutdown)
                log.error(t, t);
        } finally {
            if (qexec != null)
                qexec.close();
            dataset.getLock().leaveCriticalSection();
        }

        beta = (float) Conn;
        //beta *= 100;
        beta += 1;

        // sigmoid function to keep beta between 0 to 1;

        beta = (float) (1 / (1 + Math.pow(Math.E, (-beta))));

        if (beta > 1)
            log.info("Beta higher than 1 : " + beta);
        else if (beta <= 0)
            log.info("Beta lower < = 0 : " + beta);
        return beta;
    }

    public String[] getAdjacentNodes(String uri) {

        List<String> queryList = new ArrayList<String>();
        Set<String> adjacentNodes = new HashSet<String>();
        Set<String> coauthorNames = new HashSet<String>();
        String[] info = new String[] { "", "" };
        StringBuffer adjacentNodesConcat = new StringBuffer();
        StringBuffer coauthorBuff = new StringBuffer();
        adjacentNodesConcat.append("");
        coauthorBuff.append("");

        queryList.add(prefix + " SELECT ?adjobj (str(?adjobjLabel) as ?coauthor) " + " WHERE { "
                + " ?uri rdf:type <http://xmlns.com/foaf/0.1/Person> . " + " ?uri ?prop ?obj . "
                + " ?obj rdf:type <http://vivoweb.org/ontology/core#Relationship> . " + " ?obj ?prop2 ?obj2 . "
                + " ?obj2 rdf:type obo:IAO_0000030 . " + " ?obj2 ?prop3 ?obj3 . "
                + " ?obj3 rdf:type <http://vivoweb.org/ontology/core#Relationship> . " + " ?obj3 ?prop4 ?adjobj . "
                + " ?adjobj rdfs:label ?adjobjLabel . " + " ?adjobj rdf:type <http://xmlns.com/foaf/0.1/Person> . "
                +

                " FILTER (?prop !=rdf:type) . " + " FILTER (?prop2!=rdf:type) . " + " FILTER (?prop3!=rdf:type) . "
                + " FILTER (?prop4!=rdf:type) . " + " FILTER (?adjobj != ?uri) . " + "}");

        queryList.add(prefix + " SELECT ?adjobj " + " WHERE{ " +

                " ?uri rdf:type foaf:Agent . " + " ?uri ?prop ?obj . " + " ?obj ?prop2 ?adjobj . " +

                " FILTER (?prop !=rdf:type) . " + " FILTER isURI(?obj) . " +

                " FILTER (?prop2!=rdf:type) . " + " FILTER (?adjobj != ?uri) . " + " FILTER isURI(?adjobj) . " +

                " { ?adjobj rdf:type <http://xmlns.com/foaf/0.1/Organization> . } " + " UNION "
                + " { ?adjobj rdf:type <http://xmlns.com/foaf/0.1/Person> . } " + " UNION "
                + " { ?adjobj rdf:type obo:IAO_0000030 . } " + " UNION "
                + " { ?adjobj rdf:type <http://vivoweb.org/ontology/core#Location> . } ." + "}");

        Query query;

        QuerySolution soln;
        QuerySolutionMap initialBinding = new QuerySolutionMap();
        Resource uriResource = ResourceFactory.createResource(uri);

        initialBinding.add("uri", uriResource);

        Iterator<String> queryItr = queryList.iterator();

        dataset.getLock().enterCriticalSection(Lock.READ);
        Resource adjacentIndividual = null;
        RDFNode coauthor = null;
        try {
            while (queryItr.hasNext()) {
                /*if(!isPerson){
                   queryItr.next(); // we don't want first query to execute if the ind is not a person. 
                }*/
                query = QueryFactory.create(queryItr.next(), Syntax.syntaxARQ);
                QueryExecution qexec = QueryExecutionFactory.create(query, dataset, initialBinding);
                try {
                    ResultSet results = qexec.execSelect();
                    while (results.hasNext()) {
                        soln = results.nextSolution();

                        adjacentIndividual = (Resource) soln.get("adjobj");
                        if (adjacentIndividual != null) {
                            adjacentNodes.add(adjacentIndividual.getURI());
                        }

                        coauthor = soln.get("coauthor");
                        if (coauthor != null) {
                            coauthorNames.add(" co-authors " + coauthor.toString() + " co-authors ");
                        }
                    }
                } catch (Exception e) {
                    if (!shutdown)
                        log.error("Error found in getAdjacentNodes method of SearchQueryHandler");
                } finally {
                    qexec.close();
                }
            }
            queryList = null;
            Iterator<String> itr = adjacentNodes.iterator();
            while (itr.hasNext()) {
                adjacentNodesConcat.append(itr.next() + " ");
            }

            info[0] = adjacentNodesConcat.toString();

            itr = coauthorNames.iterator();
            while (itr.hasNext()) {
                coauthorBuff.append(itr.next());
            }

            info[1] = coauthorBuff.toString();

        } catch (Throwable t) {
            if (!shutdown)
                log.error(t, t);
        } finally {
            dataset.getLock().leaveCriticalSection();
            adjacentNodes = null;
            adjacentNodesConcat = null;
            coauthorBuff = null;
        }
        return info;
    }

    @Override
    public void modifyDocument(Individual individual, SearchInputDocument doc, StringBuffer addUri) {
        // TODO Auto-generated method stub
        // calculate beta value.  
        log.debug("Parameter calculation starts..");
        float beta = calculateBeta(individual.getURI());
        doc.addField(VitroSearchTermNames.BETA, (Object) beta);
        doc.setDocumentBoost(beta + doc.getDocumentBoost());
        log.debug("Parameter calculation is done");
    }

    @Override
    public void shutdown() {
        shutdown = true;
    }
}

class TotalInd implements Runnable {
    private Dataset dataset;
    private String totalCountQuery;
    private static Log log = LogFactory.getLog(TotalInd.class);

    public TotalInd(Dataset dataset, String totalCountQuery) {
        this.dataset = dataset;
        this.totalCountQuery = totalCountQuery;

    }

    @Override
    public void run() {
        int totalInd = 0;
        Query query;
        QuerySolution soln = null;
        dataset.getLock().enterCriticalSection(Lock.READ);
        QueryExecution qexec = null;

        try {
            query = QueryFactory.create(totalCountQuery, Syntax.syntaxARQ);
            qexec = QueryExecutionFactory.create(query, dataset);
            ResultSet results = qexec.execSelect();
            List<String> resultVars = results.getResultVars();

            if (resultVars != null && resultVars.size() != 0) {
                soln = results.next();
                totalInd = Integer.parseInt(soln.getLiteral(resultVars.get(0)).getLexicalForm());
            }
            //CalculateParameters.totalInd = totalInd;
            //log.info("Total number of individuals in the system are : " + CalculateParameters.totalInd);
        } catch (Throwable t) {
            log.error(t, t);
        } finally {
            if (qexec != null)
                qexec.close();
            dataset.getLock().leaveCriticalSection();
        }

    }
}