维基数据 SPARQL 查询限定符值

bfr*_*itz 2 sparql wikidata

对于熟悉 SPARQL 的人(我不是)来说,这应该相当容易。我试图在此查询中返回“score_by”的限定符/属性值,但它显示为空白:

SELECT ?item ?itemLabel ?IMDb_ID ?_review_score ?_score_by WHERE {
    ?item wdt:P345 "tt3315342".
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    OPTIONAL { ?item wdt:P345 ?IMDb_ID. }
    OPTIONAL { ?item wdt:P444 ?_review_score. }
    OPTIONAL { ?item ps:P447 ?_score_by. }
}
Run Code Online (Sandbox Code Playgroud)

这是此查询的链接

use*_*512 5

“得分”是一件棘手的事情,因为它有资格得分。

分数是复杂的东西:它们不仅仅是一个值,而是由得分手(烂番茄、IMDB 等)限定的。如果您的查询有效,答案将具有误导性,因为不清楚是否?_review_score对应于?_score_by,即评论分数是否对应于评论。

(您可能会问为什么 P444 - score - 存在,因为没有审阅者,信息是不完整的。这是一个公平的问题。实际属性是wdt:P444wikidata 直接属性。这意味着该属性是作为快捷方式创建的为了方便,以丢失一些上下文为代价。它们就像数据库视图。)

他们实际工作的方式是将复杂的评论分数“具体化”为一个东西,一个对象“评论”,然后将信息 - 分数、评论者等 - 挂在上面。

例如:

select * where {
    wd:Q24053263 p:P444 ?review . # Get reviews for wolverine
    ?review ?p ?o                 # Get all info from the review
}
Run Code Online (Sandbox Code Playgroud)

关联

您可以在此处看到分数在 下方p:statement/P444,并且有一个“限定符” p:qualifier/P447,即审阅者。

基本上维基数据中的属性可以以多种形式出现,以前缀编码。

回答你的问题:

OPTIONAL { ?item wdt:P444 ?_review_score. }
OPTIONAL { ?item ps:P447 ?_score_by. }
Run Code Online (Sandbox Code Playgroud)

应该

OPTIONAL { 
    ?item p:P444 ?review . 
    ?review pq:P447 ?_score_by ; ps:P444 ?_review_score
}
Run Code Online (Sandbox Code Playgroud)

关联

ie 把review 当作一个单一的东西,然后从中得到分数和对应的reviewer。

(如果您担心可能会有没有评论者的分数,您可以在其中添加另一个选项)

  • 我确实提到了“奇怪地集成”的东西:-) 这是 Blazegraph 添加的存储过程中被黑的东西。您可以通过将 `?_score_by rdfs:label ?review_name filter (lang(?review_name) = 'en')` 添加到可选中来完成相同的工作。这会为审阅者找到英文标签。 (2认同)