【发布时间】:2016-04-05 13:12:35
【问题描述】:
因为担心你不了解我的情况,所以我为你做了这个视觉插图(点击图片查看高质量版本)。
我知道一个用户(不管是谁,我们不在乎)喜欢一个项目(i1)。
我们想推荐其他项目:
i1 与i2 相似,取决于特定的标准(因此存在相似值,我们称之为s1)
i1也与i2类似,但取决于另一个标准(所以有相似度值,我们称之为s2)
i1也和i2类似,但是依赖于第三个条件(所以有相似度值,姑且称之为s3)
现在i2 属于两个类别,并且每个类别都会通过特定的权重影响相似度。
我的问题
我想计算i1 和i2 之间的最终相似度,除了特定类的权重之外,我几乎做了所有的事情。
我的问题是这个权重不应该应用于导致选择i2 的标准。换句话说,如果i2 使用 1000 个条件被选择了 1000 次,并且 i2 属于特定类,那么该类的权重将只应用一次,而不是 1000 次,如果 i2 属于两个类,这两个类的两个权重将只应用一次关于有多少标准导致选择i2
现在
为了方便您帮助我,我做了这个查询(好吧,但它必须很长时间才能向您展示这个案例),但我也通过让我的查询只选择所需的信息来方便您所以你可以在它上面添加另一层选择。
prefix : <http://example.org/rs#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?item ?similarityValue ?finalWeight where {
values ?i1 {:i1}
?i1 ?similaryTo ?item .
?similaryTo :hasValue ?similarityValue .
optional{
?item :hasContextValue ?weight .
}
bind (if(bound(?weight), ?weight, 1) as ?finalWeight)
}
所以该查询的结果是(查看项目i2)它重复了 6 次(如预期的那样),具有三个不同的相似性(如预期的那样,因为三个不同的标准),以及 finalWeight,即权重,针对每个标准重复:
终于
这是数据
@prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
:i1 :similaryTo1 :i2 .
:similaryTo1 :hasValue 0.5 .
:i1 :similaryTo2 :i2 .
:similaryTo2 :hasValue 0.6 .
:i1 :similaryTo3 :i2 .
:similaryTo3 :hasValue 0.7 .
:i2 :hasContextValue 0.1 .
:i2 :hasContextValue 0.4 .
:i1 :similaryTo4 :i3 .
:similaryTo4 :hasValue 0.5 .
希望你能帮助我,我真的很感激
所以我想做什么
假设根本没有重量,所以我的查询将是:
prefix : <http://example.org/rs#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?item ?similarityValue where {
values ?i1 {:i1}
?i1 ?similaryTo ?item .
?similaryTo :hasValue ?similarityValue .
}
然后我对具有相似性总和的项目进行聚合,如下所示:
prefix : <http://example.org/rs#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?item (SUM(?similarityValue) as ?sumSimilarities) where {
values ?i1 {:i1}
?i1 ?similaryTo ?item .
?similaryTo :hasValue ?similarityValue .
}
group by ?item
我想要的是将此结果的每一行乘以与?item 相关联的两个权重 的总和,对于 i2 来说是 (0.1 * 0.4),对于 i3 来说是 (1)
请注意,有些项目没有两个权重,有些只有一个,有些什么都没有,并注意即使对于那些有两个的项目,这两个值也可能相同,因此如果在这里使用 distinct 时要小心。
最后,我总是说两个只是作为一个例子,但在现实生活中,这个数字来自动态系统。
更新
在@Joshua Taylor 回答后,我将他的样本数据理解为:
【问题讨论】:
-
这个查询太长了,很难分析。就像评论一样,可能偏离主题:如果您使用属性路径替换不需要中间节点的三重模式的路径,则可以使其更紧凑,例如而不是
?s :p1 ?o1 . ?o1 :p2 ?o2 .你可以写?s :p1/:p2 ?o- 当然只有当你的三重存储支持 SPARQL 1.1 -
@AKSW 我会尝试为您解释查询,正如我在问题中所说,有一些标准可以选择与输入项目相似的项目。查询的前 4 个块只是用于处理这些标准,所以基本上你只留下一个块来广告这个权重(userContextFinalValue)。如果您需要更多描述,我可以告诉您,我确实将代码最小化到最不可能的情况,我可以在其中向您展示情况。
-
@AniaDavid 但是您不需要这样复杂的数据或查询来重现问题。我在this answer 中创建的示例数据不是针对您之前的问题sparql how to group correctly this data 解释了那里的问题吗?这不是差不多的情况吗?
-
我认为在这个问题的部分,我的问题,我认为你实际上已经非常接近描述你正在尝试去做,我想如果你坐下来弄清楚你想要实现的实际数学公式,那么查询会变得简单得多。
-
听起来您可能想要
sumOver(property, propertyWeight * sumOver(similarItem, similarItemSimilarity))之类的东西。我认为,一旦你指定了公式,SPARQL 查询就会直接从中出来。
标签: sparql rdf aggregation semantic-web ontology