2015-06-10 137 views
0

我有在電影中找到類似品味的查詢。這樣用戶在同一類型的平均排名之差的絕對值小於1:優化SPARQL查詢

SELECT ?p ?p1 ?genre 
WHERE{ 
?p movies:hasRated ?rate. 
?p1 foaf:knows ?p. 
?rate movies:ratedMovie ?mov. 
?rate movies:hasRating ?rating. 
?mov movies:hasGenre ?genre. 
?p1 movies:hasRated ?ratep1. 
?ratep1 movies:ratedMovie ?movp1. 
?ratep1 movies:hasRating ?ratingp1. 
?movp1 movies:hasGenre ?genre. 
FILTER (?p=movies:user1) 
} 
GROUP BY ?p ?p1 ?genre 
HAVING (abs (AVG(?rating)-AVG(?ratingp1))<1.0) 

我想問一下,是否可以優化呢?因爲它看起來那麼糟糕(

這裏是數據集,它將被使用的部分:

movies:Man_of_steel movies:hasGenre "action", "thriller" . 

movies:Elysium movies:hasGenre "drama", "sci-fi" . 

movies:Gravity movies:hasGenre "sci-fi", "drama" . 

movies:Django_Unchained movies:hasGenre "thriller", "action" . 

movies:user1 movies:hasGender "male" ; 
      movies:hasAge "30"^^xsd:float ; 
      movies:hasRated movies:Rating1, movies:Rating2 . 

movies:Rating1 movies:ratedMovie movies:Gravity ; 
       movies:hasRating "4.0"^^xsd:float . 

movies:Rating2 movies:ratedMovie movies:Django_Unchained ; 
       movies:hasRating "9.0"^^xsd:float . 

movies:user2 movies:hasGender "female" ; 
      movies:hasAge "27"^^xsd:float ; 
      movies:hasRated movies:Rating3, movies:Rating4 ; 
      foaf:knows movies:user1 . 

movies:Rating3 movies:ratedMovie movies:Elysium ; 
       movies:hasRating "3.0"^^xsd:float . 

movies:Rating4 movies:ratedMovie movies:Gravity ; 
       movies:hasRating "5.0"^^xsd:float . 
+1

你是指「優化」它是什麼意思?它運行速度是否太慢?還是你想更好地格式化它? –

+1

「看起來很糟糕」是優化查詢的一個奇怪原因,你擔心它看起來像什麼嗎?通常,優化查詢是爲了獲得最佳執行性能,但有時您可以重寫查詢以提高可讀性。那麼你在這之後會有什麼結果? –

+0

我真的很擔心它是怎麼樣的。也許有更好的解決方案,而不是我的查詢。 – nlimits

回答

3

一輕微的選擇約書亞的詢問應該在你的芝麻數據庫的工作(這是包含在物業通路評估錯誤的舊版本):

SELECT ?p ?p1 ?genre WHERE { 

    ?p movies:hasRated [ movies:ratedMovie [ movies:hasGenre ?genre ]; 
         movies:hasRating ?rating ]. 

    ?p1 foaf:knows ?p ; 
     movies:hasRated [ movies:ratedMovie [ movies:hasGenre ?genre ]; 
         movies:hasRating ?ratingp1 ]. 
    FILTER (?p = movies:user1) 
} 
GROUP BY ?p ?p1 ?genre 
HAVING (abs (AVG(?rating)-AVG(?ratingp1))<1.0) 

正如你看到的,類似約書亞的查詢,但在這裏我們不使用屬性路徑,但使用進一步空白節點,也不要使用values子句(它在2.7.8中也有bug)。

我真的會推薦你更新你的芝麻數據庫 - 2.7.8在2013年發佈,我們已經修復了大量的bug(更不用說顯着改進了工作臺中的查詢編輯器 - 現在它已經漂亮的顏色和自動完成功能)。

3

II沒有看到您的查詢的優化處理不好,但既然你提到它看起來不好,我希望你問格式這是確定的,因爲它是現在,但你可以刪除一些變量,並使用空白節點和財產的路徑,而不是如:。

SELECT ?p ?p1 ?genre WHERE { 
    values ?p { movies:user1 } 

    ?p movies:hasRated [ movies:ratedMovie/movies:hasGenre ?genre ; 
         movies:hasRating ?rating ]. 

    ?p1 foaf:knows ?p ; 
     movies:hasRated [ movies:ratedMovie/movies:hasGenre ?genre ; 
         movies:hasRating ?ratingp1 ]. 
} 
GROUP BY ?p ?p1 ?genre 
HAVING (abs (AVG(?rating)-AVG(?ratingp1))<1.0) 
+0

哦FFS約書亞,睡一會兒吧? :) –

+0

@JeenBroekstra這是非常多的[我發佈到nlimit的上一個問題的答案](http://stackoverflow.com/a/30762389/1281433);我不確定爲什麼nlimit不會採用這種方式。但是我認爲我們彼此應該相互贊成,產生了幾乎相同的答案。 :)但我更喜歡在**過濾器**之上的**值**,以防某些未優化的查詢引擎更好地處理**值**。 –

+0

不用擔心,很好的答案,upvoted,我剛剛寫了一個非常相同的答案,寫了你的約1分鐘後,我的挫敗感...無論如何,刪除它。 –