gpt4 book ai didi

aggregate-functions - SPARQL 中的多个聚合

转载 作者:行者123 更新时间:2023-12-02 03:54:08 27 4
gpt4 key购买 nike

我有一个包含邮件存档数据的三重存储。假设我有很多人 (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 语句导致一个人发送和接收的所有邮件的叉积,对吧?

我需要做什么才能获得正确的个人统计数据?

最佳答案

COUNT(?email1) 没有计算任何内容,因为 ?email1 未定义。此外,正如您提到的那样,存在部 fork 积 - DISTINCT 会有所帮助。

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

关于aggregate-functions - SPARQL 中的多个聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13400576/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com