cho*_*omp 4 rdf semantic-web sparql linked-data linkedmdb
我在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).
}
Run Code Online (Sandbox Code Playgroud)
对于具有较高ID的电影,例如具有ID 44396的示例星际迷航,如果我用44396替换72,则查询不返回任何结果.但是,该条目显然具有目录,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 .
}
Run Code Online (Sandbox Code Playgroud)
director nombre_director id_director
----------------------------------------------
db:director/9025 "J.J. Abrams" 9025
Run Code Online (Sandbox Code Playgroud)
请注意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 )
}
Run Code Online (Sandbox Code Playgroud)