Sparql 查询Wikidata中是否存在名称的最简单方法?

Sparql 查询Wikidata中是否存在名称的最简单方法?,sparql,wikidata,Sparql,Wikidata,我正在尝试创建最简单的查询来检查Wikidata中是否存在名称。例如,我只是想看看Wikidata中是否有一个共同的名字“Jack Smith” 按照中的示例查询,我创建了以下SPARQL查询(): 选择不同的?项目?项目标签?项目描述,其中{ ?项目?标签“Jack Smith”。 ?文章模式:关于?项目。 ?文章模式:语言“en”。 ?文章模式:isPartOf。 服务wikibase:标签{bd:serviceParam wikibase:语言“en”。} }限制10 但是,它返回零结果

我正在尝试创建最简单的查询来检查Wikidata中是否存在名称。例如,我只是想看看Wikidata中是否有一个共同的名字“Jack Smith”

按照中的示例查询,我创建了以下SPARQL查询():

选择不同的?项目?项目标签?项目描述,其中{
?项目?标签“Jack Smith”。
?文章模式:关于?项目。
?文章模式:语言“en”。
?文章模式:isPartOf。
服务wikibase:标签{bd:serviceParam wikibase:语言“en”。}
}限制10
但是,它返回零结果

另一方面,如果我通过维基数据搜索网页搜索“杰克·史密斯”,我会找到很多叫“杰克·史密斯”的人

SPARQL接口的行为不一致。当我运行SPARQL搜索“亚伯拉罕·林肯”(Abraham Lincoln)()时,我正确地找到了美国总统的名字

我的具体问题是:

  • 为什么我的SPARQL查询为“Jack Smith”返回零结果
  • 检查Wikidata中是否存在姓名(如Jack Smith)的最简单API调用是什么?它可以是SPARQL或其他RESTAPI

  • 谢谢。

    查询返回的结果为零,因为没有Jack Smith的英文文章,而且是Wikipedia.org的一部分

    SPARQL查询主体中的每一行都是限制搜索的一种方式,而不仅仅是添加新变量的方式

    看看这个查询:

    SELECT ?person ?dateOfDeath
    WHERE {
    ?person a :Person .
    ?person :date_of_death ?dateOfDeath .
    }
    
    这将只返回有死亡日期的人,即已死亡的人,以及日期。 如果您想要返回人员,或者选择返回他们的死亡日期,即如果他们仍然活着,您不想要日期,但您确实想要此人,请使用以下命令:

    SELECT ?person ?dateOfDeath
    WHERE {
        ?person a :Person .
       OPTIONAL {?person :date_of_death ?dateOfDeath }
        }
    
    关于你的第二个问题,我想试试这样:

    SELECT ?boolean
    WHERE{
    BIND(EXISTS{?item ?label "Jack Smith"} AS ?boolean)
      }
    
    当然,这也可以作为(比如)cURL请求发出:

    curl https://query.wikidata.org/bigdata/namespace/wdq/sparql -X POST --data 'query=SELECT%20%3Fboolean%0AWHERE%7B%0ABIND%28EXISTS%7B%3Fitem%20%3Flabel%20%22Jack%20Smith%22%7D%20AS%20%3Fboolean%29%0A%20%20%7D'
    

    查询返回的结果为零,因为没有Jack Smith,因为有一篇英文文章是关于他的,并且是Wikipedia.org的一部分

    SPARQL查询主体中的每一行都是限制搜索的一种方式,而不仅仅是添加新变量的方式

    看看这个查询:

    SELECT ?person ?dateOfDeath
    WHERE {
    ?person a :Person .
    ?person :date_of_death ?dateOfDeath .
    }
    
    这将只返回有死亡日期的人,即已死亡的人,以及日期。 如果您想要返回人员,或者选择返回他们的死亡日期,即如果他们仍然活着,您不想要日期,但您确实想要此人,请使用以下命令:

    SELECT ?person ?dateOfDeath
    WHERE {
        ?person a :Person .
       OPTIONAL {?person :date_of_death ?dateOfDeath }
        }
    
    关于你的第二个问题,我想试试这样:

    SELECT ?boolean
    WHERE{
    BIND(EXISTS{?item ?label "Jack Smith"} AS ?boolean)
      }
    
    当然,这也可以作为(比如)cURL请求发出:

    curl https://query.wikidata.org/bigdata/namespace/wdq/sparql -X POST --data 'query=SELECT%20%3Fboolean%0AWHERE%7B%0ABIND%28EXISTS%7B%3Fitem%20%3Flabel%20%22Jack%20Smith%22%7D%20AS%20%3Fboolean%29%0A%20%20%7D'
    

    您不应该使用像
    rdfs:label
    这样的特定属性来检查是否存在同名的人吗?文本往往有一个语言标签:
    SELECT distinct?item?itemlab?itemsdescription其中{item rdfs:label | foaf:name | skos:altLabel“Jack Smith”@en.?文章模式:about?item.?文章模式:inLanguage“en”?文章模式:isPartOf.SERVICE wikibase:label{bd:serviceParam wikibase:language“en”}限制10
    或者如果你只是想知道是否有这样一个条目也有维基百科页面:
    问哪里{?item rdfs:label | foaf:name | skos:altLabel“Jack Smith”@en.?文章模式:about?item.?文章模式:inLanguage“en”?文章模式:isPartOf.}
    或者只是
    问一下{?item rdfs:label | foaf:name | skos:altLabel“Jack Smith”@en.}
    您不应该使用像
    rdfs:label
    这样的特定属性来检查是否存在这样一个名字的人吗?而文本往往有一个语言标记:
    选择不同的?item?itemLabel?itemDescription其中{?item rdfs:label | foaf:name | skos:altLabel“Jack Smith”@en.?文章模式:关于?项。?文章模式:inLanguage“en”.?文章模式:isPartOf.SERVICE wikibase:label{bd:serviceParam wikibase:language“en”}}限制10
    或者如果您只想知道是否有这样一个条目也有Wikipedia页面:
    询问位置{?item rdfs:label | foaf:name | skos:altLabel“Jack Smith”@en.?文章模式:about?item。?文章模式:inLanguage“en.?文章模式:isPartOf.}
    或仅仅
    询问{?item rdfs:label | foaf:name | skos:altLabel“Jack Smith”@en.}