我有一个包含邮件存档数据的三重存储。因此,假设我有很多人 ( 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 语句导致一个人曾经发送和接收的所有邮件的交叉产品,对吗?
为了在每个人的基础上获得正确的统计数据,我需要做什么?