0

我是 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 
}

我无法得到任何结果。我怎样才能做到这一点?

4

1 回答 1

0

当使用任何网络资源时,在你的情况下是 property :basedOn,你需要确保你已经声明了正确的前缀。如果您从 DBpedia SPARQL 端点查询,那么dbo:basedOn即使不声明它也可以直接使用,因为它在预定义的. 或者,如果您想使用自己的,或者如果您正在使用另一个 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 带有“资源”,而不是“页面”)

然后,您可以使用此处描述的方法搜索两个资源之间的任何路径,或者找到可以增加结果数量的其他模式的组合。

于 2018-06-03T15:27:20.873 回答