Запрос SPARQL возвращает разные результаты в зависимости от порядка операторов.

У меня есть запрос SPARQL, который возвращает наиболее конкретные общие классы двух ресурсов.

Когда я пытаюсь запустить его на https://dbpedia.org/sparql, иногда он ничего не возвращает, а другие раз он возвращает классы, которые я хочу.

Я заметил, что это связано с порядком операторов в запросе.

Это нежелательное поведение, поскольку при выполнении запроса я ожидаю, что он будет иметь одинаковые результаты независимо от порядка ввода URI ресурсов.

Кто-нибудь сталкивался с этой проблемой и нашел для нее решение?

Запросы

Следующий запрос работает правильно, возвращая http://dbpedia.org/ontology/Film и http://dbpedia.org/ontology/Wikidata:Q11424 в результате:

SELECT ?lcs
WHERE
{
  <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class1 .
  ?class1 rdfs:subClassOf* ?lcs .
  <http://dbpedia.org/resource/Finding_Nemo> a ?class2 .
  ?class2 rdfs:subClassOf* ?lcs .

  FILTER NOT EXISTS {
    <http://dbpedia.org/resource/Finding_Nemo> a ?class3 .
    ?class3 rdfs:subClassOf* ?sublcs .
    <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class4 .
    ?class4 rdfs:subClassOf* ?sublcs .
    ?sublcs  rdfs:subClassOf ?lcs
  }

  FILTER strstarts(str(?lcs), "http://dbpedia.org/ontology")
}

Однако следующий запрос ничего не возвращает:

SELECT ?lcs
WHERE
{
  <http://dbpedia.org/resource/Finding_Nemo> a ?class1 .
  ?class1 rdfs:subClassOf* ?lcs .
  <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class2 .
  ?class2 rdfs:subClassOf* ?lcs .

  FILTER NOT EXISTS {
    <http://dbpedia.org/resource/Finding_Nemo> a ?class3 .
    ?class3 rdfs:subClassOf* ?sublcs .
    <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class4 .
    ?class4 rdfs:subClassOf* ?sublcs .
    ?sublcs  rdfs:subClassOf ?lcs
  }

  FILTER strstarts(str(?lcs), "http://dbpedia.org/ontology")
}

person Diego Santana    schedule 10.01.2018    source источник
comment
По некоторым причинам второй запрос дороже, и Virtuoso не может найти то, что вам нужно, за время выполнения запроса. Но по каким причинам... Думаю, причина в том, что количество rdf:types в В поисках Немо (~55) больше, чем количество rdf:types в Ice Age ( ~35). Кстати, SQL планы выполнения ваших запросов немного отличаются (отметьте Создать отчет о компиляции SPARQL (вместо выполнения запроса), чтобы увидеть их).   -  person Stanislav Kralin    schedule 10.01.2018
comment
Не забывайте, что в Virtuoso есть функция в любое время, а время ожидания по умолчанию в веб-интерфейсе составляет 30 секунд.   -  person UninformedUser    schedule 10.01.2018
comment
И, как сказал Стансилав Кралин, несмотря на то, что они семантически эквивалентны, разные порядки тройных шаблонов могут привести к разному плану выполнения запроса. Кстати, это самая сложная часть тройного магазина, и найти лучшее не так уж и просто (даже такое существует).   -  person UninformedUser    schedule 10.01.2018
comment
Кстати, вы также можете добавить фильтр FILTER strstarts(str(?sublcs), "http://dbpedia.org/ontology") к части NOT EXISTS, так как вас интересует только онтология DBpedia.   -  person UninformedUser    schedule 10.01.2018
comment
Или, что еще более эффективно, следует использовать ?lcs a owl:Class . в первой части запроса. Эти триплеты схем загружаются только для классов DBpedia.   -  person UninformedUser    schedule 10.01.2018
comment
Добавление ?lcs a owl:Class . действительно значительно ускоряет процесс, но при этом будет исключен dbo:Wikidata:Q11424, который описывается только как owl:equivalentClass dbo:Film, а не как a owl:Class.   -  person TallTed    schedule 12.01.2018
comment
@AKSW Добавление FILTER strstarts(str(?sublcs), "http://dbpedia.org/ontology") к части NOT EXISTS действительно привело к появлению результатов.   -  person Diego Santana    schedule 13.01.2018
comment
@StanislavKralin Хороший вопрос, возможно, поэтому он более обширен, чем другой запрос.   -  person Diego Santana    schedule 13.01.2018


Ответы (1)


  1. Вы выполняете свои запросы на общедоступной конечной точке, которая имеет множество настроек самозащиты. Это означает, что дорогостоящие запросы могут давать частичные результаты или вообще не давать результатов, тогда как недорогие запросы могут давать полные результаты. Вы можете настроить собственную зеркальную конечную точку (быстро и просто на Amazon EC2) без такой защиты, и вы должны увидеть эквивалентные результаты из эквивалентных запросов.

  2. #P2# <блочная цитата> #P3# #P4#
    SELECT ?lcs
    WHERE
    {
      <http://dbpedia.org/resource/Finding_Nemo>  a  ?class1  .
      ?class1  rdfs:subClassOf*  ?lcs  .
      <http://dbpedia.org/resource/Ice_Age_(2002_film)>  a  ?class2  .
      ?class2  rdfs:subClassOf*  ?lcs  .
    
      FILTER NOT EXISTS {
        <http://dbpedia.org/resource/Finding_Nemo>  a  ?class3  .
        ?class3  rdfs:subClassOf*  ?sublcs  .
        <http://dbpedia.org/resource/Ice_Age_(2002_film)>  a  ?class4  .
        ?class4  rdfs:subClassOf*  ?sublcs .
        ?sublcs  rdfs:subClassOf  ?lcs 
        FILTER strstarts( str(?sublcs), "http://dbpedia.org/ontology" )
      }
    
      FILTER strstarts( str(?lcs), "http://dbpedia.org/ontology" )
    }
    

(Отказ от ответственности: Программное обеспечение OpenLink создает Virtuoso, на котором работает конечная точка DBpedia, и упомянутый AMI AMI выше. Они также нанимают меня.)

person TallTed    schedule 12.01.2018
comment
Да, добавление FILTER strstarts( str(?sublcs), "http://dbpedia.org/ontology" ) работает. - person Diego Santana; 13.01.2018
comment
Я не знал, что есть такая настройка, я думал, что это выдаст мне ошибку тайм-аута, если запрос займет слишком много времени. Хорошо знать. - person Diego Santana; 13.01.2018