The challenge

In my triple store, I have a resource type Email. Resources of that Email type have a sender and one or more recipients assigned.

Let the notation "A->B" be defined as "A is the sender of an email for which B is one of the recipients".

Now, I would like to know the following: How many times has person A sent an email to person B? Note that the role of A and B is important, i.e. A->B is different from B->A.

The malformed SPARQL query

In order to answer this question for all available pairings, I wrote this SPARQL (1.1) query:

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

This does not work, AllegroGraph gives me the error MALFORMED QUERY: Line 5, Found ?recipient (of type varname) - line 5 being the SELECT clause. I tried some other variants, altering the SELECT and/or GROUP BY clause, but without success.

I am not sure whether aggregates on more than one resource are allowed. In the SPARQL 1.1 docs and a related SO question (Counting in SPARQL) I only found aggregates based on one resource.

So finally, here is my question: Is it possible to aggregate over sender AND recipient?

有帮助吗?

解决方案

Try replacing (COUNT(?sender ?recipient) AS ?count) with (COUNT(?e) AS ?count).

That should work because you want to count the number of emails (?e) that match your criteria.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top