2015-06-10 138 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分钟后,我的挫败感...无论如何,删除它。 –