Запрос SPARQL, включающий подзапрос в Викиданных, дает неожиданные результаты - PullRequest
0 голосов
/ 28 апреля 2018

Я знаю следующий SPARQL против Wikidata SPARQL Endpoint Запрос не имеет смысла. Подобный запрос автоматически генерируется из моего приложения. Пожалуйста, не обращайте внимания на концептуальную обоснованность, и давайте углубимся в эту странную (по крайней мере для меня) вещь, происходящую.

SELECT ?year1 ?year_labelTemp
    WHERE
      { 
        ?year1  <http://www.w3.org/2000/01/rdf-schema#label>  ?year_labelTemp .
        { SELECT distinct ?year1
          WHERE
            { ?film  <http://www.wikidata.org/prop/direct/P577>  ?date ;
                     <http://www.wikidata.org/prop/direct/P31>  <http://www.wikidata.org/entity/Q11424>
              BIND(year(?date) AS ?year1)
            }
        }   
      }
    limit 10

Согласно оценке запроса в SPARQL, подзапрос оценивается первым, а затем его результаты проецируются на содержащий запрос. Следовательно, этот подзапрос будет оцениваться первым.

SELECT distinct ?year1
      WHERE
        { ?film  <http://www.wikidata.org/prop/direct/P577>  ?date ;
                 <http://www.wikidata.org/prop/direct/P31>  <http://www.wikidata.org/entity/Q11424>
          BIND(year(?date) AS ?year1)
        }

Подзапрос дает точно ожидаемые результаты (130 разных лет). Затем результаты этого подзапроса (переменная ?year1) будут спроецированы и объединены с тройным шаблоном во внешнем выборе.

?year1  <http://www.w3.org/2000/01/rdf-schema#label>  ?year_labelTemp .

Однако, поскольку внешний выбор не должен иметь никаких данных (без меток для ?year1), объединение не даст результатов.

Удивительно (по крайней мере, для меня) выполнение всего запроса (), указанного первым, дает результаты, а результаты странные.

 wd:Q43576  Mië
 wd:Q221    Masèdonia
 wd:Q221    Республикэу Македоние
 wd:Q221    Republiek van Masedonië
 wd:Q212    Украина
 wd:Q212    Ukraina
 wd:Q212    Украинэ
 wd:Q212    Oekraïne
 wd:Q207    George W. Bush
 wd:Q207    George W. Bush

Что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Вы написали, что подзапрос дал точно ожидаемый результат, но я думаю, что вы пропустили одно значение! Есть фильмы с пустым неизвестным значением в качестве данных публикации, например Q18844655 (по крайней мере, когда я пишу это). Именно это пустое значение привело к обнаружению, казалось бы, случайных объектов.

Если вы измените свой внутренний SELECT, добавив, например, FILTER(datatype(?date) = xsd:dateTime)., вы получите только фактические даты и, следовательно, только фактические годы, что означает на одно значение меньше, чем без фильтра. Попробуй здесь!

(Когда этот скорректированный внутренний SELECT используется целиком, тайм-ауты. Кажется, маркировка действительно не любит нечетные значения, подобные этим.)

0 голосов
/ 29 апреля 2018

Проблема в том, что иногда BIND неправильно проецирует переменные.

Вы можете проверить это с помощью следующего запроса:

SELECT ?year1 ?year_labelTemp ?projected
    WHERE
      { 
        ?year1  rdfs:label  ?year_labelTemp .
        hint:Prior hint:runLast true .
        { SELECT DISTINCT ?year1
          WHERE
            { ?film  wdt:P577  ?date ;
                     wdt:P31 wd:Q11424
              BIND(year(?date) AS ?year1)
              hint:SubQuery hint:runOnce true 
            }
         } 
        BIND(bound(?year1) AS ?projected)
      }
    LIMIT 10

Попробуйте!

К счастью, помогает следующий трюк:

SELECT ?year1 ?year_labelTemp
    WHERE
      { 
        ?year1  rdfs:label  ?year_labelTemp  .
        hint:Prior hint:runLast true .
        { SELECT DISTINCT ?year1
          WHERE
            { ?film  wdt:P577  ?date ;
                     wdt:P31 wd:Q11424
              BIND(year(?date) AS ?year1)
              FILTER (?year1 > 0)
            }
         } 
      }
    LIMIT 10

Попробуйте!


Ошибка может быть воспроизведена без вложенных подзапросов и с помощью hint:Query hint:optimizer "None", поэтому она не должна быть ошибкой оптимизатора запросов. Но интересно, что ошибка исчезает после замены wd:Q11424 на wd:Q24862.

BLZG-963 представляется наиболее связанной проблемой (как вы можете видеть, встроенные функции также задействованы).

...