Избегать указания количества явно перечисленных ресурсов?

У меня проблемы с запросом SPARQL. Я хотел бы иметь рецепты, которые содержат меньше ингредиентов, чем я предоставляю. Это запрос:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rec:<http://www.receta.org#>
select ?recipe  (count(distinct ?Ingrediente) as ?oi) {
  ?recipe rec:Ingrediente ?Ingrediente
  filter not exists {
    ?recipe rec:Ingrediente ?other_ingredient
    filter( ?other_ingredient not in (rec:Cebolla,rec:Tomate, rec:Aceite, rec:Sal) )
  }}
group by ?recipe
having(  (count(distinct ?Ingrediente)) < 4)
order by (count(distinct ?Ingrediente))

Вот пример. Допустим, у меня есть эти рецепты:

  • prueba3: цеболла
  • пруэба: цеболла, ацеит
  • prueba2: цеболла, ацеит, томат
  • prueba4: цеболла, томат, ацеит, сал

Затем я хотел бы напечатать:

  • prueba3: цеболла
  • пруэба: цеболла, ацеит
  • prueba2: цеболла, ацеит, томат

Я не хочу печатать prueba4, потому что в нем точно столько же ингредиентов.

Основная проблема с запросом — это строка «имеющая»: having((count(distinct ?Ingrediente)) < 4). В данном случае это работает, но я не хочу ставить 4, я хочу сделать это в общем виде, поэтому мне не нужно менять это число каждый раз, когда я добавляю больше ингредиентов.

Итак, какие-либо идеи о том, как я могу изменить эту строку? Спасибо!


person SomeAnonymousPerson    schedule 09.12.2014    source источник
comment
Ваш запрос является допустимым для SPARQL в соответствии с валидатором запросов sparql.org, но в заголовке вопроса указано ошибка запроса в строке «имеется». Вопрос звучит так, как будто вы просто хотите избежать необходимости что-то вводить в запрос. Действительно ли в запросе есть ошибка?   -  person Joshua Taylor    schedule 09.12.2014
comment
Я написал ответ на ваш предыдущий вопрос, и на самом деле это одна из вещей, которые меня интересовали, когда я писал это. Тогда я пытался придумать способ, но не придумал хорошего обходного пути. Конечно, если запрос строится процедурно, внедрить эти значения не должно быть слишком сложно.   -  person Joshua Taylor    schedule 09.12.2014
comment
Да, ты прав. Это не ошибка. Извини. Я просто хочу сделать это глобальным, как я уже сказал. Я не хочу менять это число каждый раз, когда меняю количество ингредиентов. Дело в том, что я хотел бы взять эти значения из Интернета, чтобы это число изменилось.   -  person SomeAnonymousPerson    schedule 10.12.2014


Ответы (1)


Предложение «имея» выполняется после привязок SELECT, поэтому у вас может быть что-то вроде следующего:

PREFIX ...
select ?recipe  (count(distinct ?Ingrediente) as ?oi) (4 AS ?count)
WHERE {
   ?recipe rec:Ingrediente ?Ingrediente
   filter not exists {
   ?recipe rec:Ingrediente ?other_ingredient
   filter( ?other_ingredient not in (rec:Cebolla,rec:Tomate, rec:Aceite, rec:Sal) )
 }}
group by ?recipe
having(?oi < ?count)
order by ?oi

... где ?count может быть вычислено из значения, запрашиваемого из данных, или количества некоторых тройных совпадений.

person scotthenninger    schedule 14.02.2016