Frage

Ich führe die folgende Abfrage aus LinkedMDB SPARQL-Endpunkt und es funktioniert.Damit erhalte ich alle Informationen, die ich über den Regisseur des Films mit der ID 72 benötige Titanic, damit ich Informationen über James Cameron bekomme.

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

Bei Filmen, die eine höhere ID haben, z.B Star Trek mit der ID 44396, Wenn ich 72 durch 44396 ersetze, gibt die Abfrage keine Ergebnisse zurück. Der Eintritt Es gibt jedoch eindeutig ein Verzeichnis, eine ID und einen Namen.Warum funktioniert die geänderte Abfrage nicht?

War es hilfreich?

Lösung

Mit SPARQL können Sie schreiben 72 als Abkürzung für das Literal "72"^^xsd:integer.Wie Sie gesehen haben, können Sie den Film mit der ID abrufen "72"^^xsd:integer ohne ein Problem.Der andere Film, den Sie suchen, hat jedoch die ID "44396"^^xsd:int (Beachten Sie, dass der Datentyp ist xsd:int, nicht xsd:integer).Ich weiß nicht Warum Der Datentyp ist unterschiedlich, aber er reicht aus, um uns dabei zu helfen, das abzurufen, was wir wollen:

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

SPARQL-Ergebnisse (eins)

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

Beachten Sie das eher als filtering, ich habe einfach den tatsächlich gewünschten Wert in das Abfragemuster eingefügt.Ich finde, dass dies etwas einfacher ist, und wenn die Abfrage-Engine nicht optimiert ist, ist sie möglicherweise leistungsstärker (da keine große Ergebnismenge erstellt und dann Dinge herausgefiltert werden).Tatsächlich könnte dies erklären, warum die semantisch äquivalente Abfrage, die eine Variable und einen Filter verwendet, keine Ergebnisse zurückgibt, wenn die Anzahl der Ergebnisse, die die Abfrage zurückgeben kann, begrenzt ist.(Aber das ist reine Spekulation.) Auf jeden Fall funktioniert die folgende Abfrage nicht, aber ich denke, dass sie es tun sollte:

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

SPARQL-Ergebnisse (keine)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top