[Renan Oliveira] SPARQL – Parte II – Consultas básicas (select)

Amigos,

Nesse post vou explicar algumas consultas básicas, usando SPARQL.

Vou fazer essas consultas baseado no meu tutorial preferido “SPARQL By Example da Cambridge Semantics”, esse post basicamente será um apanhado de query de lá,  já que eles usam endpoints públicos.

?s ?p ?o

Essas consultas estão usando RDF, que é um modelo de ontologia baseado em triplas (?s ?p ?o).

Sujeito, Predicado e Objeto

Estrutura básica (esqueleto) de uma consulta SPARQL:

# declaracao do prefix (abreviacao das URIs)
PREFIX foo:
...
# declaracao dos acessos ao grafos
FROM ...
# parametros a serem encontrados
SELECT ...
# query pattern
WHERE {
    ...
}
# organizador do resultado (ordenacao)
ORDER BY ...

Vamos aos fatos (selects)

Select simples:

#De forma mais completa essa query,
# procura todos os objetos de indivíduos
# que tenham a propriedade foaf:name declarada.

PREFIX foaf:
SELECT ?name
WHERE {
    ?person foaf:name ?name .
}

Resultado na DBPedia .

Select simples com resultado composto:

#Seleciona o sujeito e a homepage,
# de um sujeito onde o nome seja "Apollo 7".

PREFIX foaf:
SELECT ?craft ?homepage
{
  ?craft foaf:name "Apollo 7" .
  ?craft foaf:homepage ?homepage
}

Resultado na Talis .

Select utilizando o resultado a partir do resultado do objeto da tripla anterior:

#Nessa query também entramos no conceito de grafo,
# essa query busca em um grafo especifico.
# Essa consulta busca homepages de pessoas que conhece o Berners-Lee.

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX card: <http://www.w3.org/People/Berners-Lee/card#>
SELECT ?homepage
FROM <http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf>
WHERE {
    card:i foaf:knows ?known .
    ?known foaf:homepage ?homepage .
}

Resultado na DEMO.Virtuoso

Organizando o resultado

Limit

Para modificar a apresentação do resultado, existem: Limit, Order By e Offset.

# Query que lista 50 indivíduos distintos.

SELECT DISTINCT ?concept
WHERE {
    ?s a ?concept .
} LIMIT 50

Filtro

Filter simples

#Seleciona paises que não tenham fronteira com o mar e
# com o filtro que apresenta apenas os que tenham
# população maior que 15 milhões de habitantes.
# Vemos também que não precisamos repetir
# o sujeito em todas as clausulas.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT ?country_name ?population
WHERE {
    ?country a type:LandlockedCountries ;
             rdfs:label ?country_name ;
             prop:populationEstimate ?population .
    FILTER (?population > 15000000) .
}

Resultado na DBPedia .

Filtro composto

#Aplicamos na query o filtro de que é
# preciso que o nome tenha sido definido em inglês.PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT ?country_name ?population
WHERE {
    ?country a type:LandlockedCountries ;
             rdfs:label ?country_name ;
             prop:populationEstimate ?population .
    FILTER (?population > 15000000 && langMatches(lang(?country_name), "EN")) .
} ORDER BY DESC(?population)

Resultado na DBPedia .

Opcional

O option possibilita que a caso um param não exista, não impeça a apresentação da tripla.

# Apresenta o nome de todos artistas musicais,
# e caso exista a imagem, homepage e loc .
PREFIX mo: <http://purl.org/ontology/mo/>
PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
SELECT ?name ?img ?hp ?loc
WHERE {
  ?a a mo:MusicArtist ;
     foaf:name ?name .
  OPTIONAL { ?a foaf:img ?img }
  OPTIONAL { ?a foaf:homepage ?hp }
  OPTIONAL { ?a foaf:based_near ?loc }
}

Resultado no Jamendo .

Por hoje é só.

No próximo post falarei um pouco sobre como montar uma ontologia baseado em RDF, RDFs e OWL.

Abraços.

Boa noite.

Renan Oliveira