比较平均值-SPARQL

比较平均值-SPARQL,sparql,Sparql,有一个对电影进行排名的用户数据集。需要找到与user1口味相似的用户。类似的味道定义如下:代码< >代码>类型>代码> >代码> > AVGR1以及同一类型的代码> USE2 >代码> AVGR2,然后 USE1 和 USE2有类似的味道 ABS(AVGR1-AVGR2)如果没有一些样本数据,很难回答这类问题。以下是一些样本数据,其中有两位用户在喜剧方面的排名相似,但在爱情方面的排名不同: @前缀: :a:排名[:流派:喜剧;:价值2], [:类型:喜剧;:值3], [:类型:喜剧;:值3],

有一个对电影进行排名的用户数据集。需要找到与user1口味相似的用户。类似的味道定义如下:代码< >代码>类型>代码> >代码> > AVGR1以及同一类型的代码> USE2 >代码> AVGR2,然后<代码> USE1 和 USE2有类似的味道<代码> ABS(AVGR1-AVGR2)如果没有一些样本数据,很难回答这类问题。以下是一些样本数据,其中有两位用户在喜剧方面的排名相似,但在爱情方面的排名不同:

@前缀:
:a:排名[:流派:喜剧;:价值2],
[:类型:喜剧;:值3],
[:类型:喜剧;:值3],
[:流派:浪漫;:价值7],
[:流派:浪漫;:价值8],
[:流派:浪漫;:价值9]。
:b:等级[:流派:喜剧;:价值3],
[:类型:喜剧;:值3],
[:流派:喜剧;:价值4],
[:流派:浪漫;:值0],
[:流派:浪漫;:价值1],
[:流派:浪漫;:值0]。
下面是一个查询,用于计算他们在不同类型上的平均排名差异:

前缀:
选择?用户1?用户2?类型(abs(平均值(?值1)-平均值(?值2))作为?差异){
?user1:ranks[:genre?genre;:value?value1]。
用户2:等级[:流派?流派;:值?值2]。
过滤器(str(?user1)
---------------------------------------------------------
|用户1 |用户2 |类型|差异|
=========================================================
|:a |:b |:喜剧| 0.66666667|
|:a |:b |:浪漫| 7.66666667|
---------------------------------------------------------
现在,您不能对聚合结果进行筛选,必须使用having,因此,要仅获取差异小于某个特定值的值,您可以执行以下操作:

前缀:
选择?用户1?用户2?类型(abs(平均值(?值1)-平均值(?值2))作为?差异){
?user1:ranks[:genre?genre;:value?value1]。
用户2:等级[:流派?流派;:值?值2]。
过滤器(str(?user1)
--------------------------------------------------------
|用户1 |用户2 |类型|差异|
========================================================
|:a |:b |:喜剧| 0.66666667|
--------------------------------------------------------
如果您不关心实际的差异,除非它低于阈值,您可以将表达式直接放在having中,然后执行以下操作:

选择?用户1?用户2?类型{
#-- ...
}
分组依据?用户1?用户2?类型
具有(abs(avg(?value1)-avg(?value2))<1)

?未在筛选器中定义Rdiff-在SELECT中发生在AS之前


试着使用跟在小组后面的have BY。

@nlimits但是这个答案对你有用吗?在如何检索实际排名方面存在差异,但清楚地了解如何进行这一部分(因为您有一个现有的查询)。关于分组和拥有的部分应该很容易翻译,是吗?在查看您的编辑时,似乎您问了一个问题,然后我的答案就解决了(因为您将其纳入了最新版本)。最新版本似乎提出了一个新问题。如果您找到了原始问题的答案,则将答案标记为已接受。如果你有一个新问题,你应该把它作为一个新问题发布,而不是编辑原始问题。通过编辑原件,可以使已发布到其中的答案无效。我已经回滚了该问题(但修订版仍在修订历史记录中可用)。
SELECT ?p ?p1 ?genre (abs (AVG(?rating)-AVG(?ratingp1)) AS ?RDiff)
WHERE{
?p movies:hasRated ?rate.
?p1 foaf:knows ?p.
?rate movies:ratedMovie ?mov.
?rate movies:hasRating ?rating.
?mov movies:hasGenre ?genre.
?p1 movies:hasRated ?ratep1.
?ratep1 movies:ratedMovie ?movp1.
?ratep1 movies:hasRating ?ratingp1.
?movp1 movies:hasGenre ?genre.
FILTER (xsd:float(?Rdiff)<1.0 && ?p=movies:user1)
}
GROUP BY ?p ?p1 ?genre