我是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
}
我无法得到任何结果。我怎么能这样做?
答案 0 :(得分:0)
使用任何网络资源时,如果是属性:basedOn
,则需要确保已声明正确的前缀。如果您从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位于&#39;资源&#39;,而不是&#39;页面&#39;)
然后,您可以使用描述here的方法搜索两个资源之间的任何路径,或者找到可以增加结果数量的其他模式的组合。