Почему SPARQL LIMIT для Inner Query ограничивает внешний запрос в RDF4J?
Я использую RDF4J версии 2.2.2 и сервер под Windows 10. Мне нужно использовать внутренний запрос для ограничения результатов. Мое конкретное приложение заключается в накоплении концепции событий из серии взаимосвязанных отчетов. Каждый отчет имеет метку времени в качестве одного из своих свойств. Мне нужен внутренний запрос с LIMIT
и ORDER BY
чтобы получить последнюю отметку времени из отчетов, вносящих вклад в каждое событие. Событие устанавливается тройкой во внешнем запросе. Поскольку полное приложение довольно сложное, я предложил простой пример, чтобы проиллюстрировать мой вопрос. В основном, я ожидаю, что внешний запрос выдаст несколько результатов с внутренним запросом, ограниченным 1, но LIMIT
похоже, применяется к внешнему запросу. Мне интересно, почему я получаю только один результат, когда ожидаю большего. В приведенном здесь примере я ожидаю два результата, но получу только один...
Пример случая настраивается в рабочей среде RDF4J с использованием репозитория с поддержкой RDFS+SPIN.
- Очистить репозиторий (RDF4J Workbench Modify/Clear).
- Загрузите онтологию Nuvio версии 1.0.0 с помощью функции Изменить / Добавить в рабочей среде
Задайте условие теста, используя следующий запрос на обновление 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 { }
Теперь выполните следующий запрос 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 . }
который дает ожидаемые четыре результата (обе метки времени для обоих испытуемых):
Теперь попытайтесь ограничить результаты одной отметкой времени на человека (
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.