我在 LinkedMDB SPARQL endpoint运行以下查询,它的工作原理.有了它,我得到了关于电影导演的所有信息,其中id为72,即泰坦尼克号,所以我得到了关于詹姆斯卡梅隆的信息. PREFIX mdb: http://data.link
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的电影,例如示例Star Trek with ID 44396,如果我用44396替换72,则查询不返回任何结果. The entry显然有一个目录,ID和名称.为什么修改后的查询不起作用?
SPARQL允许您将72写为文字“72”^^ xsd:integer的简写.如您所见,您可以使用ID“72”^^ xsd:整数检索影片而不会出现问题.但是,您正在寻找的另一部电影的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 results (one)
director nombre_director id_director ---------------------------------------------- db:director/9025 "J.J. Abrams" 9025
请注意,我只是将实际所需的值放入查询模式,而不是过滤.我发现这有点简单,如果查询引擎没有优化,它可能会更好地执行(因为它没有构建一个大的结果集,然后过滤掉了).实际上,这可能解释了为什么使用变量和过滤器的语义等效查询不返回结果,如果查询可以返回多少结果的限制. (但这是纯粹的推测.)无论如何,以下查询不起作用,但我认为它应该:
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 results (none)