Aggregate functions SPARQL中的多聚合

Aggregate functions SPARQL中的多聚合,aggregate-functions,sparql,Aggregate Functions,Sparql,我有一个包含邮件存档数据的三重存储。假设我有很多人(foaf:Person)已经发送(ex:hasent)和接收(ex:hasereceived)电子邮件(ex:Email) 例如: SELECT ?person ?email WHERE { ?email rdf:type ex:Email. ?person rdf:type foaf:Person; ex:hasSent ?email. } 当然,这同样适用于ex:hasreived。现在我

我有一个包含邮件存档数据的三重存储。假设我有很多人(
foaf:Person
)已经发送(
ex:hasent
)和接收(
ex:hasereceived
)电子邮件(
ex:Email

例如:

SELECT ?person ?email
WHERE {
    ?email  rdf:type   ex:Email.
    ?person rdf:type   foaf:Person;
            ex:hasSent ?email.
}
当然,这同样适用于
ex:hasreived
。现在我想做一些统计和分析,即确定一个人发送和接收了多少封电子邮件。仅对一个谓词执行此操作是一个简单的聚合:

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语句导致一个人发送和接收的所有邮件的叉积,对吗

要在每个人的基础上获得正确的统计数据,我需要做什么?

COUNT(?email1)
不计算任何内容,因为
?email1
未定义。此外,正如您所提到的,还有部分交叉积-
DISTINCT
将有所帮助


尝试
(将(不同的?已发送的\u电子邮件)计数为?已发送的\u电子邮件)

您是对的,
?电子邮件1
已解除绑定。我对这个问题进行了润色,但没有完全润色。