Rdf 从SPARQL查询中获取值

Rdf 从SPARQL查询中获取值,rdf,sparql,semantic-web,rdfa,Rdf,Sparql,Semantic Web,Rdfa,下面的查询足以让我获得一个配方的名称以及配方中的配料量。我想把配方里的配料也拿出来。如何修改查询以执行此操作 前缀rdf: 前缀owl: 前缀rdfs: 前缀xsd: 前缀rec: 选择?r(计数(不同的?输入项)作为?oi)?i{ r记录:Ingrediente?Ingrediente 筛选器不存在{ ?r记录:Ingrediente?其他成分 过滤器(?其他成分不在(rec:Cebolla,rec:Tomate,rec:Aceite,rec:Sal,rec:Lechuga)) } } 按r?

下面的查询足以让我获得一个配方的名称以及配方中的配料量。我想把配方里的配料也拿出来。如何修改查询以执行此操作

前缀rdf:
前缀owl:
前缀rdfs:
前缀xsd:
前缀rec:
选择?r(计数(不同的?输入项)作为?oi)?i{
r记录:Ingrediente?Ingrediente
筛选器不存在{
?r记录:Ingrediente?其他成分
过滤器(?其他成分不在(rec:Cebolla,rec:Tomate,rec:Aceite,rec:Sal,rec:Lechuga))
}
}
按r?i分组
订货人(计数(不同?不一致)

最简单的方法当然就是将您想要的变量,
?Ingrediente
的值添加到您的
选择
子句中:

SELECT ?r (count(distinct ?Ingrediente) as ?oi) ?Ingrediente 
GROUP BY ?r ?Ingrediente
(顺便说一句,这里有一个变量
?i
,它似乎没有任何作用-它从来没有绑定到值。从现在起,我将忽略该变量)

但是,由于您使用的是聚合和分组,因此还需要将变量添加到
GROUP BY
子句中:

SELECT ?r (count(distinct ?Ingrediente) as ?oi) ?Ingrediente 
GROUP BY ?r ?Ingrediente
这可能或多或少会起作用,但问题是您正在混合骨料(配料数量)和该骨料的单个值。结果中会出现大量几乎重复的行(每个配方中每种成分对应一行),而且由于分组的变化,现在计数也可能是错误的

因此,需要另一种方法。您可以使用
GROUP\u CONCAT
aggregate函数。这将拾取所有值并将它们连接到单个(至少在默认情况下是以空格分隔的)列表中。如果使用此选项,则不必调整
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\u CONCAT

谢谢你的回答和解释!它真的很有用!正如你所提到的,如果我使用组_CONCAT,我每个配方只能得到一种配料,如果我使用组,那么我的计数就有问题,因为在那一列中,我每个配方都得到1row@KarenWiznia没问题。顺便说一句,与其在评论中感谢我,不如通过投票和/或接受来表明答案对你有用。看见