Lab Solutions: Difference between revisions
No edit summary |
No edit summary |
||
Line 218: | Line 218: | ||
tree = create_Tree(g, [ex.Donald_Trump]) | tree = create_Tree(g, [ex.Donald_Trump]) | ||
print_Tree(tree, ex.Donald_Trump) | print_Tree(tree, ex.Donald_Trump) | ||
</syntaxhighlight> | |||
== 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> | </syntaxhighlight> |