我想写一个查询来获取与电影相关的实体的三元组。这是查询:
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX : <http://dbpedia.org/resource/>
SELECT DISTINCT ?s1 WHERE {
SERVICE <http://dbpedia.org/sparql/> {
?film ?p ?o
FILTER (?film = :Braveheart) .
OPTIONAL {
{
{
{?o ?p2 ?o2 .}
OPTIONAL {
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
}
UNION
{?s1 ?p3 ?o}
}
}
}
}
此查询无法获取结果。但是,评论该部分
OPTIONAL {
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
生成结果。我想了解为什么OPTIONAL
子句会阻止生成结果以及如何解决问题。
答案 0 :(得分:2)
尝试(注意:原始查询中的超时是由于放置可选条款而产生的笛卡尔积。):
SELECT DISTINCT ?s1 WHERE
{
dbr:Braveheart ?p ?o
OPTIONAL
{
{
{?s1 ?p3 ?o}
UNION
{
{?o ?p2 ?o2 }
OPTIONAL
{
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
}
}
}
}
链接:
答案 1 :(得分:1)
我不知道你在哪里提出这个查询(我假设Sparql端点),它意味着什么不能获取任何结果,但我已经把查询编写得更简单,如下所示并在端点上执行:
SELECT DISTINCT ?s1 WHERE {
dbr:Braveheart ?p ?o
OPTIONAL {
{
{
{?o ?p2 ?o2 .}
OPTIONAL {
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
}
UNION
{?s1 ?p3 ?o}
}
}
}
由于超时,它不会返回结果。否则,OPTIONAL子句没有问题。例如,如果你把&#34; dbo:narrator&#34;而不是&#34;?p&#34;你会看到结果。