2016-04-05 29 views
0

以下查詢從我的數據集(合同位於組織和合作夥伴之間)加載合同。優化SPARQL查詢以加載SAMPLE標籤

SELECT ?contract ?organisation ?partner 
WHERE { 
    ?organisation 
     a gr:BusinessEntity ; 
     rejstriky:contract ?contract . 

    ?contract a rejstriky:Contract ; 
     rejstriky:partner ?partner . 
} 
GROUP BY ?contract ?organisation ?partner 

此查詢返回大約8000個合同,並立即執行此操作(只需要幾分之一秒)。現在我需要爲組織和合作夥伴加載標籤/名稱。可能有多個名字,我只需要一個。這是我的查詢:

SELECT ?contract ?organisation ?partner 
    (SAMPLE(?organisationNames) AS ?organisationName) 
    (SAMPLE(?partnerNames) AS ?partnerName) 
WHERE { 
    ?organisation 
     a gr:BusinessEntity ; 
     rejstriky:contract ?contract . 

    ?contract a rejstriky:Contract ; 
     rejstriky:partner ?partner . 

    ?organisation gr:legalName ?organisationNames . 
    ?partner gr:legalName ?partnerNames . 
} 
GROUP BY ?contract ?organisation ?partner 

這個查詢突然需要幾分鐘才能完成

我做了一些實驗,發現如果我決定使用單獨的SPARQL調用(通過單個批處理中的40個名稱)獲得所有名稱,則需要不到2分鐘(這將顯着更快) 。不管如何,如果我能夠在幾分之一秒內生成這8000個項目,爲每個項目加載兩個標籤不應該花費那麼長時間。

你有什麼想法如何優化我的查詢?請注意,我正在使用Virtuoso。

+0

這看起來像Virtuoso的查詢計劃器中的一個小問題 - 沒有明顯的原因需要這麼長時間。您是否嘗試過直接報告問題並查看他們是否有解決方案? –

+1

第一次猜測是Virtuoso中的查詢優化錯誤。您是否在沒有SAMPLE聚合的情況下測試了速度?也就是說,將'SELECT'列表更改爲'?contract?organization?partner?organisationNames?partnerNames'?你也可以將它提交給[Virtuoso用戶郵件列表](https://lists.sourceforge.net/lists/listinfo/virtuoso-users/)或[OpenLink支持論壇](http://boards.openlinksw.com /support/index.php)哪些受衆包括Virtuoso開發團隊的幾個成員... – TallTed

+0

我發現數據集有輕微損壞。大約1000個合作伙伴由一個URI代表,然而其中有1000個不同的法定名稱。如果我刪除聚合,它實際上運行速度快了3倍,但它產生了4100萬個條目。也許這就是搞亂SAMPLE聚合並放慢查詢速度的原因。不過,我仍然會說,爲8000個項目選擇一個樣本值應該相當快,無論我選擇的集合的大小如何。你怎麼看? – tobik

回答

0

無法訪問示例數據或Virtuoso,很難確定這是否有用,但您可以嘗試避免使用SAMPLE。

SELECT ?contract ?organisation ?organisationName ?partner ?partnerName 

WHERE { 
    ?organisation 
     a gr:BusinessEntity ; 
     rejstriky:contract ?contract . 

    ?contract a rejstriky:Contract ; 
     rejstriky:partner ?partner . 

    { SELECT ?organisationName WHERE { ?organisation gr:legalName ?organisationName . } LIMIT 1} 
    { SELECT ?partnerName WEHRE {?partner gr:legalName ?partnerName . } LIMIT 1} 
} 
GROUP BY ?contract ?organisation ?organisationName ?partner ?partnerName 
+0

謝謝,好主意。但查詢花了將近一個小時才完成,然後返回空名稱的結果。 – tobik