SPARQL查询电影

时间:2017-03-22 20:23:34

标签: sparql semantic-web dbpedia rdfs

我正在创建一个允许用户使用SPARQL查询搜索电影的Web应用程序。

目前我正在使用DBpedia来获取数据。

问题是我需要3个数据(标题,流派和发布日期)。但问题是我没有收到电影的类型,但由于某种原因我收到了音乐类型:/

这是我创建的查询

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX db: <http://dbpedia.org/ontology/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT ?movieLink ?title ?genreLink ?genre ?releaseDate
WHERE {
    ?movieLink rdf:type db:Film;
               foaf:name ?title.
    OPTIONAL { ?movieLink prop:genre ?genreLink.
               ?genreLink rdfs:label ?genre.
               FILTER(lang(?genre) = 'en') }.
    OPTIONAL{ ?movieLink <http://dbpedia.org/ontology/releaseDate> ?releaseDate }.

    FILTER(lang(?title) = 'en')
    FILTER((?releaseDate >= '2010-01-01'^^xsd:date) && (?releaseDate < '2010-12-31'^^xsd:date))
}
ORDER BY DESC(?releaseDate)
LIMIT(100)

我一直坚持这个问题,所以任何帮助都会受到赞赏。

注意:我已经研究过使用Linkedmdb但是遇到了类似的问题。

2 个答案:

答案 0 :(得分:1)

DBpedia数据主要来自维基百科页面上的信息框。例如,如果您查看the page for the film Ayyanar,您会发现它包含两个信息框:

  • 一部电影本身,没有提及类型
  • 一部电影原声带,类型列为原声带

这就是为什么你的查询返回该电影的音轨类型的原因。

似乎infoboxes about films不包含任何类型的字段,因此您将无法以这种方式获取该信息。

另一方面,该文章属于动作剧电影类别,它在DBpedia上使用dct:subject表示。我认为你应该能够通过以下方式获取类型信息:

OPTIONAL { ?movieLink dct:subject ?genreLink.
           ?genreLink skos:broader+ dbc:Films_by_genre }

虽然它不是非常干净的数据(因为维基百科的类别结构很乱)。它实际上对我不起作用,因为此类查询超出了公共DBpadia SPARQL端点的内存限制。

答案 1 :(得分:1)

@svick提供了一个很好的查询。如果dbpedia.org没有回复,请使用我们的包含传递推理的端点:http://factforge.net/sparql。例如,这有效:

SELECT * {
  ?movieLink a dbo:Film; dct:subject ?genreLink.
  ?genreLink skos:broaderTransitive dbc:Films_by_genre
}