优化SPARQL查询

优化SPARQL查询,sparql,Sparql,我有一个疑问,在电影中也能找到相似的口味。这样,同一类型用户平均排名之间的差异绝对值小于1: 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 mo

我有一个疑问,在电影中也能找到相似的口味。这样,同一类型用户平均排名之间的差异绝对值小于1:

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)

我看不出你的查询优化得特别差,但既然你提到它看起来很糟糕,我想你是在问格式化问题。现在还可以,但您可以删除一些变量,改用空白节点和属性路径。例如:

选择?p?p1?类型,其中{
值?p{movies:user1}
?p电影:hasRated[电影:ratedMovie/电影:hasgree?流派;
电影:hasRating?rating]。
p1 foaf:knows?p;
电影:hasRated[电影:ratedMovie/电影:hasgree?流派;
电影:hasRating?ratingp1]。
}
按p?p1?类型分组

有(abs(AVG(?rating)-AVG(?ratingp1))我看不出你的查询优化得特别差,但既然你提到它看起来很糟糕,我想你是在问格式化的问题。现在没问题,但你可以删除一些变量,改用空白节点和属性路径。例如:

选择?p?p1?类型,其中{
值?p{movies:user1}
?p电影:hasRated[电影:ratedMovie/电影:hasgree?流派;
电影:hasRating?rating]。
p1 foaf:knows?p;
电影:hasRated[电影:ratedMovie/电影:hasgree?流派;
电影:hasRating?ratingp1]。
}
按p?p1?类型分组

(abs(AVG(?rating)-AVG(?ratingp1))是Joshua查询的一个轻微替代,该查询应适用于您的Sesame数据库(这是一个旧版本,在属性路径评估中包含错误):

选择?p?p1?类型,其中{
?p电影:hasRated[电影:ratedMovie[电影:hasgree?流派];
电影:hasRating?rating]。
p1 foaf:knows?p;
电影:hasRated[电影:ratedMovie[电影:hasgree?流派];
电影:hasRating?ratingp1]。
过滤器(?p=movies:user1)
}
按p?p1?类型分组

(abs(AVG(?rating)-AVG(?ratingp1))是Joshua查询的一个轻微替代,该查询应适用于您的Sesame数据库(这是一个旧版本,在属性路径评估中包含错误):

选择?p?p1?类型,其中{
?p电影:hasRated[电影:ratedMovie[电影:hasgree?流派];
电影:hasRating?rating]。
p1 foaf:knows?p;
电影:hasRated[电影:ratedMovie[电影:hasgree?流派];
电影:hasRating?ratingp1]。
过滤器(?p=movies:user1)
}
按p?p1?类型分组

拥有(abs(AVG(?rating)-AVG(?ratingp1))你所说的“优化”它是什么意思?它运行得太慢了吗?还是你正试图把它格式化得更漂亮?“它看起来很糟糕”优化查询是一个奇怪的原因,您是否担心它的外观?通常优化查询是为了获得最佳执行性能,尽管有时您当然可以重写查询以获得更好的可读性。那么您希望得到什么结果呢?我实际上担心它的外观。可能有一个更好的解决方案,而不是我的查询。你所说的“优化”是什么意思?它运行得太慢了吗?还是你想把它格式化得更精细些?“它看起来太糟糕了”优化查询是一个奇怪的原因,您是否担心它的外观?通常优化查询是为了获得最佳执行性能,尽管有时您当然可以重写查询以获得更好的可读性。那么您希望得到什么结果呢?我实际上担心它的外观。可能有更好的解决办法,而不是我的问题。噢,约书亚,睡一觉好吗?:@JeenBroekstra这几乎是;我真的不确定nlimit为什么不采纳这一点。但我认为我们应该相互投票,因为我们得出了几乎相同的答案但我确实更喜欢值而不是过滤器,以防一些未优化的查询引擎更好地处理值。不用担心,答案很好,投票率较高,我只是在你写完你的答案后大约1分钟写一个几乎相同的答案时发泄了我的沮丧……无论如何,删除它。@nlimits“建议的解决方案不起作用”两个问题:1)那么,你为什么把答案标记为已接受?2)什么是不可行的?可能出现的模输入错误,与问题中的查询相同,您说该查询有效。@n顺便说一句,我不知道您是否意识到限制,但您正在公共论坛上发布指向数据库的未受保护接口的链接。这不仅仅是读访问——任何人都可以进入并删除你的数据库和/或向其中添加数据。噢,约书亚,睡一觉好吗?:)@JeenBroekstra这几乎是;我真的不知道nlimit为什么不采纳这一点。但我认为我们应该相互投票,因为我们得出了几乎相同的答案但我确实更喜欢值而不是过滤器,以防一些未优化的查询引擎更好地处理值。不用担心,答案很好,投票率较高,我只是在你写完你的答案后大约1分钟写一个几乎相同的答案时发泄了我的沮丧。。。无论如何,请将其删除。@nlimits“建议的解决方案不起作用”两个问题:1)为什么您将答案标记为已接受?2) 什么不起作用?可能出现的模输入错误,与问题中的查询相同,您说该查询有效。@n顺便说一句,我不知道您是否意识到限制,但您正在公共论坛上发布指向数据库的未受保护接口的链接。而且这不仅仅是读访问——任何人都可以进入并删除您的数据库和/或向其中添加数据。
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 .
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)