是否可以在SPARQL中聚合两个资源?

时间:2012-09-07 22:01:26

标签: sparql aggregation allegrograph

挑战

在我的三重商店中,我有一个资源类型电子邮件。该电子邮件类型的资源具有发件人和分配的一个或多个收件人。

让符号" 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子句,但没有成功。

我不确定是否允许在多个资源上进行聚合。在SPARQL 1.1 docs和相关的SO问题(Counting in SPARQL)中,我只根据一种资源找到了聚合。

最后,这是我的问题:是否可以聚合发件人和收件人?

1 个答案:

答案 0 :(得分:4)

尝试将(COUNT(?sender ?recipient) AS ?count)替换为(COUNT(?e) AS ?count)

这应该有效,因为您想要计算符合条件的电子邮件数量(?e)。