Non è possibile recuperare film con ID elevati da LinkedMDB con Sparql
-
21-12-2019 - |
Domanda
Sto eseguendo la seguente query su linkedmdb sparql endpoint e funziona.Con esso, ottengo tutte le informazioni di cui ho bisogno del direttore del film con ID 72, che è Titanic , quindi ottengo informazioni su James Cameron.
PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>
SELECT ?director?nombre_director?id_director WHERE {
?pelicula mdb:filmid ?id .
?pelicula <http://data.linkedmdb.org/resource/movie/director> ?director .
?director <http://data.linkedmdb.org/resource/movie/director_name> ?nombre_director .
?director <http://data.linkedmdb.org/resource/movie/director_directorid> ?id_director .
FILTER (?id = 72).
}
.
Con film che hanno un ID più alto, ad es. Esempio Star Trek con ID 44396 , Se sostituisco 72 con 44396, la query non restituisce risultati. La voce ha chiaramente una directory, un ID e un nome, però.Perché la query modificata non funziona?
Soluzione
sparql ti consente di scrivere 72
come stenografia per il "72"^^xsd:integer
letterale. Come hai visto, puoi recuperare il film con l'ID "72"^^xsd:integer
senza problemi. Tuttavia, l'altro film che stai cercando ha l'ID "44396"^^xsd:int
(nota che il tipo di dati è xsd:int
, non xsd:integer
). Non so perché il tipo di dati è diverso, ma è abbastanza per aiutarci a recuperare ciò che vogliamo:
PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>
SELECT ?director?nombre_director?id_director WHERE {
?pelicula mdb:filmid "44396"^^xsd:int .
?pelicula <http://data.linkedmdb.org/resource/movie/director> ?director .
?director <http://data.linkedmdb.org/resource/movie/director_name> ?nombre_director .
?director <http://data.linkedmdb.org/resource/movie/director_directorid> ?id_director .
}
.
director nombre_director id_director
----------------------------------------------
db:director/9025 "J.J. Abrams" 9025
.
Nota che piuttosto che filter
ing, ho appena inserito il valore attuale desiderato nel modello di query. Trovo che questo sia un po 'più semplice, e se il motore di query non è ottimizzato, potrebbe essere migliore performance (poiché non sta costruendo un grande risultato e quindi filtrando le cose). Infatti, ciò potrebbe spiegare perché la query semanticamente equivalente che utilizza una variabile e un filtro non restituisce risultati, se c'è un limite su quanti risultati la query può tornare. (Ma questa è pura speculazione.) In ogni caso, la seguente query non funziona, ma penso che dovrebbe:
PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>
SELECT ?director?nombre_director?id_director WHERE {
?pelicula mdb:filmid ?id .
?pelicula <http://data.linkedmdb.org/resource/movie/director> ?director .
?director <http://data.linkedmdb.org/resource/movie/director_name> ?nombre_director .
?director <http://data.linkedmdb.org/resource/movie/director_directorid> ?id_director .
filter ( ?id = "44396"^^xsd:int )
}
.