在SPARQL中使用OPTIONAL和UNION

时间:2016-12-07 10:39:04

标签: 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) .

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

2 个答案:

答案 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;你会看到结果。