如何规范化这些数据

时间:2016-04-21 13:25:41

标签: sparql rdf semantic-web owl ontology

这是重现问题的最低数据:

@prefix rs: <http://example.org/rs#>
@prefix bo: <http://example.org/bo#>
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>

rs:user1 rs:hasRated [rs:by "1.0"^^xsd:float ; rs:item bo:animalFarm] .

rs:user2 rs:hasRated [rs:by "0.9"^^xsd:float ; rs:item bo:animalFarm] .

rs:user3 rs:hasRated [rs:by "0.9"^^xsd:float ; rs:item bo:animalFarm] .

rs:user4 rs:hasRated [rs:by "0.5"^^xsd:float ; rs:item bo:book3] .

rs:user5 rs:hasRated [rs:by "0.6"^^xsd:float ; rs:item bo:book3] .

rs:user6 rs:hasRated [rs:by "0.8"^^xsd:float ; rs:item bo:algorithem1] .

rs:user7 rs:hasRated [rs:by "0.9"^^xsd:float ; rs:item bo:algorithem1] .

rs:user8 rs:hasRated [rs:by "0.3"^^xsd:float ; rs:item bo:book4] .

我希望规范化每个项目的评分平均值,并规范化每个项目的评分数

我可以采用每个项目的评分平均值每个项目的评分数如下:

PREFIX  bo:   <http://example.org/bo#>
PREFIX  xsd:  <http://www.w3.org/2001/XMLSchema#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  rs:   <http://example.org/rs#>
select ?item (AVG(?ratingValue) as ?avg) (COUNT(*) as ?count) 
{
    ?user rs:hasRated [ rs:item ?item ;  rs:by ?ratingValue ] .
}
group by ?item 

结果是:

enter image description here

如果可能,我想要的是:

bo:book3                 (0.55/(0.55 + 0.93333334 + 0.85 + 0.3 ))   (2/(2 + 3 + 2 + 1))

当然其他项目也一样。

我的问题是我不知道如何制作总和,同时进行划分。

非常感谢您的帮助。

更新1

我问的是这样做的可能性,如果没有(或者表现太差)我得到了不同的解决方案

1 个答案:

答案 0 :(得分:3)

在SPARQL中,数据要么已分组,要么未分组。你不能真正从小组“伸出手”并获得比小组更大的信息。这意味着要实现这一点,您可能需要一个子查询来分别获取总值。根据您提供的数据:

NestedScrollingChild
select ?item
       (avg(?rating_)/?sumAvgRating as ?rating)
       (count(*)/?countRating as ?percentCount)
{
  ?user rs:hasRated [ rs:by ?rating_ ; rs:item ?item ]

  #-- get number of ratings
  { select (count(*) as ?countRating) { ?user rs:hasRated [] }}

  #-- get sum of average ratings
  { select (sum(?avgRating) as ?sumAvgRating) {
      { select (avg(?rating_) as ?avgRating) {
          ?user rs:hasRated [ rs:by ?rating_ ; rs:item ?item ]
        }
        group by ?item
      }
    }
  }
}
group by ?item ?countRating ?sumAvgRating

我认为要获取您真正想要的数据,并且在没有冗余子查询的情况下执行此操作,您需要对结果进行一些后处理。我这样说是因为你真的要求一些涉及以两种不同方式进行分组的计算。要获得评分总数,您需要在所有结果中使用一个组(或者至少在某些分组结果上超过一组)。要获得每个项目的平均值,您需要对项目进行分组。要获得平均值的总和,您需要对分组数据进行分组。所以,如果没有冗余的查询,我认为你不能完美地做到这一点。

但是,您可以在查询中处理某些。我认为我会得到物品及其评分,并计算评分和总和每个项目的平均值,如下所示:

-----------------------------------------------------------
| item           | rating                  | percentCount |
===========================================================
| bo:book3       | "0.20886075"^^xsd:float | 0.25         |
| bo:book4       | "0.11392405"^^xsd:float | 0.125        |
| bo:algorithem1 | "0.3227848"^^xsd:float  | 0.25         |
| bo:animalFarm  | "0.35443038"^^xsd:float | 0.375        |
-----------------------------------------------------------

我这样做的原因,而不是平均评级,是从计数和总和,你可以轻松地重建平均值(只是将总和除以计数),你可以得到和的总和,以及计数的总和。如果你过早地做平均值,那么你无法确定实际所有评级的总和。