Question

J'exécute la requête suivante au Point de terminaison LinkedMDB SPARQL et il fonctionne.Avec lui, j'obtiens toutes les informations dont j'ai besoin sur le réalisateur du film avec l'identifiant 72, qui est Titanesque, donc j'obtiens des informations sur 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).
}

Avec des films dotés d'un identifiant plus élevé, par exemple : Star Trek avec ID 44396, si je remplace 72 par 44396, la requête ne renvoie aucun résultat. L'entrée a clairement un répertoire, un identifiant et un nom.Pourquoi la requête modifiée ne fonctionne-t-elle pas ?

Était-ce utile?

La solution

SPARQL vous permet d'écrire 72 comme raccourci pour le littéral "72"^^xsd:integer.Comme vous l'avez vu, vous pouvez récupérer le film avec l'ID "72"^^xsd:integer sans problème.Cependant, l'autre film que vous recherchez porte l'identifiant "44396"^^xsd:int (notez que le type de données est xsd:int, pas xsd:integer).Je ne sais pas pourquoi le type de données est différent, mais c'est suffisant pour nous aider à récupérer ce que nous voulons :

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

Résultats SPARQL (un)

director          nombre_director  id_director
----------------------------------------------
db:director/9025  "J.J. Abrams"    9025

Notez que plutôt que filtering, je viens de mettre la valeur réelle souhaitée dans le modèle de requête.Je trouve que c'est un peu plus simple, et si le moteur de requête n'est pas optimisé, il pourrait être plus performant (puisqu'il ne construit pas un grand ensemble de résultats puis ne filtre pas les choses).En fait, cela pourrait expliquer pourquoi la requête sémantiquement équivalente qui utilise une variable et un filtre ne renvoie aucun résultat, s'il existe une limite au nombre de résultats que la requête peut renvoyer.(Mais ce n'est que pure spéculation.) Dans tous les cas, la requête suivante ne fonctionne pas, mais je pense qu'elle devrait :

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

Résultats SPARQL (aucun)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top