2016-12-07 28 views
2

Я хочу написать запрос, чтобы получить тройки об объектах, связанных с фильмом. Это запрос:Использование OPTIONAL и UNION в SPARQL

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

Это не возвращает результаты из-за тайм-аута. В противном случае с предложением OPTIONAL нет никаких проблем. Например, если вы ставите «dbo: рассказчик» вместо «? P», вы увидите результаты.

2

Try (примечание:. Тайм-аут в исходном запросе был обусловлен декартова произведения, возникающего в результате размещения факультативной клаузулы):

SELECT DISTINCT ?s1 WHERE 
    { 
    dbr:Braveheart ?p ?o 
    OPTIONAL 
     { 
     { 
      {?s1 ?p3 ?o} 
      UNION 
      { 
      {?o ?p2 ?o2 } 
      OPTIONAL 
       { 
       {?o2 ?p21 ?o21} 
       UNION 
       {?s21 ?p22 ?o2} 
       } 
      } 
     } 
     } 
    } 

Ссылки: