从SPARQL查询中获取值

时间:2015-03-04 17:15:05

标签: rdf sparql semantic-web rdfa

以下查询足以让我获取食谱的名称及其中的成分含量。我也希望得到食谱中的成分。如何修改我的查询来执行此操作?

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 个答案:

答案 0 :(得分:2)

执行此操作的最简单方法当然是将您想要的变量?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