【发布时间】:2019-02-23 12:58:25
【问题描述】:
更新:这个问题通过1 链接到另一个问题,因为它的输出数据大致相同。
我有一个包含 1200 个地理实体的列表,例如城市、湖泊或山脉等字符串。我想用授权文件 WikiData ID 来丰富这些实体。这可行,但结果我有时会收到不止一个 WikiDataID 建议。我需要通过声明中的任何国家(无论哪个国家)的出现来定义正确的一个约束。
例如,我尝试了卡尔斯鲁厄市。对于字符串“Karlsruhe”,我得到五个结果。在这种情况下,我选择 ID Q1040 (https://www.wikidata.org/wiki/Q1040)。 现在我遇到了一个问题,我不知道如何查询 altLabel(也称为)和英文、德文和法文的标签。 使用当前代码,尽管有 altLabel 和 Labels,但我得到了 altLabel 和 Labels 的空条目(参见 WikiData)。 我想我只是使用了错误的代码行顺序。 有人可以帮我确定正确的顺序吗?
非常感谢您的帮助!
这里是查询:
SELECT DISTINCT ?item ?itemLabel ?altLabel ?label_en ?label_de ?
label_fr WHERE {
?item rdfs:label "Karlsruhe"@de.
?item wdt:P17 [] .
optional {
?item skos:altLabel ?altLabel.
?item rdfs:label ?label_de FILTER((LANG(?label_de)) = "de") .
?item rdfs:label ?label_en FILTER((LANG(?label_en)) = "en") .
?item rdfs:label ?label_fr FILTER((LANG(?label_fr)) = "fr") .
FILTER(LANGMATCHES(LANG(?altLabel), ?item))
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "
[AUTO_LANGUAGE],de, en, fr". }
}
【问题讨论】:
-
这个过滤器很奇怪:
FILTER(LANGMATCHES(LANG(?altLabel), ?item))没有给出语言,但无论出于何种原因,item变量。如果你使用 LANGMATCHES 函数,例如英文应该是FILTER(LANGMATCHES(LANG(?altLabel), "en"))。 -
而且您还稍微滥用了 OPTIONAL 模式。例如,如果没有德语标签,则整个 OPTIONAL 子句将为空。正确的用法是
optional { ?item skos:altLabel ?altLabel. FILTER(LANGMATCHES(LANG(?altLabel), "en")) } optional {?item rdfs:label ?label_de FILTER((LANG(?label_de)) = "de") } optional { ?item rdfs:label ?label_en FILTER((LANG(?label_en)) = "en") } optional { ?item rdfs:label ?label_fr FILTER((LANG(?label_fr)) = "fr") } -
但是,如您所见,替代标签 not 可用于英文。您也可以在卡尔斯鲁厄的网页上看到这一点。只有德语和法语才有这样的别名。
-
这看起来非常像家庭作业......就像它的克隆一样,stackoverflow.com/questions/54835069/…