我正在运行以下查询 LinkedMDB SPARQL 端点 它有效。有了它,我可以获得有关 id 72 的电影导演的所有信息,即 泰坦尼克号, ,所以我得到了关于詹姆斯·卡梅隆的信息。

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 和名称。为什么更改后的查询不起作用?

有帮助吗?

解决方案

SPARQL 让您可以编写 72 作为文字的简写 "72"^^xsd:integer. 。如您所见,您可以使用 ID 检索影片 "72"^^xsd:integer 没有问题。但是,您要查找的另一部电影的 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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top