Почему SPARQL LIMIT для Inner Query ограничивает внешний запрос в RDF4J?

Я использую RDF4J версии 2.2.2 и сервер под Windows 10. Мне нужно использовать внутренний запрос для ограничения результатов. Мое конкретное приложение заключается в накоплении концепции событий из серии взаимосвязанных отчетов. Каждый отчет имеет метку времени в качестве одного из своих свойств. Мне нужен внутренний запрос с LIMIT и ORDER BY чтобы получить последнюю отметку времени из отчетов, вносящих вклад в каждое событие. Событие устанавливается тройкой во внешнем запросе. Поскольку полное приложение довольно сложное, я предложил простой пример, чтобы проиллюстрировать мой вопрос. В основном, я ожидаю, что внешний запрос выдаст несколько результатов с внутренним запросом, ограниченным 1, но LIMIT похоже, применяется к внешнему запросу. Мне интересно, почему я получаю только один результат, когда ожидаю большего. В приведенном здесь примере я ожидаю два результата, но получу только один...

Пример случая настраивается в рабочей среде RDF4J с использованием репозитория с поддержкой RDFS+SPIN.

  1. Очистить репозиторий (RDF4J Workbench Modify/Clear).
  2. Загрузите онтологию Nuvio версии 1.0.0 с помощью функции Изменить / Добавить в рабочей среде
  3. Задайте условие теста, используя следующий запрос на обновление SPARQL, используя функцию RDF4J Modify/SPARQL Update.

    PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
    PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
    
    INSERT {
        inst:aTestObject1 Nuvio:hasValue _:b0 ;
            Nuvio:hasValue _:b1 .
        inst:aTestObject2 Nuvio:hasValue _:b2 ;
            Nuvio:hasValue _:b3 .
    
        _:b0 Nuvio:hasDataValue "2017-11-13T13:46:00.000-06:00"^^xsd:dateTime .
        _:b1 Nuvio:hasDataValue "2017-11-13T13:46:01.000-06:00"^^xsd:dateTime .
        _:b2 Nuvio:hasDataValue "2017-11-13T13:46:02.000-06:00"^^xsd:dateTime .
        _:b3 Nuvio:hasDataValue "2017-11-13T13:46:03.000-06:00"^^xsd:dateTime .
    }
    WHERE {
    }
    
  4. Теперь выполните следующий запрос SPARQL, используя функцию RDF4J Workbench Explore/Query:

    PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
    
    SELECT DISTINCT *
    WHERE {
      ?o a Nuvio:Quantity .
      ?o Nuvio:hasValue/Nuvio:hasDataValue ?value .
    }
    

    который дает ожидаемые четыре результата (обе метки времени для обоих испытуемых): Результаты, как и ожидалось от первого запроса

  5. Теперь попытайтесь ограничить результаты одной отметкой времени на человека (inst:aTestObject1 а также inst:aTestObject2) используя следующий запрос, содержащий внутренний запрос (простое расширение первого запроса):

    PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
    
    SELECT DISTINCT *
    WHERE {
      ?o a Nuvio:Quantity .
      {
        SELECT DISTINCT *
        WHERE {
          ?o Nuvio:hasValue/Nuvio:hasDataValue ?value .
        } LIMIT 1
      }
    }
    

    который дает только один результат:

    неожиданный единственный результат из второго запроса, когда ожидаются два результата

    Я ожидаю двух результатов, по одному для каждого из inst:aTestObject1 а также inst:aTestObject2 так как у каждого есть две метки времени. Но я получаю только результат за inst:aTestObject2, Почему только один?

1 ответ

После комментария @AKSW, что внутренний выбор всегда оценивается первым и восстанавливается после того, как мой мозг исчезает, решение того, что я хотел (каждый тестовый объект с последним xsd:dateTime значение) может быть достигнуто с помощью следующего простого запроса...

PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>

SELECT DISTINCT ?o (MAX(?value) as ?maxValue)
WHERE {
  ?o a Nuvio:Quantity .
  ?o Nuvio:hasValue/Nuvio:hasDataValue ?value .
} GROUP BY ?o

Который возвращает желаемые два результата:

желаемые результаты запроса

Спасибо @AKSW.

Другие вопросы по тегам