|
|
Line 1: |
Line 1: |
|
| |
|
| == Lab 3: SPARQL ==
| |
| ===List all triples===
| |
| <syntaxhighlight lang="SPARQL">
| |
| SELECT ?s ?p ?o
| |
| WHERE {?s ?p ?o .}
| |
| </syntaxhighlight>
| |
|
| |
| ===List the first 100 triples===
| |
| <syntaxhighlight lang="SPARQL">
| |
| SELECT ?s ?p ?o
| |
| WHERE {?s ?p ?o .}
| |
| LIMIT 100
| |
| </syntaxhighlight>
| |
|
| |
| ===Count the number of triples===
| |
| <syntaxhighlight lang="SPARQL">
| |
| SELECT (COUNT(*) as ?count)
| |
| WHERE {?s ?p ?o .}
| |
| </syntaxhighlight>
| |
|
| |
| ===Count the number of indictments===
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT (COUNT(?ind) as ?amount)
| |
| WHERE {
| |
| ?s ns1:outcome ?ind;
| |
| ns1:outcome ns1:indictment.
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ===List the names of everyone who pleaded guilty, along with the name of the investigation===
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT ?name ?invname
| |
| WHERE {
| |
| ?s ns1:name ?name;
| |
| ns1:investigation ?invname;
| |
| ns1:outcome ns1:guilty-plea .
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ===List the names of everyone who were convicted, but who had their conviction overturned by which president===
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT ?name ?president
| |
| WHERE {
| |
| ?s ns1:name ?name;
| |
| ns1:president ?president;
| |
| ns1:outcome ns1:conviction;
| |
| ns1:overturned ns1:true.
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ===For each investigation, list the number of indictments made===
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT ?invs (COUNT(?invs) as ?count)
| |
| WHERE {
| |
| ?s ns1:investigation ?invs;
| |
| ns1:outcome ns1:indictment .
| |
| }
| |
| GROUP BY ?invs
| |
| </syntaxhighlight>
| |
|
| |
| ===For each investigation with multiple indictments, list the number of indictments made===
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT ?invs (COUNT(?invs) as ?count)
| |
| WHERE {
| |
| ?s ns1:investigation ?invs;
| |
| ns1:outcome ns1:indictment .
| |
| }
| |
| GROUP BY ?invs
| |
| HAVING(?count > 1)
| |
| </syntaxhighlight>
| |
|
| |
| ===For each investigation with multiple indictments, list the number of indictments made, sorted with the most indictments first===
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT ?invs (COUNT(?invs) as ?count)
| |
| WHERE {
| |
| ?s ns1:investigation ?invs;
| |
| ns1:outcome ns1:indictment .
| |
| }
| |
| GROUP BY ?invs
| |
| HAVING(?count > 1)
| |
| ORDER BY DESC(?count)
| |
| </syntaxhighlight>
| |
|
| |
| ===For each president, list the numbers of convictions and of pardons made===
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT ?president (COUNT(?outcome) as ?conviction) (COUNT(?pardon) as ?pardons)
| |
| WHERE {
| |
| ?s ns1:president ?president;
| |
| ns1:outcome ?outcome ;
| |
| ns1:outcome ns1:conviction.
| |
| OPTIONAL{
| |
| ?s ns1:pardoned ?pardon .
| |
| FILTER (?pardon = ns1:true)
| |
| }
| |
| }
| |
| GROUP BY ?president
| |
| </syntaxhighlight>
| |
|
| |
| ===Rename mullerkg:name to something like muellerkg:person===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| DELETE{?s ns1:name ?o}
| |
| INSERT{?s ns1:person ?o}
| |
| WHERE {?s ns1:name ?o}
| |
| </syntaxhighlight>
| |
|
| |
| ===Update the graph so all the investigated person and president nodes become the subjects in foaf:name triples with the corresponding strings===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
| PREFIX foaf: <http://xmlns.com/foaf/0.1/>
| |
|
| |
| #Persons
| |
| INSERT {?person foaf:name ?name}
| |
| WHERE {
| |
| ?investigation ns1:person ?person .
| |
| BIND(REPLACE(STR(?person), STR(ns1:), "") AS ?name)
| |
| }
| |
|
| |
| #Presidents
| |
| INSERT {?president foaf:name ?name}
| |
| WHERE {
| |
| ?investigation ns1:president ?president .
| |
| BIND(REPLACE(STR(?president), STR(ns1:), "") AS ?name)
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ===Use INSERT DATA updates to add these triples===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| INSERT DATA {
| |
| ns1:George_Papadopoulos ns1:adviserTo ns1:Donald_Trump;
| |
| ns1:pleadGuiltyTo ns1:LyingToFBI;
| |
| ns1:sentencedTo ns1:Prison.
| |
|
| |
| ns1:Roger_Stone a ns1:Republican;
| |
| ns1:adviserTo ns1:Donald_Trump;
| |
| ns1:officialTo ns1:Trump_Campaign;
| |
| ns1:interactedWith ns1:Wikileaks;
| |
| ns1:providedTestimony ns1:House_Intelligence_Committee;
| |
| ns1:clearedOf ns1:AllCharges.
| |
| }
| |
|
| |
| #To test if added
| |
| SELECT ?p ?o
| |
| WHERE {ns1:Roger_Stone ?p ?o .}
| |
| </syntaxhighlight>
| |
|
| |
| ===Use DELETE DATA and then INSERT DATA updates to correct that Roger Stone was cleared of all charges===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| DELETE DATA {
| |
| ns1:Roger_Stone ns1:clearedOf ns1:AllCharges .
| |
| }
| |
|
| |
| INSERT DATA {
| |
| ns1:Roger_Stone ns1:indictedFor ns1:ObstructionOfJustice,
| |
| ns1:WitnessTampering,
| |
| ns1:FalseStatements.
| |
| }
| |
|
| |
| #The task specifically requested DELETE DATA & INSERT DATA, put below is a more efficient solution
| |
|
| |
| DELETE{ns1:Roger_Stone ns1:clearedOf ns1:AllCharges.}
| |
| INSERT{
| |
| ns1:Roger_Stone ns1:indictedFor ns1:ObstructionOfJustice,
| |
| ns1:WitnessTampering,
| |
| ns1:FalseStatements.
| |
| }
| |
| WHERE{ns1:Roger_Stone ns1:clearedOf ns1:AllCharges.}
| |
| </syntaxhighlight>
| |
|
| |
| ===Use a DESCRIBE query to show the updated information about Roger Stone===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| DESCRIBE ?o
| |
| WHERE {ns1:Roger_Stone ns1:indictedFor ?o .}
| |
| </syntaxhighlight>
| |
|
| |
| ===Use a CONSTRUCT query to create a new RDF group with triples only about Roger Stone===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| CONSTRUCT {
| |
| ns1:Roger_Stone ?p ?o.
| |
| ?s ?p2 ns1:Roger_Stone.
| |
| }
| |
| WHERE {
| |
| ns1:Roger_Stone ?p ?o .
| |
| ?s ?p2 ns1:Roger_Stone
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ===Write a DELETE/INSERT statement to change one of the prefixes in your graph===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| PREFIX ns1: <http://example.org#>
| |
| PREFIX dbp: <https://dbpedia.org/page/>
| |
|
| |
| DELETE {?s ns1:person ?o1}
| |
| INSERT {?s ns1:person ?o2}
| |
| WHERE{
| |
| ?s ns1:person ?o1 .
| |
| BIND (IRI(replace(str(?o1), str(ns1:), str(dbp:))) AS ?o2)
| |
| }
| |
|
| |
| #This update changes the object in triples with ns1:person as the predicate. It changes it's prefix of ns1 (which is the "shortcut/shorthand" for example.org) to the prefix dbp (dbpedia.org)
| |
| </syntaxhighlight>
| |
|
| |
| ===Write an INSERT statement to add at least one significant date to the Mueller investigation, with literal type xsd:date. Write a DELETE/INSERT statement to change the date to a string, and a new DELETE/INSERT statement to change it back to xsd:date. ===
| |
|
| |
| <syntaxhighlight lang="SPARQL">
| |
| #Whilst this solution is not exactly what the task asks for, I feel like this is more appropiate given the dataset. The following update
| |
| changes the objects that uses the cp_date as predicate from a URI, to a literal with date as it's datatype
| |
|
| |
| PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| DELETE {?s ns1:cp_date ?o}
| |
| INSERT{?s ns1:cp_date ?o3}
| |
| WHERE{
| |
| ?s ns1:cp_date ?o .
| |
| BIND (replace(str(?o), str(ns1:), "") AS ?o2)
| |
| BIND (STRDT(STR(?o2), xsd:date) AS ?o3)
| |
| }
| |
|
| |
| #To test:
| |
|
| |
| PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| SELECT ?s ?o
| |
| WHERE{
| |
| ?s ns1:cp_date ?o.
| |
| FILTER(datatype(?o) = xsd:date)
| |
| }
| |
|
| |
| #To change it to an integer, use the following code, and to change it back to date, swap "xsd:integer" to "xsd:date"
| |
|
| |
| PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
| |
| PREFIX ns1: <http://example.org#>
| |
|
| |
| DELETE {?s ns1:cp_date ?o}
| |
| INSERT{?s ns1:cp_date ?o2}
| |
| WHERE{
| |
| ?s ns1:cp_date ?o .
| |
| BIND (STRDT(STR(?o), xsd:integer) AS ?o2)
| |
| }
| |
|
| |
| </syntaxhighlight>
| |