4

我在LinkedMDB SPARQL 端点上运行以下查询,它可以工作。有了它,我得到了我需要的关于 id 为 72 的电影导演的所有信息,也就是泰坦尼克号,所以我得到了关于 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).
}

对于具有更高 ID 的电影,例如ID 为 44396 的星际迷航,如果我将 72 替换为 44396,则查询不会返回任何结果。不过,该条目显然有一个目录、ID 和名称。为什么更改后的查询不起作用?

4

1 回答 1

6

SPARQL 允许您编写72为文字的速记"72"^^xsd:integer。如您所见,您可以"72"^^xsd:integer毫无问题地使用 ID 检索电影。但是,您要查找的另一部电影具有 id "44396"^^xsd:int(请注意,数据类型是xsd:int而不是 xsd:integer)。我不知道为什么数据类型不同,但它足以帮助我们检索我们想要的内容:

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 结果(一)

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

请注意filter,我只是将实际所需的值放入查询模式中,而不是 ing。我发现这有点简单,如果查询引擎没有优化,它可能会更好地执行(因为它没有构建一个大的结果集然后过滤掉)。事实上,这可以解释为什么使用变量和过滤器的语义等效查询不返回任何结果,如果查询可以返回的结果数量有限制的话。(但这纯粹是猜测。)无论如何,以下查询不起作用,但我认为它应该:

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 结果(无)

于 2014-02-25T18:40:52.407 回答