3

メールアーカイブデータを含むトリプルストアがあります。それで、私にはたくさんの人( )がメール( )foaf:Personを送信(ex:hasSent)および受信()したとしましょう。ex:hasReceivedex: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ステートメントが、人がこれまでに送受信したすべてのメールの外積になるためだと思いますよね?

個人ごとに統計を正しく取得するには、何をする必要がありますか?

4

1 に答える 1

1

COUNT(?email1)未定義として何もカウントしていません?email1。また、あなたが言及するように部分的な外積があります-DISTINCT助けになります。

試す(COUNT(DISTINCT ?sent_email) AS ?sent_emails)

于 2012-11-15T16:30:52.313 に答える