Получить значение из запроса 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
на этой стоимости имущества.