メールアーカイブデータを含むトリプルストアがあります。それで、私にはたくさんの人( )がメール( )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
もちろん、同じことが機能します。ここで、いくつかの統計と分析を行いたいと思います。つまり、個人が送受信した電子メールの数を判別します。1つの述語に対してのみこれを行うことは、単純な集計です。
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ステートメントが、人がこれまでに送受信したすべてのメールの外積になるためだと思いますよね?
個人ごとに統計を正しく取得するには、何をする必要がありますか?