SPARQL ограничивает количество результатов для определенной переменной

#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