【问题标题】:Querying property without value with SPARQL in WikiData在 WikiData 中使用 SPARQL 查询没有值的属性
【发布时间】:2019-02-26 21:09:26
【问题描述】:

我有一个包含 1200 个地理实体的列表,例如城市、湖泊或山脉等字符串。我想用授权文件 WikiData ID 来丰富这些实体。这可行,但结果我有时会收到不止一个 WikiDataID 建议。我需要根据声明中的国家/地区的外观来定义正确的。

例如,我尝试了卡尔斯鲁厄市。 对于字符串“Karlsruhe”,我得到三个结果。但我只想要一个特定的 WikiData ID(在本例中为:https://www.wikidata.org/wiki/Q1040),带有德语、英语和法语的标签和 altLabel(也称为)。 作为一个条件,实体应该是一个国家的一部分。 这可以通过属性 P17​​ 或值 Q6256 来定义。

有没有办法只查询没有查询助手过滤器中的值的属性?

非常感谢您的帮助!

这里是查询:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
prefix schema: <http://schema.org/>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>

SELECT DISTINCT ?country ?item ?itemLabel ?altLabel ?label_en ? 
label_de ?label_fr 
WHERE {
 ?item rdfs:label "Karlsruhe"@de.
 ?item skos:altLabel ?altLabel.
?item rdfs:label ?label_en.
 ?item rdfs:label ?label_de.
 ?item rdfs:label ?label_fr.
FILTER(LANGMATCHES(LANG(?altLabel), "de"))
 FILTER((LANG(?label_en)) = "en")
FILTER((LANG(?label_de)) = "de")
FILTER((LANG(?label_fr)) = "fr")
SERVICE wikibase:label { bd:serviceParam wikibase:language " 
[AUTO_LANGUAGE],de, en, fr". }
} 

【问题讨论】:

    标签: sparql wikidata


    【解决方案1】:

    作为一个条件,实体应该是一个国家的一部分。这可以通过属性 P17​​ 或值 Q6256 定义。有没有办法只查询没有查询助手过滤器中的值的属性?

    如果我理解正确,您是在询问是否可以修改查询,以便仅在项目附有 some 国家/地区(我们不在乎哪个国家/地区)时才返回结果。如果是这种情况,您只需将以下图形模式添加到您的查询中:

    ?item wdt:P17 ?country .
    

    甚至:

    ?item wdt:P17 [] .
    

    [] 是一个空白节点,在 SPARQL 中表示一个匿名变量,即我们不感兴趣的值的变量占位符)。

    【讨论】:

    • 这是 OP 要求的。有趣的是,仅仅有一个独特的结果也是不够的。
    • @rickhg12hs 是的,我注意到了。我确信通过添加更多约束可以进一步区分,但在不了解更多关于 OP 用例的情况下,我无法说出这些约束应该是什么。
    • 这并不奇怪。尤其是地理实体以不同的粒度存在。城市、地区、州等 - 根据模型,所有这些都可以分配到一个国家/地区。
    【解决方案2】:

    此查询适用于我的目的:

        PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
        PREFIX schema: <http://schema.org/>
        PREFIX wikibase: <http://wikiba.se/ontology#>
        PREFIX wd: <http://www.wikidata.org/entity/>
        PREFIX wdt: <http://www.wikidata.org/prop/direct/>
    
        SELECT DISTINCT  * 
    
        WHERE {
          ?item rdfs:label "Karlsruhe"@de.   
    
          ?item rdfs:label ?label_de.
          FILTER((LANG(?label_de)) = "de").
    
          SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE], de, en, fr". }
    
            bind(if(exists{?item wdt:P17 []}, "yes", "no") as ?country_)
    
          optional {
    
              ?item rdfs:label ?label_en.     
              FILTER((LANG(?label_en)) = "en").      
              ?item rdfs:label ?label_fr.  
              FILTER((LANG(?label_fr)) = "fr").
    
            ?item skos:altLabel ?altLabel_de.
            FILTER(LANGMATCHES(LANG(?altLabel_de), "de"))
    
            optional {
            ?item skos:altLabel ?altLabel_en.
            FILTER(LANGMATCHES(LANG(?altLabel_en), "en"))
              }
    
            optional {
            ?item skos:altLabel ?altLabel_fr.
            FILTER(LANGMATCHES(LANG(?altLabel_fr), "fr"))
              }
          }  
        } 
        order by ?item
    

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多