2011-09-19 62 views
1

在我的應用程序中,我使用的是SPARQL數據庫是Jena的SDB,而數據庫服務器是DB2。但我發現SPARQL的查詢性能非常低。如何提高SDB的SPARQL查詢性能?

誰能幫我解決這個問題?如何提高sparql查詢性能,特別是SDB的查詢性能?

下面是我的測試用例數據和SPARQL:

測試用例

總RDF三元計數13294.查詢結果三重計數是420 查詢花費42秒。

的SPARQL是

SELECT DISTINCT ?s ?name ?ownerId ?status ?time 
    ?value ?startTime ?endTime ?description 
WHERE 
{ 
    ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "http://www.w3c.com/schemas/cp#Event" . 
    ?s <http://www.w3c.com/schemas/cp#time> ?time . 
    ?s <http://www.w3c.com/schemas/cp#ownerId> ?ownerId . 
    ?s <http://www.w3c.com/schemas/cp#name> ?name . 
    ?s <http://www.w3c.com/schemas/cp#value> ?value . 
    ?s <http://www.w3c.com/schemas/cp#_status> ?status . 
    ?s <http://www.w3c.com/schemas/cp#start_Time> ?startTime . 
    ?s <http://www.w3c.com/schemas/cp#end_Time> ?endTime . 
    ?s <http://www.w3c.com/schemas/cp#description> ?description . 
    FILTER(xsd:dateTime(?time) >= "2011-08-12T00:00:00"^^xsd:dateTime 
    && xsd:dateTime(?time) <= "2011-09-18T23:59:59"^^xsd:dateTime) 
} 

回答

3

任何Triplestore像SDB的查詢性能總是會比本地triplestore更糟,因爲像SDB的SQL支持triplestore有向下編譯SPARQL成SQL經常會創建非常複雜的SQL查詢。

因此,考慮你的例子,你已經要求9個三元模式進行匹配,這將產生一個SQL SELECT包含9 INNER JOIN的操作,這將需要大量的時間來開始。

然後,您正在對這些三元模式應用FILTER,您遇到的問題是,除非過濾器表達式非常簡單或足夠接近要轉換爲的SQL,否則FILTER必須在Java代碼中進行評估記憶。這在實踐中意味着你要在三重存儲中選擇我們所有可能的事件,然後使用Java過濾日期範圍內存,這總是會讓你的查詢變慢。

除非有特定的理由,你想使用SDB我真的建議看看耶拿的本地三聯商店TDB。它旨在以更高效的方式執行SPARQL查詢所需的聯接類型,並且存儲數據的方式使其能夠像日期範圍一樣更快地完成更復雜的過濾。

+0

忘了補充一點,它可能總是值得在[email protected]郵件列表上尋求幫助 – RobV

+0

絕對正確 - 在過濾之前返回的數據可能會得到相當大的比例如果時區正常化,則可以嘗試簡單的字符串比較('str(?time)> =「2011-08-12T00:00:00」')。 – user205512

+0

@ use205512好主意,雖然不知道是否使它成爲一個過濾器,但SDB會下載到SQL,雖然我希望它可以 – RobV