Difference between revisions of "SPARQL Examples"

From Info216
Line 5: Line 5:
  
 
===List properties===
 
===List properties===
 
  
 
  SELECT DISTINCT ?p WHERE {
 
  SELECT DISTINCT ?p WHERE {
 
   ?s ?p ?o .
 
   ?s ?p ?o .
 
  } LIMIT 100
 
  } LIMIT 100
 
  
 
===List types===
 
===List types===
Line 30: Line 28:
 
  } LIMIT 100
 
  } LIMIT 100
  
===Prefrixes used===
+
===Prefixes used===
  
 
The examples below will assume that these are in place.
 
The examples below will assume that these are in place.
Line 91: Line 89:
 
  ORDER BY DESC(?count)
 
  ORDER BY DESC(?count)
  
===Show papers  
+
===Show papers===
  
 
  SELECT ?paper ?year WHERE {
 
  SELECT ?paper ?year WHERE {
Line 107: Line 105:
 
   }
 
   }
  
*** VALUES
+
===Alternative values for variables===
  
SELECT ?p ?n ?year WHERE {
+
SELECT ?p ?n ?year WHERE {
  ?p rdf:type kg:MainPaper .
+
  ?p rdf:type kg:MainPaper .
  ?p dc:contributor ?a .
+
  ?p dc:contributor ?a .
  ?a foaf:name ?n .
+
  ?a foaf:name ?n .
  ?p dc:date ?year .
+
  ?p dc:date ?year .
  FILTER ( CONTAINS( ?n, ?str ) )
+
  FILTER ( CONTAINS( ?n, ?str ) )
  FILTER ( CONTAINS( STR(?year), ?yr) )
+
  FILTER ( CONTAINS( STR(?year), ?yr) )
+
 
  VALUES ?str { "Andreas" "David" }
+
  VALUES ?str { "Andreas" "David" }
  VALUES ?yr { "2020" "2019" }
+
  VALUES ?yr { "2020" "2019" }
}
+
}
 +
 
 +
===Property paths (composite properties)===
  
*** PROPERTY PATH
+
This query:
 +
SELECT ?p ?n WHERE {
 +
  ?p rdf:type kg:MainPaper .
 +
  ?p dc:contributor ?c .
 +
  ?c foaf:name ?n .
 +
}
  
SELECT ?p ?n WHERE {
+
Can be simplified by eliminating ?c:
  ?p rdf:type kg:MainPaper .
+
SELECT ?p ?n WHERE {
  ?p dc:contributor / foaf:name ?n .
+
  ?p rdf:type kg:MainPaper .
}
+
  ?p dc:contributor / foaf:name ?n .
 +
}
  
SELECT ?p ?n WHERE {
+
Can be further simplified by first reversing rdf:type:
  kg:MainPaper ^rdf:type ?p .
+
SELECT ?p ?n WHERE {
  ?p dc:contributor / foaf:name ?n .
+
  kg:MainPaper ^rdf:type ?p .
}
+
  ?p dc:contributor / foaf:name ?n .
 +
}
  
SELECT ?n WHERE {
+
...and the eliminating ?p:
  kg:MainPaper ^rdf:type / dc:contributor / foaf:name ?n .
+
SELECT ?n WHERE {
}
+
  kg:MainPaper ^rdf:type / dc:contributor / foaf:name ?n .
 +
}
  
 +
===Retrieve titles of papers that mention SPARQL===
  
SELECT ?t WHERE {
+
Get papers with topics labelled "SPARQL":
  ?t ^dc:title / dc:subject / skos:prefLabel "SPARQL" .
+
SELECT ?t WHERE {
}
+
  ?t ^dc:title / dc:subject / skos:prefLabel "SPARQL" .
 +
}
  
SELECT ?t WHERE {
+
Some labels also go via a theme:
  ?t ^dc:title / dc:subject / th:theme / skos:prefLabel "SPARQL" .
+
SELECT ?t WHERE {
}
+
  ?t ^dc:title / dc:subject / th:theme / skos:prefLabel "SPARQL" .
 +
}
  
SELECT ?t WHERE {
+
We can get both using a path with an optional element (the '?'):
  ?t ^dc:title / dc:subject / th:theme? / skos:prefLabel "SPARQL" .
+
SELECT ?t WHERE {
}
+
  ?t ^dc:title / dc:subject / th:theme? / skos:prefLabel "SPARQL" .
 +
}
  
--
+
===Using an external SPARQL endpoint===
  
SELECT ?a ?n ?r WHERE {
+
We limit to a single label to avoid time-outs and rate limitations:
  ?a rdf:type ss:Topic .
+
SELECT ?a ?n ?r WHERE {
  ?a skos:prefLabel ?n .
+
  ?a rdf:type ss:Topic .
  FILTER ( ?n = "SPARQL" )
+
  ?a skos:prefLabel ?n .
  BIND ( STRLANG( ?n, "en" ) AS ?n2 )
+
  FILTER ( ?n = "SPARQL" )
    SERVICE <https://dbpedia.org/sparql> {
+
  BIND ( STRLANG( ?n, "en" ) AS ?n2 )
    ?r rdfs:label ?n2 .
+
    SERVICE <https://dbpedia.org/sparql> {
    }
+
    ?r rdfs:label ?n2 .
} LIMIT 1
+
    }
 +
} LIMIT 1
  
--
+
===Insert 4-digit years for all main papers===
  
SELECT * WHERE {
+
Main papers that do not have an xsd:gYear:
   
+
SELECT * WHERE {
   ?p rdf:type kg:MainPaper .
+
 
  ?p dc:date ?d .
+
  ?p rdf:type kg:MainPaper .
  FILTER ( DATATYPE(?d) = xsd:gYear )
+
  ?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 )
 +
 
 +
}
  
SELECT * WHERE {
+
(Actually, these years are xsd:integer- s, not quite xsd:gYear-s.)
 
  ?p rdf:type kg:MainPaper .
 
  ?p dc:date ?d .
 
  FILTER ( DATATYPE(?d) = xsd:dateTime )
 
  BIND ( year( ?d ) AS ?dt )
 
 
}
 

Revision as of 11:37, 1 February 2021

SPARQL Examples from Lecture 03

The data are available in this Blazegraph triple store: [1] .

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

Prefixes used

The examples below will assume that these are in place.

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/>

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 .
 
}

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.)