Top Banner
Processing SPARQL Queries using Java Raji GHAWI 26/01/2009 ARQ - A SPARQL Processor for Jena
26

Java and SPARQL

Nov 21, 2014

Download

Technology

Raji Ghawi

tutorial about processing SPARQL1.0 queries using Java and ARQ of Jena.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Java and SPARQL

Processing SPARQL Queries using Java

Raji GHAWI

26/01/2009

ARQ - A SPARQL Processor for Jena

Page 2: Java and SPARQL

2

Outline

Query Execution

Query Analysis

26/01/2009

Page 3: Java and SPARQL

1. Query Execution

Page 4: Java and SPARQL

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

Page 5: Java and SPARQL

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

Page 6: Java and SPARQL

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

Page 7: Java and SPARQL

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

Page 8: Java and SPARQL

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

Page 9: Java and SPARQL

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

Page 10: Java and SPARQL

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

Page 11: Java and SPARQL

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

Page 12: Java and SPARQL

2. Query Analysis

Page 13: Java and SPARQL

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

Page 14: Java and SPARQL

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

Page 15: Java and SPARQL

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

Page 16: Java and SPARQL

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

Page 17: Java and SPARQL

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

Page 18: Java and SPARQL

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

Page 19: Java and SPARQL

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

Page 20: Java and SPARQL

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

Page 21: Java and SPARQL

21

ElementFilter elf = (ElementFilter) elem;

Iterator iter = elf.varsMentioned().iterator();// ....

Expr expr = elf.getConstraint().getExpr();// ....

Query Analysis

ElementFilter

26/01/2009

Page 22: Java and SPARQL

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

Page 23: Java and SPARQL

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

Page 24: Java and SPARQL

24

Variable

Literal

URI

ObjectPredicateSubject

26/01/2009

Page 25: Java and SPARQL

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

Page 26: Java and SPARQL

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