sparql & jena

Post on 08-Jan-2016

75 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

SPARQL & JENA. Γενικά. JENA : Είναι ένα java framework για τη δημιουργία semantic web Εφαρμογών. Μπορεί να Χρησιμοποιηθει για να δουλέψουμε σε RDF/RDFS , OWL , για να κάνουμε storage , inference και για ερωτήσεις ( queries ) μέσω της SPARQL. Γενικά. - PowerPoint PPT Presentation

TRANSCRIPT

SPARQL & JENA

Γενικά

• JENA : Είναι ένα java framework για τη δημιουργία semantic web Εφαρμογών.

• Μπορεί να Χρησιμοποιηθει για να δουλέψουμε σε RDF/RDFS , OWL , για να κάνουμε storage , inference και για ερωτήσεις ( queries ) μέσω της SPARQL.

Γενικά

• SPARQL : Είναι μία query language που μας επιτρέπει να κάνουμε ερωτήσεις σε δεδομένα του semantic web. Είναι για το semantic web ότι και η SQL για τις σχεσιακές βάσεις δεδομένων.

Part I: SPARQLBasics [5–9]

Query Structure [ 10 ]

Prefix [11–12]

Select [13–15]

From [16–19]

Where [20–27]

Modifiers [28–31]

Links [32]

Σύντομη περιγραφή της SPARQL

Περιγραφή της δομής ενός SPARQL query

Επεξήγηση των SPARQL query prefixes

Επεξήγηση των Select – Select Distinct

Επεξήγηση των FROM – FROM NAME – Default & Named Graphs

Επεξήγηση των WHERE – FILTERS – OPTIONAL - UNION

Επεξήγηση των LIMIT – OFFSET – ORDER BY

Περιεχόμενα

Χρήσιμοι σύνδεσμοι για τη SPARQL

SPARQL – Basics

• H SPARQL κάνει ερωτήσεις σε τριπλέτες rdf. Ρωτάμε δηλαδή πάνω σε δεδομένα της μορφής subject – predicate - object χρησιμοποιώντας μεταβλητές όπου θέλουμε να πάρουμε απαντήσεις.

Πχ. select ?x where{ ex1:company ex1:hasEmployee ?x }

• Το “?” είναι το αναγνωριστικό των μεταβλητών ( Πχ ?x,?y, ?temp1 , ?_temp )

SPARQL – Basics

• Ολες οι τριπλέτες σε ένα SPARQL query χωρίζοντε μεταξύ τους με “.” .

Πχ. select ?x where{

ex1:company ex1:hasEmployee ?x. ?x ex1:employeeName “JOHN”

}

SPARQL – Basics

• Όταν 2 ή περισσότερες τριπλέτες μοιράζοντε το ίδιο subject τότε μπορούμε να το παραλείψουμε χρησιμοποιώντας “;”

Πχ. select ?x where{

?x rdf:type ex1:Company ; ex:companyName “C1” ;

ex:hasEmail “C1@yahoo.gr” }

SPARQL – Basics

• To keyword “a” της SPARQL χρησιμοποιείται για να δούμε τον τύπο ενός αντικειμένου (την κλάση του). Ουσιαστικά είναι μια συντομογραφία για το rdf:type.

Πχ. select ?x where{

?x a ex1:Company }

SPARQL – Basics

• Σε μία τριπλέτα δεδομένων του Rdf δεν είναι απραίτητο να δηλώνεται το subject ή το object. Αντί αυτων έχουμε τα λεγόμενα BLANK NODES . Μπορούμε δηλαδή να έχουμε δεδομένα της μορφής subject – predicate ή predicate object

( πχ “ :blank node employeeName “george” )

SPARQL – Query Structure

• Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus et magna. Fusce sed sem sed magna suscipit egestas.

• Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus et magna. Fusce sed sem sed magna suscipit egestas.

SPARQL - Prefix

• Για να μην χρειάζεται να γράφουμε ολόκληρα τα URIs ,όταν γράφουμε ένα query , χρησιμοποιούμε Prefixes στην αρχή του query.

• Μερικά σημαντικά URIs και τα prefixes που χρησιμοποιούμε : PREFIX owl:<http://www.w3.org/2002/07/owl#> PREFIX xsd:<http://www.w3.org/2001/XMLSchema> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX time:<http://www.w3.org/2006/time#>

SPARQL - Prefix

SELECT ?x WHERE{<http://example.org/book#book1> <http://example.org/book#hasWriter> ?x}

Query με prefix :

PREFIX book: <http://example.org/book#> SELECT ?x WHERE{ book:book1 book:hasWriter ?x}

Query χωρίς prefix :

SPARQL - Select

• Με το SELECT επιλέγουμε το υποσύνολο που θέλουμε από τα δεδομένα που επιστρέφει η απάντηση.

• Πχ :1) SELECT ?x WHERE { ?x ex1:hasEmployee ?y } Θα επιτρέψει μόνο τη χ μεταβλητή ( Πχ { Company1 } ,

{ Company2 } )2) SELECT ?x , ?y WHERE { ?x ex1:hasEmployee ?y } Θα επιστρέψει και τις δύο μεταβλητές χ,y ( Πχ { Company1,Employee1 } , { Company2,Employee2 }3) SELECT * WHERE { ?x ex1:hasEmployee ?y } Επιστρέφει πάντα όλες τις μεταβλητές!

SPARQL - Select Distinct

• To distinct το χρησιμοποιούμε για να εξαλείψουμε την εμφάνιση του ίδιου αποτελέσματος περισσότερες από μία φορές στη λύση.

• Πχ. Εστω ότι τα δεδομένα μας είναι:

Company1 hasEmail “c1@yahoo.com”Company1 hasEmail “Company1@yahoo.com”Company1 hasEmail “Comp1@yahoo.com”

SPARQL - Select Distinct

• Εάν ρωτήσουμε με το query :

Τα αποτελέσματα που θα πάρουμε θα είναι :

Ενώ αν ρωτήσουμε με :

Θα πάρουμε :

SELECT ?x where { ?x ex:hasEmail ?y }

{Company1} , {Company1} , {Company1}

SELECT DISTINCT ?x where { ?x ex:hasEmail ?y }

{Company1}

SPARQL - From

• Στο FROM επιλέγουμε το dataSet πάνω στο οποίο θέλουμε να ρωτήσουμε.

• Όταν δεν καθορίζουμε datasets τότε ρωτάμε στο default dataSet (ένας γράφος).

• Η SPARQL μας δίνει τη δυνατότητα να ρωτήσουμε στο default dataset και σε ένα σύνολο από named graphs που καθορίζονται από το URI τους.

SPARQL – Default Graph

• Καθορίζουμε το default graph :

PREFIX ex: <http://example.org/companies/ex1/> SELECT ?cname FROM <http://example.org/companies> WHERE { ?x ex:companyName ?cname }

SPARQL – Named Graphs

• Χρησιμοποιώντας named graphs :

PREFIX ex: <http://example.org/companies/ex1/> SELECT ?src ?cname FROM <http://example.org/companies.rdf> FROM NAMED <http://example.org/ex1/> FROM NAMED <http://example.org/ex2/>

WHERE { GRAPH ?src { ?x ex:companyName ?cname } }

SPARQL – Named Graphs

• Παράδειγμα 2 :

SELECT DISTINCT ?person WHERE {

?person ex:name ?name . GRAPH ?g1 { ?person a foaf:Person } GRAPH ?g2 { ?person a foaf:Person } GRAPH ?g3 { ?person a foaf:Person }

FILTER( ?g1 != ?g2 && ?g1 != ?g3 && ?g2 != ?g3) . }

SPARQL - WHERE

• triplets• Filters• Optional path expressions • Unions • Το WHERE keyword είναι optional !

Select ?x where { ?x ?y ?z }

SPARQL - Filters

• Tα filters χρησιμοποιούντε μέσα στο where clause για να εξαλείψουμε , χρησιμοποιώντας λογικές παραστάσεις, ανεπιθύμητα αποτελέσματα. Πχ. SELECT ?x , ?y

WHERE{ ?x ex:takesSalary ?y

FILTER( ?y > 1000 ) }

SPARQL - Filters

• Logical: !, &&, || • Math: +, -, *, / • Comparison: =, !=, >, <, ... • SPARQL tests: isURI, isBlank, isLiteral,

bound • SPARQL accessors: str, lang, datatype • Other: sameTerm, langMatches, regex

SPARQL - Filters

• EXAMPLES :

•FILTER ( langMatches( lang( ?employeeName ) , "EN"))

•FILTER ( ?date > “”01-02-2004”” ^^xsd:date && ?date < “0-03-2004””^^xsd:date )

•FILTER ( REGEX( ?name , “”opoulos” )

SPARQL – Optional Path Expressions

• Χρησιμοποιείται όταν θέλουμε να ανζητήσουμε προαιρετικά κάποια δεδομένα.

ΠΑΡΑΔΕΙΓΜΑ :• ΄Εστω ότι θέλουμε να πάρουμε τα

δεδομένα όλων των εργαζομένων (employees) που δουλεύουν σε μια εταιρία ( Company1 )

SPARQL – Optional Path Expressions

SELECT DISTINCT ?name , ?phone ?email WHERE{

?employee ex:worksfor ex:company1; ex:employeeName ?name; ex:employeePhone ?phone; ex:employeeEmail ?email }

Αυτός είναι ένας ΛΑΘΟΣ τρόπος να ζητάμε δεδομένα γιατί σε περίπτωση που κάποιοςΥπάλληλος δεν έχει κάποιο από τα στοιχεία που ζητάμε τότε δεν θα επιστραφεί στηναπάντηση! Πχ αν ένας υπάλληλος δεν έχει email τότε το αποτέλεσμα αυτό “κόβεται”.Εμείς όμως θέλουμε όλους τους υπαλλήλους της εταιρίας. Η λύση είναι η χρήση του optional.

SPARQL – Optional Path Expressions

SELECT DISTINCT ?name , ?phone ?email WHERE{

?employee ex:worksfor ex:company1; ex:employeeName ?name. optional { ?employee ex:employeePhone ?phone } optional { ?employee ex:employeeEmail ?email } }

Αυτός είναι o ΣΩΣΤΟΣ τρόπος.

- Το Optional Μπορεί να χρησιμοποιηθεί και σε Nested queries:Πχ optional { optional { } } κτλ κτλ.

SPARQL - Union

• Το UNION το χρησιμοποιούμε για να πάρουμε την ένωση από κάποια set αποτελεσμάτων.

Πχ. PREFIX ex1: <http://example.org/company1/employees> PREFIX ex2: <http://example.org/company2/employees> SELECT ?name WHERE { { ?employee ex1:employeeName ?name } UNION { ?employee ex2:employeeName ?name } }

SPARQL – MODIFIERS

• Χρησιμοποιούμε MODIFIERS για να καθορίσουμε/επιλέξουμε το υποσύνολο των αποτελεσμάτων που θέλουμε στην απάντηση.

• Βασικοί MODIFIERS :• LIMIT – ORDER BY – OFFSET

SPARQL - Limit

• Το LIMIT το χρησιμοποιούμε για να περιορίσουμε τον αριθμό των αποτελεσμάτων που θα επιστραφούν.

Πχ. SELECT DISTINCT ?x WHERE{

?x a ex1:Company } LIMIT 50

SPARQL - Order By

• To ORDER BY χρησιμοποιείται για να ταξινομήσουμε τα αποτελέσματα (με βάση μια μεταβλητή ) με αύξουσα (ASC) ή φθίνουσα(DESC) σειρά.

Πχ. SELECT DISTINCT ?x , ?y WHERE{

?x ex:takesSalary ?y } ORDER BY DESC ( ?y ) LIMIT 50

SPARQL - Offset

• To OFFSET χρησιμοποιείται σε συνδιασμό με τα LIMIT και ORDER BY για να επιλέξουμε το υποσύνολο των αποτελεσμάτων που θέλουμε.

Πχ. SELECT DISTINCT ?x , ?y WHERE{

?x ex:takesSalary ?y } ORDER BY DESC ( ?y ) LIMIT 50 OFFSET 20

SPARQL – Usefull Links

• SPARQL W3C : http://www.w3.org/TR/rdf-sparql-query/

• SPARQL TUTORIALS : http://www.cambridgesemantics.com/2008/09/sparql-by-example/

• http://linkeddatatools.com/querying-semantic-data

Part IΙ: JENABasics [34]

Loading an Ontology [35-36]

Reading & writing Ontology Data [37–40]

Inference [41]

Executing Queries [42]

Links [43]

Σύντομη περιγραφή των δυνατοτήτων της JENA

Πως φορτώνουμε μια οντολογία ( με reasoner ή χωρίς )

Πως διαβάζουμε και γράφουμε δεδομένα σε μια Οντολογία( classes , properties , statements κτλ )

Πως καλούμε ένα reasoner ( Παράδειγμα Pellet )

Πως εκτελούμε ένα SPARQL query μέσω JENA

Περιεχόμενα

Χρήσιμοι σύνδεσμοι για τη JENA

JENA - Basics

To framework της JENA περιλαμβάνει :

• Ένα RDF API• Eνα OWL API• Δυνατότητα αποθήκευσης τόσο στη μνήμη

όσο και στο δίσκο.

• Δυνατότητες Reasoning

• SPARQL query engine

JENA – Loading an Ontology

public OntologyLoader(String fileName) { // ontology that will be used String ontologyUrl;

setOntologyUrl("file:///" + fileName);// the third slash is needed for windows xp

// create an empty ontology modelmodel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL); // read the file model.read( ont );

}

Simple ontology Loader :

JENA – Loading an Ontology

public OntologyLoader(String fileName) { private String uri = ""; private String ontologyUrl; private String fileName; private OntModel ontModel; private OntDocumentManager dm;

setOntologyUrl("file:///" + fileName);// the third slash is needed for windows xp

OntModel base = ModelFactory.createOntologyModel(); //empty model dm = base.getDocumentManager();// used in this class dm.addAltEntry(uri, ontologyUrl);// used in this class base.read(uri); ontModel = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC,base); }

Loading an Ontology With Pellet Reasoner.

JENA – Reading & Writing Data

public void readClasses(){

ExtendedIterator<OntClass> iter = ontoModel.listClasses(); while(iter.hasNext()){ OntClass ontClass = iter.next(); System.out.println("CLASS : "+ontClass.getLocalName()); } }

Reading the Classes from the Model :

OntClass newClass = model.getOntClass( classUrl );Iterator instances = newClass.listInstances();

Reading the Instances of a Class from the Model :

JENA – Reading & Writing Data

public void readProperties(){

ExtendedIterator<DatatypeProperty> iter = ontoModel.listDatatypeProperties(); ExtendedIterator<ObjectProperty> iter2 = ontoModel.listObjectProperties();

while(iter.hasNext()){ DatatypeProperty dataProperty = iter.next(); System.out.println( dataProperty.getLocalName() ); }while(iter.hasNext()){ ObjectProperty objProperty = iter.next(); System.out.println( objectProperty.getLocalName() ); }}

Reading the Datatype & Object Properties from the Model :

JENA – Reading & Writing Data

Public void readAllStatements(OntModel model){ StmtIterator iter; Statement stmt; iter = model.listStatements(); while (iter.hasNext()) { stmt = iter.next(); // Using the statement to read SUBJECT-PREDICATE-OBJECTProperty predicate; Resource subject; RDFNode obj; subject = stmt.getSubject(); System.out.println("Subject = " + subject.getURI()); predicate = stmt.getPredicate(); System.out.println("Predicate = "+predicate.getLocalName()); obj = stmt.getObject(); System.out.println("Object = " + obj.toString()); }}

Reading Statements :

JENA – Reading & Writing Data

. . . Model model; String namespace = "http://www.example.org"; . . .

Resource res = model.createResource("http://www.example.com/companies#Company1") Property property1 = model.createProperty(namespace, “numOfEmployees");res.addProperty(property1 , 25); Property property2 = model.createProperty(namespace, “Location")res.addProperty( property2 , “Athens");

Writing : Adding Statements to the model.

JENA – Inference

// Creating the model using PelletontModel = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC,base);

// Creating a new Pellet reasoner PelletInfGraph reasoner; reasoner = (PelletInfGraph) ontModel.getGraph();

// Calling the reasoner whenever needed Reasoner.clasify(); Reasoner.realize();

How to use the Pellet reasoner : [ Using the Ontology Loader from slide 37 ]

JENA – Executing a Query

// Create a new queryString queryString =“PREFIX ex1: <http://example.org/ex1/> ” + “SELECT ?x ” +

“WHERE {” +“ ?x ex1:employeeName \”John\” }”;

Query query = QueryFactory.create(queryString);

// Execute the query and obtain results. model is an OntModel.QueryExecution qe = QueryExecutionFactory.create(query, model);ResultSet results = qe.execSelect();

// Output query resultsResultSetFormatter.out(System.out, results, query);

// Important – free up resources used running the queryqe.close();

JENA – Links

The JENA Framework :http://jena.sourceforge.net/

TUTORIAL για αρχάριους. Πως περνάμε τις βιβλιοθήκες της JENA στο Eclipse :http://www.iandickinson.me.uk/articles/jena-eclipse-helloworld/

IBM JENA Tutorialhttp://www.ibm.com/developerworks/xml/library/j-jena/

top related