Querying the Semantic Web with SPARQL
Last verification: | 20180914 |
Tools required for this lab: | – |
Before the lab
Video [minimum!]:
Reading:
Lab instructions
During this lab we will use two services to execute SPARQL queries:
SPARQLer (a general purpose SPARQL query processor) will be used for querying RDF files.
YASGUI (Yet Another Sparql
GUI) will be used for querying SPARQL Endpoints (it has more powerful editor, but it can't be used against simple RDF files

)
1 Introduction [5 minutes]
What can we do with our RDF models? In this section some „magic” will happen on
Periodic Table saved in
RDF!
-
Paste
http://www.daml.org/2003/01/periodictable/PeriodicTable.owl
into „Target graph
URI (or use FROM in the query)” field and select
text output
option.
There is also a backup (if original
URI cannot be resolved):
http://krzysztof.kutt.pl/didactics/semweb/PeriodicTable.owl
Run the following two queries (paste code in text field and click
Get Results
):
- select.rq
PREFIX table: <http://www.daml.org/2003/01/periodictable/PeriodicTable#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?element ?name
WHERE {
?element table:group ?group .
?group table:name "Noble gas"^^xsd:string .
?element table:name ?name .
}
- construct.rq
PREFIX table: <http://www.daml.org/2003/01/periodictable/PeriodicTable#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://w3.org/2000/01/rdf-schema#>
CONSTRUCT {
?element rdfs:label ?name .
}
WHERE {
?element table:group ?group .
?group table:name "Noble gas"^^xsd:string .
?element table:name ?name .
}

What do
SELECT
queries do?

What do
CONSTRUCT
queries do?
2 SPARQL = Pattern matching [10 minutes]
General Idea: SPARQL is an RDF graph pattern matching system.
E.g.: there is a triple saved in RDF:
:Hydrogen :standardState :gas .
Now we can simply replace part of the triple with a question word (with a question mark at the start) and we get simple queries, e.g.:
Query: :Hydrogen :standardState what? .
Answer: :gas
Query: ?what :standardState :gas .
Answer: :Hydrogen
Query: :Hydrogen ?what :gas .
Answer: :standardState
Now, let's do some more queries against Periodic Table. Prepare the following ones:
elements which have name and symbol defined
elements which have name and symbol defined and are placed in period_7
period
elements which have name and symbol defined and are placed in period_7
period and have OPTIONAL color (some of them does not have color!)
elements which have name and symbol defined and are placed in period_7
period and have OPTIONAL color, sorted by name descending

Put the constructed queries in the report.
3 Constraints: FILTER [10 minutes]
After matching RDF graph pattern, there is also possibility to put some constraints on the rows that will be excluded or included in the results. This is achieved using FILTER construct. Let's try it now on the Periodic Table.
Prepare and execute queries to retrive:
elements which name starts with 's'
elements which has digit '2' in atomicNumber
elements which name starts with 's' or which has digit '2' in atomicNumber, make search caseinsensitive
Hints:

Put the queries in the report.
4 SPARQL Endpoint [20 minutes]
DBpedia is a dump of Wikipedia annotated using RDF. So, like Wikipedia, DBpedia should contain some information about Poland. What we can do?
We don't know what
URI Poland has in DBpedia, but we know the name Poland, and from previous lab we know
rdfs:label
property. Maybe this will help us? Let's try!
-
What we know so far? There should be some
URI (
?country
) that probably has a relation
rdfs:label
with object
„Polska”@pl
. This can be easily translated into SPARQL WHERE clause:
?country rdfs:label "Polska"@pl .
To execute this query properly, enter the
http://dbpedia.org/sparql
URI in the dropdown list at the top.
Then, specify the query:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?country
WHERE {
?country rdfs:label "Polska"@pl .
}
Success! There is something that has
rdfs:label
„Polska”@pl
!

Now expand this query to find information about Poland population and put the final query in the report.
Hint: result should look like this:
--------------
| population |
==============
| 38483957 |
--------------

Prepare a query that returns a list of 10 countries in Europe with the biggest population. Put the query in the report.
5 Aggregation [15 minutes]
Poland is divided into 16 voivodeships (PL: województwo), and then into 380 counties (PL: powiat). In this task, we will examine it closer.
Prepare a query (in
YASGUI, against DBpedia) which returns list of voivodeships and number of counties inside them. List should consist only of voivodeships with 7 or more counties and should be ordered by number of counties.
Results should look like that:
------------------------------------------------
| voivodeship | counties |
================================================
| "Masovian Voivodeship"@en | 15 |
| "Greater Poland Voivodeship"@en | 12 |
| "Lesser Poland Voivodeship"@en | 11 |
| "Podkarpackie Voivodeship"@en | 10 |
| "Pomeranian Voivodeship"@en | 9 |
| "Warmian-Masurian Voivodeship"@en | 9 |
| "West Pomeranian Voivodeship"@en | 9 |
| "Opole Voivodeship"@en | 8 |
------------------------------------------------
or in Polish:
--------------------------------------------------
| wojewodztwo | powiaty |
==================================================
| "Województwo mazowieckie"@pl | 15 |
| "Województwo wielkopolskie"@pl | 12 |
| "Województwo małopolskie"@pl | 11 |
| "Województwo podkarpackie"@pl | 10 |
| "Województwo pomorskie"@pl | 9 |
| "Województwo warmińsko-mazurskie"@pl | 9 |
| "Województwo zachodniopomorskie"@pl | 9 |
| "Województwo opolskie"@pl | 8 |
--------------------------------------------------
Hint – useful URIs:

Put the query in the report.
6 SPARQL as rule language [10 minutes]
So far, we have seen that the answers to questions in SPARQL can take the form of a table. In this section we will take a look at CONSTRUCT queries which answers take the form of an RDF graph. You have already seen one such example in
Introduction.
OK, we created some new RDF triples using CONSTRUCT query. What now? Depending on your plans, you can:
And then simply execute queries against this new knowledge.
7 ASK and DESCRIBE queries [10 minutes]
SPARQL also provides two more query types: ASK and DESCRIBE.
DESCRIBE queries return all knowledge associated with given Subject
URI(s).
The simplest DESCRIBE query specifies only the
URI that should be described:
DESCRIBE <http://www.daml.org/2003/01/periodictable/PeriodicTable#H>
(it should be executed against http://www.daml.org/2003/01/periodictable/PeriodicTable.owl
file)
There is also possibility to select
URI(s) from data set using constraints defined in WHERE clause. Read about it in
SPARQL 1.1 documentation.

Prepare query that describes all
foaf:Person
items from your
model (if you don't have a
foaf:Person
class in your library, use analogous class that you have).
8 "Negation" under Open World Assumption [5 minutes]
9 Wikipedia, DBpedia, Wikidata
If you are interested in querying the huge amount of data available in Wikipedia, there are two projects you may be interested in:
DBpedia – an attempt to extract data from Wikipedia infoboxes and links (using developed parsers)
Wikidata – an attempt to create an RDF base from scratch by the community (using provided
GUI)
They overlap in part, but are independent of each other and have different uses. For you, a student of the Semantic Web Technologies course, it does not matter much. They are simply large knowledge bases with which you can do a lot of things.
If you want to dive into this data you can start with a Big set of SPARQL queries against Wikidata.
Control questions
If you want to know more...
SPARQL:
-
-
-
You can combine results from many SPARQL Endpoints in one query – see
SPARQL Federated Query for more information.
Sample queries in SPARQL:
Tools:
SPARQLer – general purpose tool for executing SPARQL queries
-
YASGUI – online visual tool for querying SPARQL Endpoints
-
-
GeoSPARQL – standard for representing and querying the geospatial data using RDF
Open Data Sets:
DB2RDF (RDF and Relational Databases):