view src/main/java/de/mpiwg/itgroup/annotationManager/RDFHandling/RDFSearcher.java @ 33:e5f5848892a2

new annotation model basically works.
author casties
date Thu, 31 May 2012 19:08:48 +0200
parents b37487b756ac
children bd414fe235b5
line wrap: on
line source

package de.mpiwg.itgroup.annotationManager.RDFHandling;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.openrdf.query.BindingSet;
import org.openrdf.query.TupleQueryResult;

import de.mpiwg.itgroup.annotationManager.Constants.NS;
import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreSearchError;
import de.mpiwg.itgroup.triplestoremanager.exceptions.TripleStoreHandlerException;
import de.mpiwg.itgroup.triplestoremanager.owl.TripleStoreHandler;

public class RDFSearcher {

    private String context;

    private Logger logger = Logger.getRootLogger();

    public RDFSearcher(String context) {
        this.context = context;
    }

    /**
     * Retrieves Annotations by ID.
     * 
     * @param id
     *            id of the Annotation
     * @return
     * @throws TripleStoreHandlerException
     * @throws TripleStoreSearchError
     */
    public List<Annotation> searchById(String id) throws TripleStoreHandlerException, TripleStoreSearchError {
        if (id == null) {
            return null;
        }
        List<Annotation> retAnnots = new ArrayList<Annotation>();
        TripleStoreHandler th = TripleStoreConnection.newTripleStoreHandler();
        String queryString = "";
        // query for tuples with id as subject
        StringBuilder whereString = new StringBuilder();
        whereString.append(String.format("<%s> <http://www.openannotation.org/ns/hasTarget> ?target.", id));
        whereString.append("?target <http://www.purl.org/dc/terms/isPartOf> ?uri.");
        whereString.append(String.format("<%s> <http://www.openannotation.org/ns/hasBody> ?body.", id));
        whereString.append("?body <http://www.w3.org/2011/content#chars> ?bodyText.");
        whereString.append(String.format("<%s> <http://www.purl.org/dc/terms/creator> ?userUrl.", id));
        whereString.append(String.format("<%s> <http://www.purl.org/dc/terms/created> ?creationDate", id));
        
        /*
         * StringBuilder whereString = new
         * StringBuilder(String.format("<%s> ?p <http://www.w3.org/2000/10/annotationType#Comment>.", id));
         * whereString.append(String
         * .format("<%s> <http://ontologies.mpiwg-berlin.mpg.de/annotations/annotatesDocuviewerText> ?uri.", id));
         * whereString.append(String.format("<%s> <http://ontologies.mpiwg-berlin.mpg.de/annotations/textSelection> ?xpointer.",
         * id)); whereString.append(String.format("<%s> <http://www.w3.org/2000/10/annotation-ns#body> ?annotText.", id));
         * whereString.append(String.format("<%s> <http://www.w3.org/2000/10/annotation-ns#author> ?author.", id));
         * whereString.append(String.format("<%s> <http://www.w3.org/2000/10/annotation-ns#created> ?created.", id));
         * whereString.append(" OPTIONAL {?annotText <http://ontologies.mpiwg-berlin.mpg.de/annotations/containsText> ?text.}");
         */

        queryString = String.format("select * from <%s> where {%s}", context, whereString);

        logger.debug("RDFSearcher:" + queryString);

        try {
            TupleQueryResult results = th.querySPARQL(queryString);
            while (results.hasNext()) {
                BindingSet result = results.next();
                String annotUri = result.getBinding("uri").getValue().stringValue();
                String annotUser = result.getBinding("userUrl").getValue().stringValue();
                String textString = "";
                if (result.getBinding("bodyText") != null) {
                    textString = result.getBinding("bodyText").getValue().stringValue();
                }

                String xpointer = result.getBinding("target").getValue().stringValue();
                String created = result.getBinding("creationDate").getValue().stringValue();
                Annotation annot = new Annotation(xpointer, annotUser, created, textString, null, annotUri, id);
                retAnnots.add(annot);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new TripleStoreSearchError();
        }
        return retAnnots;
    }

    /**
     * Sucht im Triplestore nach Annotationen
     * 
     * select * from <file:///annotations2> where { ?target <http://www.purl.org/dc/terms/isPartOf>
     * <file:///Volumes/Schlachteplatte/Users/casties/Library/Eclipse/annotator/dev.html>. ?ann
     * <http://www.openannotation.org/ns/hasTarget> ?target. ?ann <http://www.openannotation.org/ns/hasBody> ?body. ?body
     * <http://www.w3.org/2011/content#chars> ?bodyText. }
     * 
     * @param uri
     *            Adresse der Annotierten Ressource, in der Regel nicht mit dem xpointer, sonder die URI der kompletten Ressource
     *            oder NULL oder leer
     * @param user
     *            Author der Annotationen, entweder als uri der Person oder ein Username, je nachdem wie die Annotatinen angelegt
     *            wurden.
     * @param limit
     * @param offset
     * @return
     * @throws TripleStoreHandlerException
     * @throws TripleStoreSearchError
     */
    public List<Annotation> searchByUriUser(String uri, String user, String limit, String offset)
            throws TripleStoreHandlerException, TripleStoreSearchError {

        List<Annotation> retAnnots = new ArrayList<Annotation>();
        TripleStoreHandler th = TripleStoreConnection.newTripleStoreHandler();
        String queryString = "";

        String whereString = "?s ?p <http://www.w3.org/2000/10/annotationType#Comment>.";
        // whereString +="?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/docuviewerText> ?link.";

        if (uri != null && !uri.equals("")) {
            whereString = String.format("?target <http://www.purl.org/dc/terms/isPartOf> <%s>.", uri);
        } else {
            whereString = "?target <http://www.purl.org/dc/terms/isPartOf> ?uri.";
        }
        whereString += "?annotation <http://www.openannotation.org/ns/hasTarget> ?target.";
        whereString += "?annotation <http://www.openannotation.org/ns/hasBody> ?body.";
        whereString += "?body <http://www.w3.org/2011/content#chars> ?bodyText.";

        if (user != null && !user.equals("")) {
            if (user.startsWith("http")) {
                whereString += String.format("?annotation <http://www.purl.org/dc/terms/creator> <%s>", user);
            } else {
                whereString += String.format("?annotation <http://www.purl.org/dc/terms/creator> \"%s\".", user);
            }
        } else {
            whereString += "?annotation <http://www.purl.org/dc/terms/creator> ?userUrl.";
        }

        whereString += "?annotation <http://www.purl.org/dc/terms/created> ?creationDate";

        queryString = String.format("select * from <%s> where {%s}", context, whereString);

        logger.debug("RDFSearcher:" + queryString);

        try {
            TupleQueryResult results = th.querySPARQL(queryString);

            while (results.hasNext()) {
                BindingSet result = results.next();
                String annotatedUri;
                if (uri != null && !uri.equals("")) {
                    annotatedUri = uri;
                } else {
                    annotatedUri = result.getBinding("uri").getValue().stringValue();
                }

                String annotUser;
                if (user != null && !user.equals("")) {
                    annotUser = user;
                } else {
                    annotUser = result.getBinding("userUrl").getValue().stringValue();
                }

                String textString = "";
                if (result.getBinding("bodyText") != null) {
                    textString = result.getBinding("bodyText").getValue().stringValue();
                }
                String xpointer = result.getBinding("target").getValue().stringValue();
                String time = result.getBinding("creationDate").getValue().stringValue();
                String annotationUri = result.getBinding("annotation").getValue().stringValue();
                Annotation annot = new Annotation(xpointer, annotUser, time, textString, null, annotatedUri, annotationUri);
                retAnnots.add(annot);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new TripleStoreSearchError();
        }
        // TODO Auto-generated method stub
        return retAnnots;
    }

    public void deleteById(String id) throws TripleStoreHandlerException, TripleStoreSearchError {
        if (id == null) {
            return;
        }
        TripleStoreHandler th = TripleStoreConnection.newTripleStoreHandler();
        // delete triples with id as subject
        /*
         * wish Virtuoso would speak SparQL1.1... String queryString =
         * String.format("WITH <%s> DELETE { <%s> ?p ?o } WHERE { <%s> ?p ?o }", context, id, id);
         */
        String queryString = String.format("DELETE FROM <%s> { <%s> ?p ?o } WHERE { <%s> ?p ?o }", context, id, id);

        logger.debug("RDFSearcher:" + queryString);

        try {
            th.querySPARQL(queryString);
        } catch (Exception e) {
            e.printStackTrace();
            throw new TripleStoreSearchError();
        }
    }
    /**
     * Sucht im Triplestore nach Annotationen
     * 
     * @param uri
     *            Adresse der Annotierten Ressource, in der Regel nicht mit dem xpointer, sonder die URI der kompletten Ressource
     *            oder NULL oder leer
     * @param user
     *            Author der Annotationen, entweder als uri der Person oder ein Username, je nachdem wie die Annotatinen angelegt
     *            wurden.
     * @param limit
     * @param offset
     * @return
     * @throws TripleStoreHandlerException
     * @throws TripleStoreSearchError
     */
    public List<Annotation> searchByUriUserAlt(String uri, String user, String limit, String offset)
            throws TripleStoreHandlerException, TripleStoreSearchError {

        List<Annotation> retAnnots = new ArrayList<Annotation>();
        TripleStoreHandler th = TripleStoreConnection.newTripleStoreHandler();
        String queryString = "";

        String whereString = "?s ?p <http://www.w3.org/2000/10/annotationType#Comment>.";
        // whereString +="?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/docuviewerText> ?link.";

        if (uri != null && !uri.equals("")) {
            whereString += String.format("?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/annotatesDocuviewerText> <%s>.",
                    uri);
        } else {
            whereString += String.format("?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/annotatesDocuviewerText> ?uri.");
        }
        whereString += String.format("?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/textSelection> ?xpointer.");
        whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#body> ?annotText.");

        if (user != null && !user.equals("")) {
            if (user.startsWith("http")) {
                whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#author> <%s>.", user);
            } else {
                whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#author> \"%s\".", user);
            }
        } else {
            whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#author> ?author.");
        }

        whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#created> ?created.");

        whereString += String
                .format(" OPTIONAL {?annotText <http://ontologies.mpiwg-berlin.mpg.de/annotations/containsText> ?text.}");

        queryString = String.format("select distinct * where {%s}", whereString);

        logger.debug("RDFSearcher:" + queryString);

        try {
            TupleQueryResult results = th.querySPARQL(queryString);

            while (results.hasNext()) {
                BindingSet result = results.next();
                String annotUri;
                if (uri != null && !uri.equals("")) {
                    annotUri = uri;
                } else {
                    annotUri = result.getBinding("uri").getValue().stringValue();
                }

                String annotUser;
                if (user != null && !user.equals("")) {
                    annotUser = user;
                } else {
                    annotUser = result.getBinding("author").getValue().stringValue();
                }

                String textString = "";
                if (result.getBinding("text") != null) {
                    textString = result.getBinding("text").getValue().stringValue();
                }
                Annotation annot = new Annotation(result.getBinding("xpointer").getValue().stringValue(), annotUser, result
                        .getBinding("created").getValue().stringValue(), textString, null, annotUri, result.getBinding("s")
                        .getValue().stringValue());
                retAnnots.add(annot);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new TripleStoreSearchError();
        }
        // TODO Auto-generated method stub
        return retAnnots;
    }

}