Mercurial > hg > AnnotationManager
view src/main/java/de/mpiwg/itgroup/annotationManager/RDFHandling/RDFSearcher.java @ 34:bd414fe235b5 default tip
now with 100% better sparql.
author | casties |
---|---|
date | Thu, 31 May 2012 21:32:30 +0200 |
parents | e5f5848892a2 |
children |
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(); static final String baseGraph = " ?annotation <" + NS.RDF_NS + "type> <" + NS.OAC_NS + "Annotation>." + " ?annotation <" + NS.OAC_NS + "hasTarget> ?target." + " ?annotation <" + NS.OAC_NS + "hasBody> ?body." + " ?annotation <" + NS.DCTERMS_NS + "creator> ?creator." + " ?annotation <" + NS.DCTERMS_NS + "created> ?created." + " ?body <" + NS.CNT_NS + "chars> ?text." + " ?target <" + NS.DCTERMS_NS + "isPartOf> ?uri."; static final String optGraph = " OPTIONAL { ?body <" + NS.RDF_NS + "type> <" + NS.OAC_NS + "Body>}" + " OPTIONAL { ?body <" + NS.RDF_NS + "type> <" + NS.CNT_NS + "ContentAsText>}" + " OPTIONAL { ?target <" + NS.RDF_NS + "type> <" + NS.OAC_NS + "Target>}"; static final String nonOptGraph = " ?body <" + NS.RDF_NS + "type> <" + NS.OAC_NS + "Body>." + " ?body <" + NS.RDF_NS + "type> <" + NS.CNT_NS + "ContentAsText>." + " ?target <" + NS.RDF_NS + "type> <" + NS.OAC_NS + "Target>."; static final String annotGraph = baseGraph + optGraph; 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 = ""; 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 = annotGraph; if (uri != null && !uri.equals("")) { whereString += String.format("FILTER (?uri = <%s>)", uri); } if (user != null && !user.equals("")) { if (user.startsWith("http")) { whereString += String.format("FILTER (?creator = <%s>)", user); } else { whereString += String.format("FILTER (?creator = \"%s\")", user); } } 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("creator").getValue().stringValue(); } String textString = ""; if (result.getBinding("text") != null) { textString = result.getBinding("text").getValue().stringValue(); } String xpointer = result.getBinding("target").getValue().stringValue(); String time = result.getBinding("created").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 whereString = annotGraph + String.format(" FILTER(?annotation = <%s>)", id); String queryString = String.format("DELETE FROM <%s> {%s} WHERE {%s}", context, baseGraph+nonOptGraph, whereString); logger.debug("RDFSearcher:" + queryString); try { th.querySPARQL(queryString); } catch (Exception e) { e.printStackTrace(); throw new TripleStoreSearchError(); } } }