SPARQL Examples: Difference between revisions
No edit summary |
No edit summary |
||
(22 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
This page will be updated with SPARQL examples as the course progresses. | |||
== | == SPARQL Examples from Session 3: SPARQL== | ||
===Prefixes used=== | ===Prefixes used=== | ||
The examples below will assume that these are in place. | The examples below will assume that these are in place (some examples aren't yet visible). | ||
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> | PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> | ||
Line 44: | Line 22: | ||
PREFIX sp: <http://i2s.uib.no/kg4news/science-parse/> | PREFIX sp: <http://i2s.uib.no/kg4news/science-parse/> | ||
PREFIX th: <http://i2s.uib.no/kg4news/theme/> | PREFIX th: <http://i2s.uib.no/kg4news/theme/> | ||
PREFIX xml: <http://www.w3.org/XML/1998/namespace> | |||
PREFIX ex: <http://example.org/> | |||
===Select all triplets in graph=== | |||
SELECT ?s ?p ?o | |||
WHERE { | |||
?s ?p ?o . | |||
} | |||
or | |||
SELECT * | |||
WHERE { | |||
?s ?p ?o . | |||
} | |||
===Select the interestes of Cade=== | |||
SELECT ?cadeInterest | |||
WHERE { | |||
ex:Cade ex:interest ?cadeInterest . | |||
} | |||
===Select the country and city where Emma lives=== | |||
SELECT ?emmaCity ?emmaCountry | |||
WHERE { | |||
ex:Emma ex:address ?address . | |||
?address ex:city ?emmaCity . | |||
?address ex:country ?emmaCountry . | |||
} | |||
All address info to Emma. | |||
SELECT ?person ?city ?country ?postalcode ?street WHERE{ | |||
ex:Emma ex:address ?address. | |||
?person ex:address ?address. | |||
?address ex:city ?city. | |||
?address ex:country ?country. | |||
?address ex:postalCode ?postalcode. | |||
?address ex:street ?street. | |||
} | |||
Selecting all address info, to everyone. | |||
SELECT ?name ?city ?country ?postalcode ?street WHERE{ | |||
?person foaf:name ?name. | |||
?person ex:address ?address. | |||
?address ex:city ?city. | |||
?address ex:country ?country. | |||
?address ex:postalCode ?postalcode. | |||
?address ex:street ?street. | |||
} | |||
===Select the people who are over 26 years old=== | |||
SELECT ?person ?age | |||
WHERE { | |||
?person ex:age ?age . | |||
FILTER(?age > 26) . | |||
} | |||
===Select people who graduated with Bachelor=== | |||
SELECT ?person ?degree | |||
WHERE { | |||
?person ex:degree ?degree . | |||
?degree ex:degreeLevel "Bachelor" . | |||
} | |||
===Delete cades photography interest=== | |||
DELETE DATA | |||
{ | |||
ex:Cade ex:interest ex:Photography . | |||
} | |||
===Delete and insert university of valencia=== | |||
DELETE { ?s ?p ex:University_of_Valencia } | |||
INSERT { ?s ?p ex:Universidad_de_Valencia } | |||
WHERE { ?s ?p ex:University_of_Valencia } | |||
===Check if the deletion worked=== | |||
SELECT ?s ?o2 | |||
WHERE { | |||
?s ex:degree ?o . | |||
?o ex:degreeSource ?o2 . | |||
} | |||
===Insert Sergio=== | |||
INSERT DATA { | |||
ex:Sergio a foaf:Person ; | |||
ex:address [ a ex:Address ; | |||
ex:city ex:Valenciay ; | |||
ex:country ex:Spain ; | |||
ex:postalCode "46021"^^xsd:string ; | |||
ex:state ex:California ; | |||
ex:street "4_Carrer_del_Serpis"^^xsd:string ] ; | |||
ex:degree [ ex:degreeField ex:Computer_science ; | |||
ex:degreeLevel "Master"^^xsd:string ; | |||
ex:degreeSource ex:University_of_Valencia ; | |||
ex:year "2008"^^xsd:gYear ] ; | |||
ex:expertise ex:Big_data, | |||
ex:Semantic_technologies, | |||
ex:Machine_learning; | |||
foaf:name "Sergio_Pastor"^^xsd:string . | |||
} | |||
===Describe Sergio=== | |||
DESCRIBE ex:Sergio ?o | |||
WHERE { | |||
ex:Sergio ?p ?o . | |||
?o ?p2 ?o2 . | |||
} | |||
===Construct that any city is in the country in an address=== | |||
CONSTRUCT {?city ex:locatedIn ?country} | |||
Where { | |||
?s rdf:type ex:Address . | |||
?s ex:city ?city . | |||
?s ex:country ?country. | |||
} | |||
==The data are available in this Blazegraph triple store:== | |||
[http://sandbox.i2s.uib.no http://sandbox.i2s.uib.no] , but you may need to be inside the UiB network (or on VPN.) | |||
SELECT DISTINCT ?p WHERE { | SELECT DISTINCT ?p WHERE { | ||
?s rdf:type ss:Paper . | ?s rdf:type ss:Paper . | ||
?s ?p ?o . | ?s ?p ?o . | ||
} LIMIT 100 | |||
===Explain all types and properties=== | ===Explain all types and properties=== | ||
Line 64: | Line 171: | ||
} | } | ||
===List properties=== | |||
SELECT DISTINCT ?p WHERE { | |||
?s ?p ?o . | |||
} LIMIT 100 | |||
===List types=== | |||
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |||
SELECT DISTINCT ?t WHERE { | |||
?s rdf:type ?t . | |||
} LIMIT 100 | |||
===List authors=== | |||
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |||
PREFIX foaf: <http://xmlns.com/foaf/0.1/> | |||
SELECT DISTINCT ?p WHERE { | |||
?s rdf:type foaf:Person . | |||
?s ?p ?o . | |||
} LIMIT 100 | |||
Add this to show datatypes! | Add this to show datatypes! | ||
Line 208: | Line 339: | ||
(Actually, these years are xsd:integer- s, not quite xsd:gYear-s.) | (Actually, these years are xsd:integer- s, not quite xsd:gYear-s.) | ||
<!-- | |||
== SPARQL Examples from Session 7: RDFS== | |||
===Turn on inference!=== | |||
Make sure inference is on in your triple store, or that you compute closures if you run this in Python with rdflib and OWL-RL. | |||
In '''Blazegraph''', create a new "Namespace" with the "Inference" box checked. | |||
Remember to "Use" the new namespace. | |||
In '''Python''', install the [https://owl-rl.readthedocs.io/en/latest/ OWL-RL package] (''pip install owlrl''). | |||
Explicitly compute RDFS closure like this: | |||
import owlrl.RDFSClosure | |||
... | |||
rdfs = owlrl.RDFSClosure.RDFS_Semantics(g, False, False, False) | |||
rdfs.closure() | |||
rdfs.flush_stored_triples() | |||
===rdfs:subClassOf entailment=== | |||
Update: | |||
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |||
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> | |||
PREFIX foaf: <http://xmlns.com/foaf/0.1/> | |||
PREFIX kg: <http://i2s.uib.no/kg4news/> | |||
INSERT DATA { | |||
kg:TimBernersLee rdf:type kg:Author . | |||
kg:Author rdfs:subClassOf foaf:Person . | |||
} | |||
Query: | |||
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |||
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> | |||
PREFIX foaf: <http://xmlns.com/foaf/0.1/> | |||
PREFIX kg: <http://i2s.uib.no/kg4news/> | |||
ASK { | |||
kg:TimBernersLee rdf:type foaf:Person . | |||
} | |||
===rdfs:domain entailment=== | |||
Update: | |||
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |||
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> | |||
PREFIX dcterm: <http://purl.org/dc/terms/> | |||
PREFIX kg: <http://i2s.uib.no/kg4news/> | |||
INSERT DATA { | |||
kg:TimBernersLee rdf:type kg:Author . | |||
kg:TheSemanticWeb dcterm:contributor kg:TimBernersLee . | |||
dcterm:contributor rdfs:domain kg:Paper . | |||
} | |||
Query: | |||
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> | |||
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> | |||
PREFIX dcterm: <http://purl.org/dc/terms/> | |||
PREFIX kg: <http://i2s.uib.no/kg4news/> | |||
ASK { | |||
kg:TheSemanticWeb rdf:type kg:Paper . | |||
} | |||
==OWL Ontologies== | |||
The following files contain an ontology for the knowledge graph used in this page: | |||
* Small: [[:File:small-kg4news-ontology.txt]] | |||
* Full: [[:File:kg4news-ontology.txt]] | |||
Rename them from '.txt.' to '.ttl' after you download them. | |||
You can | |||
* view the ontologies online using [http://www.visualdataweb.de/webvowl/ WebVOWL] or | |||
* download the [https://protege.stanford.edu/products.php#desktop-protege Protegé-OWL] ontology editor. | |||
<!-- | |||
--> |
Revision as of 12:53, 10 March 2022
This page will be updated with SPARQL examples as the course progresses.
SPARQL Examples from Session 3: SPARQL
Prefixes used
The examples below will assume that these are in place (some examples aren't yet visible).
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX dc: <http://purl.org/dc/terms/> PREFIX bibo: <http://purl.org/ontology/bibo/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX ss: <http://semanticscholar.org/> PREFIX kg: <http://i2s.uib.no/kg4news/> PREFIX sp: <http://i2s.uib.no/kg4news/science-parse/> PREFIX th: <http://i2s.uib.no/kg4news/theme/> PREFIX xml: <http://www.w3.org/XML/1998/namespace> PREFIX ex: <http://example.org/>
Select all triplets in graph
SELECT ?s ?p ?o WHERE { ?s ?p ?o . }
or
SELECT * WHERE { ?s ?p ?o . }
Select the interestes of Cade
SELECT ?cadeInterest WHERE { ex:Cade ex:interest ?cadeInterest . }
Select the country and city where Emma lives
SELECT ?emmaCity ?emmaCountry WHERE { ex:Emma ex:address ?address . ?address ex:city ?emmaCity . ?address ex:country ?emmaCountry . }
All address info to Emma.
SELECT ?person ?city ?country ?postalcode ?street WHERE{ ex:Emma ex:address ?address. ?person ex:address ?address. ?address ex:city ?city. ?address ex:country ?country. ?address ex:postalCode ?postalcode. ?address ex:street ?street. }
Selecting all address info, to everyone.
SELECT ?name ?city ?country ?postalcode ?street WHERE{ ?person foaf:name ?name. ?person ex:address ?address. ?address ex:city ?city. ?address ex:country ?country. ?address ex:postalCode ?postalcode. ?address ex:street ?street. }
Select the people who are over 26 years old
SELECT ?person ?age WHERE { ?person ex:age ?age . FILTER(?age > 26) . }
Select people who graduated with Bachelor
SELECT ?person ?degree WHERE { ?person ex:degree ?degree . ?degree ex:degreeLevel "Bachelor" . }
Delete cades photography interest
DELETE DATA { ex:Cade ex:interest ex:Photography . }
Delete and insert university of valencia
DELETE { ?s ?p ex:University_of_Valencia } INSERT { ?s ?p ex:Universidad_de_Valencia } WHERE { ?s ?p ex:University_of_Valencia }
Check if the deletion worked
SELECT ?s ?o2 WHERE { ?s ex:degree ?o . ?o ex:degreeSource ?o2 . }
Insert Sergio
INSERT DATA { ex:Sergio a foaf:Person ; ex:address [ a ex:Address ; ex:city ex:Valenciay ; ex:country ex:Spain ; ex:postalCode "46021"^^xsd:string ; ex:state ex:California ; ex:street "4_Carrer_del_Serpis"^^xsd:string ] ; ex:degree [ ex:degreeField ex:Computer_science ; ex:degreeLevel "Master"^^xsd:string ; ex:degreeSource ex:University_of_Valencia ; ex:year "2008"^^xsd:gYear ] ; ex:expertise ex:Big_data, ex:Semantic_technologies, ex:Machine_learning; foaf:name "Sergio_Pastor"^^xsd:string . }
Describe Sergio
DESCRIBE ex:Sergio ?o WHERE { ex:Sergio ?p ?o . ?o ?p2 ?o2 . }
Construct that any city is in the country in an address
CONSTRUCT {?city ex:locatedIn ?country} Where { ?s rdf:type ex:Address . ?s ex:city ?city . ?s ex:country ?country. }
The data are available in this Blazegraph triple store:
http://sandbox.i2s.uib.no , but you may need to be inside the UiB network (or on VPN.)
SELECT DISTINCT ?p WHERE { ?s rdf:type ss:Paper . ?s ?p ?o . } LIMIT 100
Explain all types and properties
SELECT ?pt ?e WHERE { ?pt rdfs:comment ?e . } LIMIT 100
List main papers
SELECT * WHERE { ?paper rdf:type kg:MainPaper . ?paper dc:date ?year . }
List properties
SELECT DISTINCT ?p WHERE { ?s ?p ?o . } LIMIT 100
List types
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT DISTINCT ?t WHERE { ?s rdf:type ?t . } LIMIT 100
List authors
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT DISTINCT ?p WHERE { ?s rdf:type foaf:Person . ?s ?p ?o . } LIMIT 100
Add this to show datatypes!
BIND ( DATATYPE(?year) AS ?type )
Add this to only show years with the right type.
FILTER ( DATATYPE(?year) = xsd:gYear )
Group and count main papers by year
SELECT ?year (COUNT(?paper) AS ?count) WHERE { ?paper rdf:type kg:MainPaper . ?paper dc:date ?year . FILTER ( DATATYPE(?year) = xsd:gYear ) } GROUP BY ?year
Add this to order the results
ORDER BY ?year
Add this to order and only show years with more than 5 papers.
HAVING (?count > 5) ORDER BY DESC(?count)
Show papers
SELECT ?paper ?year WHERE { ?paper rdf:type kg:MainPaper . ?paper dc:date ?year . FILTER ( DATATYPE(?year) = xsd:gYear ) }
Change last lines to show papers without an xsd:gYear too.
OPTIONAL { ?paper dc:date ?year . FILTER ( DATATYPE(?year) = xsd:gYear ) }
Alternative values for variables
SELECT ?p ?n ?year WHERE { ?p rdf:type kg:MainPaper . ?p dc:contributor ?a . ?a foaf:name ?n . ?p dc:date ?year . FILTER ( CONTAINS( ?n, ?str ) ) FILTER ( CONTAINS( STR(?year), ?yr) ) VALUES ?str { "Andreas" "David" } VALUES ?yr { "2020" "2019" } }
Property paths (composite properties)
This query:
SELECT ?p ?n WHERE { ?p rdf:type kg:MainPaper . ?p dc:contributor ?c . ?c foaf:name ?n . }
Can be simplified by eliminating ?c:
SELECT ?p ?n WHERE { ?p rdf:type kg:MainPaper . ?p dc:contributor / foaf:name ?n . }
Can be further simplified by first reversing rdf:type:
SELECT ?p ?n WHERE { kg:MainPaper ^rdf:type ?p . ?p dc:contributor / foaf:name ?n . }
...and the eliminating ?p:
SELECT ?n WHERE { kg:MainPaper ^rdf:type / dc:contributor / foaf:name ?n . }
Retrieve titles of papers that mention SPARQL
Get papers with topics labelled "SPARQL":
SELECT ?t WHERE { ?t ^dc:title / dc:subject / skos:prefLabel "SPARQL" . }
Some labels also go via a theme:
SELECT ?t WHERE { ?t ^dc:title / dc:subject / th:theme / skos:prefLabel "SPARQL" . }
We can get both using a path with an optional element (the '?'):
SELECT ?t WHERE { ?t ^dc:title / dc:subject / th:theme? / skos:prefLabel "SPARQL" . }
Using an external SPARQL endpoint
We limit to a single label to avoid time-outs and rate limitations:
SELECT ?a ?n ?r WHERE { ?a rdf:type ss:Topic . ?a skos:prefLabel ?n . FILTER ( ?n = "SPARQL" ) BIND ( STRLANG( ?n, "en" ) AS ?n2 ) SERVICE <https://dbpedia.org/sparql> { ?r rdfs:label ?n2 . } } LIMIT 1
Insert 4-digit years for all main papers
Main papers that do not have an xsd:gYear:
SELECT * WHERE { ?p rdf:type kg:MainPaper . ?p dc:date ?d . FILTER ( DATATYPE(?d) = xsd:gYear ) }
Show the datatypes:
SELECT * WHERE { ?p rdf:type kg:MainPaper . ?p dc:date ?d . FILTER ( DATATYPE(?d) = xsd:dateTime ) BIND ( year( ?d ) AS ?dt ) }
Insert 4-digit years:
INSERT { ?paper dc:date ?year } WHERE { ?paper rdf:type kg:MainPaper . ?paper dc:date ?date . FILTER( DATATYPE(?date) != xsd:gYear ) BIND ( YEAR(?date) AS ?year ) }
(Actually, these years are xsd:integer- s, not quite xsd:gYear-s.)