Lab Solutions: Difference between revisions

From info216
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>

Revision as of 11:18, 10 January 2024

Example lab solutions