最外层查询的结构在这些部分存在致命问题:
select
(MAX(?countOfSharedLikedItems) as ?max)
(COUNT(?anotherItem) as ?countOfSharedLikedItems)
WHERE { ... }
group by ?anotherUser
你需要充分理解什么group by做。中的三元组where部分提供一堆结果行。例如,在类似的查询中
select * where {
?s ?p ?o
}
结果是一堆行,每行都有每个变量的值。当您添加一个group by子句,您是说您想要将这些行划分为一组集合。例如,如果结果是
s1 p1 o1
s1 p2 o2
s2 p1 o2
s2 p1 o3
s3 p1 o2
然后按 ? 进行分组,然后将这些结果划分为如下所示:
s1
[ p1 o1 ]
[ p2 o2 ]
s2
[ p1 o2 ]
[ p1 o3 ]
s3
[ p1 o2 ]
对于每个唯一的 s 值,您仍然有一堆行,每行提供一个 p 和一个 o 值。聚合函数对这些束进行操作。所以当你做类似的事情时
select ?s (max(?o) as ?oMax) where {
?s ?p ?o
}
group by ?s
the max聚合开始对每一组(即 [o1, o2]、[o2, o3] 和 [o2])起作用,并从每个组中生成一个值。所以像
select
(count(?o) as ?numO)
(max(?numO) as ?oMax)
group by ?s
没有意义。当您按 ? 进行分组时,计数会在每个组中进行,并且有一些值,因此您可以对它们进行计数。但max也尝试在每个束中进行操作,但是束没有任何 ?numO 的绑定可供查看。即使您可以使用来自的值计数(?o),只会有每束一个, so max只会返回该值。