SPARQL & JENA

Download Report

Transcript SPARQL & JENA

SPARQL & JENA
Γενικά
• JENA : Είναι ένα java framework για τη
δημιουργία semantic web Εφαρμογών.
• Μπορεί να Χρησιμοποιηθει για να
δουλέψουμε σε RDF/RDFS , OWL , για να
κάνουμε storage , inference και για ερωτήσεις
( queries ) μέσω της SPARQL.
Γενικά
• SPARQL : Είναι μία query language που μας
επιτρέπει να κάνουμε ερωτήσεις σε δεδομένα
του semantic web. Είναι για το semantic web
ότι και η SQL για τις σχεσιακές βάσεις
δεδομένων.
Part I:
SPARQL
Περιεχόμενα
Basics [5–9]
Σύντομη περιγραφή της SPARQL
Query
Structure [ 10 ]
Περιγραφή της δομής ενός SPARQL query
Prefix [11–12]
Επεξήγηση των SPARQL query prefixes
Select [13–15]
Επεξήγηση των Select – Select Distinct
From [16–19]
Επεξήγηση των FROM – FROM NAME – Default & Named Graphs
Where [20–27]
Επεξήγηση των WHERE – FILTERS – OPTIONAL - UNION
Modifiers [28–
31]
Επεξήγηση των LIMIT – OFFSET – ORDER BY
Χρήσιμοι σύνδεσμοι για τη SPARQL
Links [32]
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 “[email protected]”
}
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
Query χωρίς 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
}
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 “[email protected]”
Company1 hasEmail “[email protected]”
Company1 hasEmail “[email protected]”
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-sparqlquery/
• SPARQL TUTORIALS :
http://www.cambridgesemantics.com/2008/09/spar
ql-by-example/
• http://linkeddatatools.com/querying-semantic-data
Part IΙ:
JENA
Περιεχόμενα
Basics [34]
Σύντομη περιγραφή των δυνατοτήτων της JENA
Loading an
Ontology [35-36]
Πως φορτώνουμε μια οντολογία ( με reasoner ή χωρίς )
Reading &
writing Ontology
Data [37–40]
Πως διαβάζουμε και γράφουμε δεδομένα σε μια Οντολογία
( classes , properties , statements κτλ )
Inference [41]
Πως καλούμε ένα reasoner ( Παράδειγμα Pellet )
Executing
Queries [42]
Πως εκτελούμε ένα SPARQL query μέσω JENA
Links [43]
Χρήσιμοι σύνδεσμοι για τη JENA
JENA - Basics
To framework της JENA περιλαμβάνει :
• Ένα RDF API
• Eνα OWL API
• Δυνατότητα αποθήκευσης τόσο στη μνήμη
όσο και στο δίσκο.
• Δυνατότητες Reasoning
• SPARQL query engine
JENA – Loading an Ontology
Simple ontology Loader :
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 model
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL);
// read the file model.read( ont );
}
JENA – Loading an Ontology
Loading an Ontology With Pellet Reasoner.
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);
}
JENA – Reading & Writing Data
Reading the Classes from the Model :
public void readClasses(){
ExtendedIterator<OntClass> iter = ontoModel.listClasses();
while(iter.hasNext()){
OntClass ontClass = iter.next();
System.out.println("CLASS : "+ontClass.getLocalName());
}
}
Reading the Instances of a Class from the Model :
OntClass newClass = model.getOntClass( classUrl );
Iterator instances = newClass.listInstances();
JENA – Reading & Writing Data
Reading the Datatype & Object Properties from the Model :
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() );
}
}
JENA – Reading & Writing Data
Reading Statements :
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-OBJECT
Property 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());
}
}
JENA – Reading & Writing Data
Writing : Adding Statements to the model.
...
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");
JENA – Inference
How to use the Pellet reasoner :
[ Using the Ontology Loader from slide 37 ]
// Creating the model using Pellet
ontModel = 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();
JENA – Executing a Query
// Create a new query
String 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 results
ResultSetFormatter.out(System.out, results, query);
// Important – free up resources used running the query
qe.close();
JENA – Links
The JENA Framework :
http://jena.sourceforge.net/
TUTORIAL για αρχάριους.
Πως περνάμε τις βιβλιοθήκες της JENA στο Eclipse :
http://www.iandickinson.me.uk/articles/jena-eclipse-helloworld/
IBM JENA Tutorial
http://www.ibm.com/developerworks/xml/library/j-jena/