Rdf Can';t使用SPARQL从LinkedMDB检索具有高ID的电影

Rdf Can';t使用SPARQL从LinkedMDB检索具有高ID的电影,rdf,sparql,semantic-web,linked-data,linkedmdb,Rdf,Sparql,Semantic Web,Linked Data,Linkedmdb,我正在运行下面的查询,它可以正常工作。有了它,我得到了我所需要的关于电影《泰坦尼克号》中id为72的导演的所有信息,所以我得到了关于詹姆斯·卡梅隆的信息 PREFIX mdb: <http://data.linkedmdb.org/resource/movie/> SELECT ?director?nombre_director?id_director WHERE { ?pelicula mdb:filmid ?id . ?pelicula <http://data.l

我正在运行下面的查询,它可以正常工作。有了它,我得到了我所需要的关于电影《泰坦尼克号》中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).
}
前缀mdb:
选择?控制器?名称控制器?id控制器在哪里{
?pelicula mdb:filmid?id。
?pelicula?主管。
?主管?名义上的主管。
?主任?身份证主任。
过滤器(?id=72)。
}

对于ID较高的电影,例如,如果我将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 .
}
请注意,我只是将实际需要的值放入查询模式中,而不是
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 ) 
}
前缀mdb:
选择?控制器?名称控制器?id控制器在哪里{
?pelicula mdb:filmid?id。
?pelicula?主管。
?主管?名义上的主管。
?主任?身份证主任。
过滤器(?id=“44396”^^xsd:int)
}

过滤器是基于值的,因此“过滤器(?id=44396)”应该可以工作,但端点表示它正在运行“Joseki 3.0 dev”。当我尝试时,在任何数据类型的?id中都找不到“pelicula mdb:filmid?id”的匹配项。如果你找到了匹配的结果,那么端点的行为很有趣。@AndyS只是为了确保我不是在想象,你确实可以在我的答案中看到第一个查询的结果,我在其中加入了三重模式
?pelicula mdb:filmid“44396”^^xsd:int
,对吗?如果这是匹配的,那么数据一定在那里,对吗?我认为在这一点上有一些奇怪的东西;还有其他一些奇怪的结果,如中所述。@AndyS-Ah,找到了我一直在寻找的一点:问题中的OP“我注意到,如果我只搜索而不过滤,只打印数据库中的所有电影,LinkedMDB似乎对2557有某种限制,这样网页就不会崩溃。看起来这个过滤器只过滤了2557部电影。有没有办法检索更多的电影?“我想,如果我使用
前缀xsd:
,它会比不使用它更好(没有它,我有时会出现一个错误,当查询不起作用时会显示“未解析的前缀名称:xsd:int”)@chomp我在web界面中运行查询,其中
xsd:
前缀(除其他外)是预定义的。如果以不同的方式运行,则可能需要在查询中定义前缀。不过,我认为这是另一个问题;与导致此处主要问题的问题不同。
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 ) 
}