#sparql
#sparql
Вопрос:
Предположим, я хочу найти несколько соседей первой степени Берлина. Я задаю следующий вопрос:
select ?s ?p where {
?s ?p dbr:Berlin.
}
Можно ли наложить ограничение на возвращаемый результат таким образом, чтобы было не более 5 результатов для каждого уникального значения ?p
?
Комментарии:
1. это невозможно в SPARQL 1.1, смотрите Также предложение для SPARQL 1.2: github.com/w3c/sparql-12/issues/100
Ответ №1:
Все мои попытки с подзапросами истекли…
Но, как потенциально полезное, если не совсем идеальное решение, может быть, GROUP_CONCAT
, MAX
/ MIN
или SAMPLE
полезны?
SELECT
?writer (GROUP_CONCAT(?namestring; SEPARATOR = " ") AS ?namestrings)
(MIN(?namestring) AS ?min_name)
(MAX(?namestring) AS ?max_name)
(SAMPLE(?namestring) AS ?random_name)
(SAMPLE(?namestring) AS ?another_random_name_that_may_unfortunately_be_the_same_again)
WHERE {
?writer wdt:P31 wd:Q5;
wdt:P166 wd:Q37922;
wdt:P735 ?firstname.
?firstname wdt:P1705 ?namestring.
}
GROUP BY ?writer
HAVING ((COUNT(?writer)) > 2 )
LIMIT 20
Смотрите это в прямом эфире 2 )
LIMIT 20″ rel=»nofollow noreferrer»>здесь.
И, как вы можете видеть, SAMPLE
, по-видимому, оценивается только один раз, поэтому его повторное использование не приближает вас к пяти (разным) выборкам.
(Вы можете не использовать HAVING
для вашего использования. Я включил это только для того, чтобы ограничить его полезными примерами))
Комментарии:
1. какая попытка с подзапросом это была бы? Подзапросы всегда оцениваются первыми, поэтому вы не можете получить что-то вроде 5 на ?p или группу: Смотрите также предложения для SPARQL 1.2: github.com/w3c/sparql-12/issues/100 и github.com/w3c/sparql-12/issues/9 и github.com/w3c/sparql-12/issues/47