在SPARQL中使用可选和并集

在SPARQL中使用可选和并集,sparql,dbpedia,linked-data,Sparql,Dbpedia,Linked Data,我想写一个查询来获取与电影相关的实体的三元组。以下是查询: 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) . OPTIO

我想写一个查询来获取与电影相关的实体的三元组。以下是查询:

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
子句阻止生成结果,以及如何解决问题

我不知道您在哪里提出了这个查询(我假设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子句就没有问题了。例如,如果将“dbo:叙述者”而不是“?p”,您将看到结果。

尝试(注意:原始查询中的超时是由于放置可选子句而产生的笛卡尔积):

链接:


使用Virtuoso anytime功能的web界面中存在超时。
SELECT DISTINCT ?s1 WHERE {
dbr:Braveheart ?p ?o
    OPTIONAL {
    {
        {
            {?o ?p2 ?o2 .}
            OPTIONAL {
              {?o2 ?p21 ?o21}
              UNION
              {?s21 ?p22 ?o2}
            }
        }
       UNION
       {?s1 ?p3 ?o}
    }
   } 
  }
SELECT DISTINCT ?s1  WHERE 
  {
    dbr:Braveheart ?p ?o
    OPTIONAL 
      {
        {
          {?s1 ?p3 ?o}
          UNION
          {
            {?o ?p2 ?o2 }
            OPTIONAL 
              {
                {?o2 ?p21 ?o21}
                UNION
                {?s21 ?p22 ?o2}
              }
          }
        }
      } 
  }