SPARQL中的多个聚合

时间:2012-11-15 15:22:17

标签: aggregate-functions sparql

我有一个包含邮件存档数据的三重商店。因此,假设我有很多人(foaf:Person)已发送(ex:hasSent)并收到(ex:hasReceived)个电子邮件(ex:Email)。

示例:

SELECT ?person ?email
WHERE {
    ?email  rdf:type   ex:Email.
    ?person rdf:type   foaf:Person;
            ex:hasSent ?email.
}

当然,ex:hasReceived同样适用。现在我想做一些统计和分析,即确定个人发送和接收的电子邮件数量。仅为一个谓词执行此操作是一个简单的聚合:

SELECT ?person (COUNT(?email) AS ?count)
WHERE {
    ?email  rdf:type   ex:Email.
    ?person rdf:type   foaf:Person;
            ex:hasSent ?email.
}
GROUP BY ?person

但是,我还需要收到的电子邮件数量,我希望这样做而不必发出单独的查询。所以我尝试了以下内容:

SELECT ?person (COUNT(?email1) AS ?sent_emails) (COUNT(?email2) AS ?received_emails)
WHERE {
  ?person rdf:type foaf:Person.

  ?sent_email rdf:type ex:Email.
  ?person ex:hasSent ?sent_email.

  ?received_email rdf:type ex:Email.
  ?person ex:hasReceived ?received_email.
}
GROUP BY ?person

这似乎不对,因为发送的电子邮件与收到的电子邮件的数字完全相同。我认为这是因为我的SPARQL语句导致一个人发送和接收过的所有邮件的交叉产品,对吗?

为了使每个人获得统计数据,我需要做些什么?

1 个答案:

答案 0 :(得分:1)

COUNT(?email1)不计算任何内容,因为?email1未定义。此外,如您所述,还有部分交叉产品 - DISTINCT会有所帮助。

尝试(COUNT(DISTINCT ?sent_email) AS ?sent_emails)