2012-11-23 57 views
4

我正嘗試使用SPARQL從三重存儲中生成一些用戶統計信息。請參閱下面的查詢。這怎麼能改進?我在這裏做什麼壞事?爲什麼這消耗這麼多的記憶? (請參閱本文結尾處的背景故事)具有多個聚合的SPARQL查詢超出內存限制

我更喜歡在三重商店內進行聚合和連接。拆分查詢意味着我必須在數據庫之外「手動」加入結果,從而失去了三重商店的效率和優化。沒有理由不需要重新發明輪子。

查詢

SELECT 
    ?person 
    (COUNT(DISTINCT ?sent_email) AS ?sent_emails) 
    (COUNT(DISTINCT ?received_email) AS ?received_emails) 
    (COUNT(DISTINCT ?receivedInCC_email) AS ?receivedInCC_emails) 
    (COUNT(DISTINCT ?revision) AS ?commits) 

WHERE { 
    ?person rdf:type foaf:Person. 

    OPTIONAL { 
    ?sent_email rdf:type email:Email. 
    ?sent_email email:sender ?person. 
    } 

    OPTIONAL { 
    ?received_email rdf:type email:Email. 
    ?received_email email:recipient ?person. 
    } 

    OPTIONAL { 
    ?receivedInCC_email rdf:type email:Email. 
    ?receivedInCC_email email:ccRecipient ?person. 
    } 

    OPTIONAL { 
    ?revision rdf:type vcs:VcsRevision. 
    ?revision vcs:committedBy ?person. 
    } 
} 
GROUP BY ?person 
ORDER BY DESC(?commits) 

背景

的問題是,我得到的錯誤 「已達到QUERY內存限制」 在AllegroGraph(請參閱我的相關SO question)。由於存儲庫只包含大約200k的三元組,容易放入ca的(ntriples)輸入文件中。 60 MB,我想知道如何執行查詢結果需要超過4 GB的RAM,大約高兩個數量級。

+0

鑑於代碼已經崩潰的合理大小的輸入,這不符合「工作代碼」。我將它移至Stack Overflow,我認爲這更合適。 – sepp2k

+0

可能重複[是否有可能在SPARQL中聚合兩個資源?](http://stackoverflow.com/questions/12325974/is-it-possible-to-aggregate-over-two-resources-in-sparql) –

回答

0

嘗試拆分計算子查詢,例如:

SELECT 
    ?person 
    (MAX(?sent_emails_) AS ?sent_emails_) 
    (MAX(?received_emails_ AS ?received_emails_) 
    (MAX(?receivedInCC_emails_ AS ?receivedInCC_emails_) 
    (MAX(?commits_) AS ?commits) 
WHERE { 
    { 
    SELECT 
      ?person 
      (COUNT(DISTINCT ?sent_email) AS ?sent_emails_) 
      (0 AS ?received_emails_) 
      (0 AS ?commits_) 
    WHERE { 
    ?sent_email rdf:type email:Email. 
    ?sent_email email:sender ?person. 
    ?person rdf:type foaf:Person. 
    } GROUP BY ?person 
    } union { 
    (similar pattern for the others) 
    .... 
    } 
} 
GROUP BY ?person 
ORDER BY DESC(?commits) 

目標是:

  • 避免行的需要是結果集數量龐大的一代進行聚合處理
  • 避免使用可選的{}模式,這也會影響性能
+0

呃,沒有注意到這是相當古老的問題... – enridaga

+0

沒有什麼問題。根據資料,提問者在兩個小時前就在這裏,所以他很可能會看到答案並很快得到通知。 –

+0

那時候,我想我終於結束了這樣的解決方案。 – cyroxx