Получить значение из запроса SPARQL

Следующего запроса мне достаточно, чтобы получить название рецепта и количество ингредиентов в нем. Я хотел бы получить ингредиенты в рецепте, а также. Как я могу изменить свой запрос, чтобы сделать это?

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 ?r (count(distinct ?Ingrediente) as ?oi) ?i {
  ?r rec:Ingrediente ?Ingrediente
  filter not exists {
    ?r rec:Ingrediente ?other_ingredient
    filter( ?other_ingredient not in (rec:Cebolla,rec:Tomate, rec:Aceite, rec:Sal, rec:Lechuga) )
  }
}
group by ?r ?i
order by (count(distinct ?Ingrediente))

1 ответ

Решение

Самый простой способ сделать это, конечно, просто добавить переменную, значения которой вы хотите иметь, ?Ingrediente, на ваш SELECT пункт:

SELECT ?r (count(distinct ?Ingrediente) as ?oi) ?Ingrediente 

(кроме того, у вас есть переменная ?i там, который, кажется, ничего не делает - он никогда не привязан к значению. Я просто буду игнорировать эту переменную с этого момента)

Однако, поскольку вы используете агрегаты и группировку, для этого также необходимо добавить переменную в GROUP BY пункт:

GROUP BY ?r ?Ingrediente

Вероятно, это будет более или менее работать, но проблема в том, что вы смешиваете агрегат (количество ингредиентов) и отдельные значения этого агрегата. Вы получите очень много почти одинаковых строк в своем результате (по одной на каждый ингредиент в рецепте), и из-за изменения в группировке возможно, что теперь и счет неправильный.

Итак - нужен альтернативный подход. Что вы можете сделать, это использовать GROUP_CONCAT агрегатная функция. Это выбирает все значения и объединяет их в один (разделенный пробелами, по крайней мере по умолчанию) список. Если вы используете это, вам также не придется настраивать GROUP BY пункт. Следующее:

SELECT ?r (count(distinct ?Ingrediente) as ?oi) (GROUP_CONCAT(DISTINCT ?Ingrediente) as ?List) 

Результат будет выглядеть примерно так:

  ?r          ?oi                ?List 
  :r1           3                "rec:Tomate rec:Sal rec:Aceita" 

Список, вероятно, будет содержать полные URI, а не имена с префиксами, но вы поняли идею. Конечно, если вам нужны имена ингредиентов, а не их URI, вам нужно запросить эти имена, сопоставив соответствующее свойство (например, rdfs:label), а затем с помощью GROUP_CONCAT на этой стоимости имущества.

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