2016-12-07 153 views
2

我想编写一个查询来获取关于与电影相关的实体的三元组。这是查询条件:在SPARQL中使用OPTIONAL和UNION

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

在使用Virtu的Web界面中有超时oso随时随地的功能。 – AKSW

回答

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} 
    } 
    } 
    } 

由于超时而没有返回结果。否则,可选条款没有问题。例如,如果你把“dbo:narrator”而不是“?p”,你会看到结果。