我是第一次接触SPARQL,正在尝试从dbpedia获取一部改编自特定书籍的电影。这就是我到目前为止所知道的:
PREFIX onto: <http://dbpedia.org/ontology/>
SELECT *
WHERE
{
<http://dbpedia.org/page/2001:_A_Space_Odyssey> a ?type.
?type onto:basedOn ?book .
?book a onto:Book
}
我得不到任何结果。我该怎么做呢?
发布于 2018-06-03 23:27:21
在使用任何web资源时,您需要确保声明了正确的前缀。如果您从DBpedia SPARQL端点进行查询,那么您可以直接使用dbo:basedOn
,甚至不需要声明它,因为它在predefined中。或者,如果您想使用自己的,或者如果您正在使用另一个SPARQL客户机,请确保您为该属性选择的任何短名称都声明了http://dbpedia.org/ontology/的前缀。
然后,首先,为了获得更多的结果,您可能不会限制这个三元模式的主题的类型,因为可能有一些电影实际上不是这样的类型。因此,像这样的查询
select distinct *
{
?movie dbo:basedOn ?book .
?book a dbo:Book .
}
会给你带来很多好的结果,但不是全部。例如,示例中的资源将丢失。您可以使用如下查询轻松地检查和测试这两个资源之间的可用属性:
select ?p
{
{<http://dbpedia.org/resource/2001:_A_Space_Odyssey_(film)> ?p <http://dbpedia.org/resource/2001:_A_Space_Odyssey> }
UNION
{ <http://dbpedia.org/resource/2001:_A_Space_Odyssey> ?p <http://dbpedia.org/resource/2001:_A_Space_Odyssey_(film)>}
}
您只会得到一个结果:http://www.w3.org/2000/01/rdf-schema#seeAlso
(请注意,URI使用'resource',而不是'page')
然后,您可以使用here描述的方法搜索两个资源之间的任何路径,或者找到其他模式的组合,这将增加结果的数量。
https://stackoverflow.com/questions/50666623
复制相似问题