如果没有一些样本数据可以处理这些问题很难回答这些问题。下面是一个有谁对喜剧类似的排名上浪漫的两个用户,但不同的排名一些样本数据:
@prefix : <urn:ex:>
:a :ranks [ :genre :comedy ; :value 2 ],
[ :genre :comedy ; :value 3 ],
[ :genre :comedy ; :value 3 ],
[ :genre :romance ; :value 7 ],
[ :genre :romance ; :value 8 ],
[ :genre :romance ; :value 9 ].
:b :ranks [ :genre :comedy ; :value 3 ],
[ :genre :comedy ; :value 3 ],
[ :genre :comedy ; :value 4 ],
[ :genre :romance ; :value 0 ],
[ :genre :romance ; :value 1 ],
[ :genre :romance ; :value 0 ].
下面是计算它们的平均排名在流派的不同的查询:
prefix : <urn:ex:>
select ?user1 ?user2 ?genre (abs(avg(?value1)-avg(?value2)) as ?diff) {
?user1 :ranks [ :genre ?genre ; :value ?value1 ].
?user2 :ranks [ :genre ?genre ; :value ?value2 ].
filter (str(?user1) < str(?user2)) #-- avoid duplicate user1/user2, user2/user1 results
}
group by ?user1 ?user2 ?genre
order by ?diff
---------------------------------------------------------
| user1 | user2 | genre | diff |
=========================================================
| :a | :b | :comedy | 0.666666666666666666666667 |
| :a | :b | :romance | 7.666666666666666666666667 |
---------------------------------------------------------
现在,你不能过滤器对总结果,你必须使用有,所以只有在差异小于某个特定值的值,你会这样做:
prefix : <urn:ex:>
select ?user1 ?user2 ?genre (abs(avg(?value1)-avg(?value2)) as ?diff) {
?user1 :ranks [ :genre ?genre ; :value ?value1 ].
?user2 :ranks [ :genre ?genre ; :value ?value2 ].
filter (str(?user1) < str(?user2))
}
group by ?user1 ?user2 ?genre
having (?diff < 1)
order by ?diff
--------------------------------------------------------
| user1 | user2 | genre | diff |
========================================================
| :a | :b | :comedy | 0.666666666666666666666667 |
--------------------------------------------------------
如果你不关心实际的差异,不同的是它是低于阈值,就可以把在直接有的表达,并做到:
select ?user1 ?user2 ?genre {
#-- ...
}
group by ?user1 ?user2 ?genre
having (abs(avg(?value1)-avg(?value2)) < 1)
看着你的编辑,看起来你问了一个问题,然后我的答案为它工作(因为你把它加入到这个最新版本)。最新版本似乎在提出一个新问题。如果您找到了原始问题的答案,那么您将答案标记为已接受。如果您有新问题,则应将其作为新问题发布,而不要编辑原始问题。通过编辑原稿,可以使发布给它的答案失效。我回滚了这个问题(但修订版本仍然可以在修订历史中找到)。 –