电影的 SPARQL 查询
SPARQL Query for movies
我正在创建一个 Web 应用程序,允许用户使用 SPARQL 查询来搜索电影。
目前我正在使用 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,但遇到了类似的问题。
DBpedia 数据主要来自维基百科页面上的信息框。例如,如果您查看 the page for the film Ayyanar,您会注意到它包含两个信息框:
- 一个关于电影本身,没有提及类型
- 一个用于电影配乐,类型列为配乐
这就是您查询 returns 该电影配乐类型的原因。
似乎infoboxes about films不包含任何流派字段,因此您将无法通过这种方式获取该信息。
另一方面,该文章属于 动作片 类别,在 DBpedia 上使用 dct:subject
表示。我 认为 你应该能够使用类似的东西从中获取流派信息:
OPTIONAL { ?movieLink dct:subject ?genreLink.
?genreLink skos:broader+ dbc:Films_by_genre }
尽管它不会是非常干净的数据(因为维基百科的类别结构一团糟)。它实际上对我不起作用,因为这样的查询超出了 public DBpadia SPARQL 端点的内存限制。
@svick 给出了一个很好的查询。如果 dbpedia.org 无法回答,请使用我们包含传递推理的端点:http://factforge.net/sparql。例如,这有效:
SELECT * {
?movieLink a dbo:Film; dct:subject ?genreLink.
?genreLink skos:broaderTransitive dbc:Films_by_genre
}
我正在创建一个 Web 应用程序,允许用户使用 SPARQL 查询来搜索电影。
目前我正在使用 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,但遇到了类似的问题。
DBpedia 数据主要来自维基百科页面上的信息框。例如,如果您查看 the page for the film Ayyanar,您会注意到它包含两个信息框:
- 一个关于电影本身,没有提及类型
- 一个用于电影配乐,类型列为配乐
这就是您查询 returns 该电影配乐类型的原因。
似乎infoboxes about films不包含任何流派字段,因此您将无法通过这种方式获取该信息。
另一方面,该文章属于 动作片 类别,在 DBpedia 上使用 dct:subject
表示。我 认为 你应该能够使用类似的东西从中获取流派信息:
OPTIONAL { ?movieLink dct:subject ?genreLink.
?genreLink skos:broader+ dbc:Films_by_genre }
尽管它不会是非常干净的数据(因为维基百科的类别结构一团糟)。它实际上对我不起作用,因为这样的查询超出了 public DBpadia SPARQL 端点的内存限制。
@svick 给出了一个很好的查询。如果 dbpedia.org 无法回答,请使用我们包含传递推理的端点:http://factforge.net/sparql。例如,这有效:
SELECT * {
?movieLink a dbo:Film; dct:subject ?genreLink.
?genreLink skos:broaderTransitive dbc:Films_by_genre
}