的挑战
在我的三重存储中,我有一个资源类型的电子邮件。该电子邮件类型的资源分配了一个发件人和一个或多个收件人。
让符号"A->B"定义为"A是电子邮件的发件人,而B是其中一个收件人"。
现在,我想知道以下内容:A给B发了多少次电子邮件?请注意,A和B的作用很重要,即A->B与B->A不同。
格式错误的SPARQL查询
为了回答所有可用配对的这个问题,我编写了以下SPARQL(1.1)查询:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX email: <http://example.com/schema/for/email/>
SELECT ?sender ?recipient (COUNT(?sender ?recipient) AS ?count)
WHERE {
?sender rdf:type foaf:Person.
?recipient rdf:type foaf:Person.
?e rdf:type email:Email.
?e email:sender ?sender.
?e email:recipient ?recipient.
}
GROUP BY ?sender ?recipient
这不起作用,AllegroGraph给了我错误MALFORMED QUERY: Line 5, Found ?recipient (of type varname)
-第5行是SELECT子句。我尝试了其他一些变体,修改了SELECT和/或GROUP BY子句,但没有成功。
我不确定是否允许对多个资源进行聚合。在SPARQL1.1文档和一个相关的SO问题(在SPARQL中计数)中,我只发现了基于一个资源的聚合。
最后,我的问题是:是否有可能对发送方和接收方进行聚合?
尝试用(COUNT(?e) AS ?count)
替换(COUNT(?sender ?recipient) AS ?count)
。
这应该有效,因为你想计算符合你的标准的电子邮件数量(?e
)。