Java and SPARQL

8,579 views

Published on

tutorial about processing SPARQL1.0 queries using Java and ARQ of Jena.

Published in: Technology, Education
2 Comments
14 Likes
Statistics
Notes
No Downloads
Views
Total views
8,579
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
384
Comments
2
Likes
14
Embeds 0
No embeds

No notes for slide

Java and SPARQL

  1. 1. Processing SPARQL Queries using Java ARQ - A SPARQL Processor for Jena Raji GHAWI 26/01/2009
  2. 2. Outline  Query Execution  Query Analysis 26/01/2009 2
  3. 3. 1. Query Execution
  4. 4. Query Execution Read a file into a model String fileName = "../univ.owl"; // Model model = ModelFactory.createDefaultModel(); OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM); try { File file = new File(fileName); FileReader reader = new FileReader(file); model.read(reader,null); } catch (Exception e) { e.printStackTrace(); } 26/01/2009 4
  5. 5. Query Execution Put the query as a string PREFIX my:<http://www.something.com/myontology#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT ?stud ?dip WHERE { ?stud my:enrolledIn } ?dip. String sparqlQuery = "PREFIX my:<http://www.something.com/myontology#>n" + "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>n" + "n" + "SELECT ?stud ?dip n" + "WHERE {n" + " ?stud my:enrolledIn ?dip.n" + "} "; 26/01/2009 5
  6. 6. Query Execution Execute the Query encapsulates a parsed query read a textual query from a String Query query = QueryFactory.create(sparqlQuery); QueryExecution qe = QueryExecutionFactory.create(query, model); ResultSet results = qe.execSelect(); a single execution of a query 26/01/2009 6
  7. 7. Query Execution Print Query Results result set ResultSetFormatter.out(System.out, results, query); textual format standard output ----------------------------------| stud | dip | =================================== | my:Simon_Thevenin | my:M2_BDIA | | my:Raji_Ghawi | my:Doctorat | | my:Kamel_Boulil | my:M2_BDIA | ----------------------------------- 26/01/2009 output 7
  8. 8. XML format ResultSetFormatter.outputAsXML(System.out, results); 26/01/2009 <?xml version="1.0"?> <sparql xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xs="http://www.w3.org/2001/XMLSchema#" xmlns="http://www.w3.org/2005/sparql-results#" > <head> <variable name="stud"/> <variable name="dip"/> </head> <results ordered="false" distinct="false"> <result> <binding name="stud"> <uri>http://www.something.com/myontology#Simon_Thevenin</uri> </binding> <binding name="dip"> <uri>http://www.something.com/myontology#M2_BDIA</uri> </binding> </result> <result> <binding name="stud"> <uri>http://www.something.com/myontology#Raji_Ghawi</uri> </binding> <binding name="dip"> <uri>http://www.something.com/myontology#Doctorat</uri> </binding> </result> <result> <binding name="stud"> <uri>http://www.something.com/myontology#Kamel_Boulil</uri> </binding> <binding name="dip"> <uri>http://www.something.com/myontology#M2_BDIA</uri> </binding> </result> </results> </sparql> output 8
  9. 9. Query Execution Save Query Results to String MyOutputStream myOutput = new MyOutputStream(); ResultSetFormatter.out(myOutput, results, query); String sparqlResults = myOutput.getString(); class MyOutputStream extends OutputStream { StringBuffer buf; public MyOutputStream(){ buf = new StringBuffer(); } public void write(int character) throws IOException { buf.append((char) character); } public String getString() { return buf.toString(); } } 26/01/2009 9
  10. 10. Query Execution Retrieve Query Solutions ResultSet results = qe.execSelect(); List vars = results.getResultVars(); while(results.hasNext()) { QuerySolution qs = results.nextSolution(); System.out.println("--------- solution ---------"); for (int i = 0; i < vars.size(); i++) { String var = vars.get(i).toString(); RDFNode node = qs.get(var); System.out.println(var + "t" + node.toString()); } } --------stud dip --------stud dip --------stud dip 26/01/2009 output solution --------http://www.something.com/myontology#Guillermo_Gomez http://www.something.com/myontology#These solution --------http://www.something.com/myontology#Elie_Raad http://www.something.com/myontology#M2-BDIA solution --------http://www.something.com/myontology#Raji_Ghawi http://www.something.com/myontology#M2-BDIA 10
  11. 11. ResultSet results = qe.execSelect(); List vars = results.getResultVars(); PrefixMapping pm = query.getPrefixMapping(); while (results.hasNext()) { QuerySolution qs = results.nextSolution(); System.out.println("--------- solution ---------"); for (int i = 0; i < vars.size(); i++) { String var = vars.get(i).toString(); RDFNode node = qs.get(var); String text = ""; if(node.isURIResource()){ text = pm.shortForm(node.asNode().getURI()); } else { text = node.toString(); } System.out.println(var+"t"+text); } } --------stud dip --------stud dip --------stud dip 26/01/2009 solution --------my:Guillermo_Gomez my:These solution --------my:Elie_Raad my:M2-BDIA solution --------my:Raji_Ghawi my:M2-BDIA output 11
  12. 12. 2. Query Analysis
  13. 13. Query Analysis PREFIX my:<http://www.something.com/myontology#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT ?stud ?modName WHERE { ?stud rdf:type my:Student . ?stud my:enrolledIn ?dip . ?dip my:hasModule ?mod . ?mod my:moduleName ?modName. FILTER (?modName='Databases'). } 26/01/2009 13
  14. 14. Query Analysis Put the Query in a String String sparqlQuery = "PREFIX my:<http://www.something.com/myontology#>n" + "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>n" + "n" + "SELECT ?stud ?modName n" + "WHERE {n" + " ?stud rdf:type my:Student .n" + " ?stud my:enrolledIn ?dip .n" + " ?dip my:hasModule ?mod .n" + " ?mod my:moduleName ?modName.n" + " FILTER(?modName='Databases').n" + "} "; 26/01/2009 14
  15. 15. Query Analysis Create the Query Query query = QueryFactory.create(sparqlQuery); System.out.println("---------- Query System.out.println(query); ----------"); output ---------- Query ---------PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX my: <http://www.something.com/myontology#> SELECT ?stud ?modName WHERE { ?stud my:enrolledIn ?dip ; rdf:type my:Student ; my:enrolledIn ?dip . ?dip my:hasModule ?mod . ?mod my:moduleName ?modName . FILTER ( ?modName = "Databases" ) } 26/01/2009 15
  16. 16. Query Analysis Prefix Mapping System.out.println("------ Prefix Mapping ------"); Map map = query.getPrefixMapping().getNsPrefixMap(); Iterator pmIter= map.entrySet().iterator(); while (pmIter.hasNext()) { Entry ent = (Entry) pmIter.next(); String prefix = ent.getKey().toString(); String namespace = ent.getValue().toString(); System.out.println(prefix+"t"+namespace); } ------ Prefix Mapping -----rdf http://www.w3.org/1999/02/22-rdf-syntax-ns# my http://www.something.com/myontology# 26/01/2009 output 16
  17. 17. Query Analysis Retrieve Result Variables System.out.println("------ Result Variables ------"); List varList = query.getResultVars(); for (int i = 0; i < varList.size(); i++) { String var = varList.get(i).toString(); System.out.println(var); } ------ Result Variables -----stud modName output query.isQueryResultStar() query.isDistinct() 26/01/2009 17
  18. 18. Query Analysis Retrieve All Variables System.out.println("------- All Variables --------"); Iterator varIter = query.getQueryBlock().varsMentioned().iterator(); while(varIter.hasNext()){ String var = varIter.next().toString(); System.out.println(var); } ------- All Variables -------stud dip mod modName 26/01/2009 output 18
  19. 19. Query Analysis Fetch Query Elements ElementGroup eg = (ElementGroup) query.getQueryBlock().getPatternElement(); List elemList = eg.getElements(); for(int i=0; i<elemList.size(); i++){ Element elem = (Element) elemList.get(i); try{ if (elem instanceof ElementOptional) { ElementOptional elOp = (ElementOptional) elem; // .... } else if (elem instanceof ElementFilter) { ElementFilter elf = (ElementFilter) elem; // .... } else if (elem instanceof ElementTriplePattern) { ElementTriplePattern etp = (ElementTriplePattern) elem; // .... } } catch(ClassCastException e){ e.printStackTrace(); } } 26/01/2009 19
  20. 20. Query Analysis ElementOptional ElementOptional elOp = (ElementOptional) elem; Iterator iter = elOp.varsMentioned().iterator(); // .... ElementGroup newElemGrp = (ElementGroup) elOp.getElement(); List elemList = eg.getElements(); for(int i=0; i<elemList.size(); i++){ // .... } 26/01/2009 20
  21. 21. Query Analysis ElementFilter ElementFilter elf = (ElementFilter) elem; Iterator iter = elf.varsMentioned().iterator(); // .... Expr expr = elf.getConstraint().getExpr(); // .... 26/01/2009 21
  22. 22. Query Analysis Expr E_LogicalAnd E_LogicalOr E_Equals E_NotEquals E_LessThan E_LessThanOrEqual E_GreaterThan E_GreaterThanOrEqual E_LogicalNot getLeft() getRight() getSubExpr() E_Regex NodeVar if (expr instanceof E_LogicalAnd) { getVarName() E_LogicalAnd and = (E_LogicalAnd) expr; NodeValueInteger Expr left = and.getLeft(); NodeValueFloat Expr right = and.getRight(); asString() NodeValueDecimal // NodeValueString } else if (expr instanceof E_LogicalOr) { ... // .. .. } // .. .. else if (expr instanceof E_Regex) { E_Regex re = (E_Regex) expr; String pattern = ((NodeValueString) re.getPattern()).asString(); String varName = re.getRegexExpr().getVarName().toString(); // .. .. } 26/01/2009 22
  23. 23. Query Analysis ElementTriplePattern ElementTriplePattern etp = (ElementTriplePattern) elem; Triple triple = etp.getTriple(); Node subject = triple.getSubject(); Node predicate = triple.getPredicate(); Node object = triple.getObject();    SELECT ?stud ?dip WHERE { ?stud my:enrolledIn ?dip my:diplomaName } boolean isURI() boolean isLiteral() boolean isVariable() Subject Variable 26/01/2009 URI Predicate ?dip. "BDIA". Object Literal 23
  24. 24. Subject Predicate Object URI Literal Variable 26/01/2009 24
  25. 25. Query Analysis OrderBy if(query.getOrderBy() != null){ Iterator orderBy = query.getOrderBy().iterator(); while (orderBy.hasNext()) { SortCondition sc = (SortCondition) orderBy.next(); Expr exp = sc.getExpression(); if(exp.isVariable()){ String obv = exp.getVarName(); // .... } } } 26/01/2009 25
  26. 26. References  ARQ - A SPARQL Processor for Jena   http://jena.sourceforge.net/ARQ/ Search RDF data with SPARQL  http://www.ibm.com/developerworks/xml/library/j-sparql 26/01/2009 26

×