Upload
raji-ghawi
View
2.540
Download
2
Embed Size (px)
DESCRIPTION
tutorial about processing SPARQL1.0 queries using Java and ARQ of Jena.
Citation preview
Processing SPARQL Queries using Java
Raji GHAWI
26/01/2009
ARQ - A SPARQL Processor for Jena
2
Outline
Query Execution
Query Analysis
26/01/2009
1. Query Execution
4
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();}
Query Execution
26/01/2009
5
Put the query as 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 ?dip \n" + "WHERE {\n" + " ?stud my:enrolledIn ?dip.\n" + "} ";
PREFIX my:<http://www.something.com/myontology#>PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?stud ?dipWHERE { ?stud my:enrolledIn ?dip.}
Query Execution
26/01/2009
6
Execute the Query
Query query = QueryFactory.create(sparqlQuery);
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet results = qe.execSelect();
a single execution of a query
encapsulates a parsed query
read a textual query from a String
Query Execution
26/01/2009
7
Print Query Results
ResultSetFormatter.out(System.out, results, query);
-----------------------------------| stud | dip |===================================| my:Simon_Thevenin | my:M2_BDIA || my:Raji_Ghawi | my:Doctorat || my:Kamel_Boulil | my:M2_BDIA |-----------------------------------
output
textual format standard output
result set
Query Execution
26/01/2009
8
<?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
ResultSetFormatter.outputAsXML(System.out, results);
XML format
26/01/2009
9
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(); }}
Query Execution
26/01/2009
10
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()); }}
--------- solution ---------stud http://www.something.com/myontology#Guillermo_Gomezdip http://www.something.com/myontology#These--------- solution ---------stud http://www.something.com/myontology#Elie_Raaddip http://www.something.com/myontology#M2-BDIA--------- solution ---------stud http://www.something.com/myontology#Raji_Ghawidip http://www.something.com/myontology#M2-BDIA
output
Query Execution
26/01/2009
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); }}
--------- solution ---------stud my:Guillermo_Gomezdip my:These--------- solution ---------stud my:Elie_Raaddip my:M2-BDIA--------- solution ---------stud my:Raji_Ghawidip my:M2-BDIA
output
26/01/2009
2. Query Analysis
13
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').
}
Query Analysis
26/01/2009
14
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" + "} ";
Query Analysis
26/01/2009
15
Create the Query
Query query = QueryFactory.create(sparqlQuery);
System.out.println("---------- Query ----------");System.out.println(query);
---------- Query ----------PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>PREFIX my: <http://www.something.com/myontology#>SELECT ?stud ?modNameWHERE { ?stud my:enrolledIn ?dip ; rdf:type my:Student ; my:enrolledIn ?dip . ?dip my:hasModule ?mod . ?mod my:moduleName ?modName . FILTER ( ?modName = "Databases" ) }
output
Query Analysis
26/01/2009
16
Prefix Mapping
------ Prefix Mapping ------rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#my http://www.something.com/myontology#
output
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);}
Query Analysis
26/01/2009
17
Retrieve Result Variables
------ Result Variables ------studmodName
output
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);}
query.isQueryResultStar()
query.isDistinct()
Query Analysis
26/01/2009
18
Retrieve All Variables
------- All Variables --------studdipmodmodName
output
System.out.println("------- All Variables --------");Iterator varIter = query.getQueryBlock().varsMentioned().iterator();while(varIter.hasNext()){ String var = varIter.next().toString(); System.out.println(var);}
Query Analysis
26/01/2009
19
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(); }}
Query Analysis
26/01/2009
20
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++){ // ....}
Query Analysis
ElementOptional
26/01/2009
21
ElementFilter elf = (ElementFilter) elem;
Iterator iter = elf.varsMentioned().iterator();// ....
Expr expr = elf.getConstraint().getExpr();// ....
Query Analysis
ElementFilter
26/01/2009
22
Query Analysis
Expr
if (expr instanceof E_LogicalAnd) { E_LogicalAnd and = (E_LogicalAnd) expr; Expr left = and.getLeft(); Expr right = and.getRight(); //} 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(); // .. ..}
E_LogicalAndE_LogicalOrE_EqualsE_NotEqualsE_LessThanE_LessThanOrEqualE_GreaterThanE_GreaterThanOrEqual
E_LogicalNot
E_Regex
NodeVar
NodeValueIntegerNodeValueFloatNodeValueDecimalNodeValueString...
getSubExpr()
getLeft()getRight()
getVarName()
asString()
26/01/2009
23
ElementTriplePattern etp = (ElementTriplePattern) elem;
Triple triple = etp.getTriple();
Node subject = triple.getSubject();Node predicate = triple.getPredicate();Node object = triple.getObject();
Query Analysis
ElementTriplePattern
boolean isURI() boolean isLiteral() boolean isVariable()
SELECT ?stud ?dipWHERE { ?stud my:enrolledIn ?dip. ?dip my:diplomaName "BDIA". }
URI LiteralVariable
Subject Predicate Object
26/01/2009
24
Variable
Literal
URI
ObjectPredicateSubject
26/01/2009
25
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(); // .... } }}
Query Analysis
OrderBy
26/01/2009
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