如何调整sparql查询以返回甚至简短的信息

如何调整sparql查询以返回甚至简短的信息,sparql,wikidata,Sparql,Wikidata,我在这方面是新来的,问问题的方面,所以如果你需要任何额外的信息,请告诉我 我有一个2900个条目的数据集,其中大部分是荷兰和佛兰德诗人。我想通过查询wikidata向这个数据框添加信息;性别、国籍、出生日期、死亡日期。两个小国能有多少诗人?并不是所有的信息都可以在维基数据上找到(我稍后会处理),而对于那些有这些信息的人来说,这些信息有时是非常稀缺的 我使用了以下查询: import requests def get_data_for_poet(poet): url = 'https:/

我在这方面是新来的,问问题的方面,所以如果你需要任何额外的信息,请告诉我

我有一个2900个条目的数据集,其中大部分是荷兰和佛兰德诗人。我想通过查询wikidata向这个数据框添加信息;性别、国籍、出生日期、死亡日期。两个小国能有多少诗人?并不是所有的信息都可以在维基数据上找到(我稍后会处理),而对于那些有这些信息的人来说,这些信息有时是非常稀缺的

我使用了以下查询:

import requests

def get_data_for_poet(poet):
    url = 'https://query.wikidata.org/sparql'
    query = '''
    prefix schema: <http://schema.org/>
            SELECT ?item ?occupation ?genderLabel ?bdayLabel ?bnatLabel ?deathLabel
            WHERE {
                ?item ?label "''' + poet + '''"@en.
                ?item wdt:P106 ?occupation .
                ?item wdt:P21 ?gender .
                ?item wdt:P569 ?bday .
                ?item wdt:P27 ?bnat .
                ?item wdt:P570 ?death .

            SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
        }
'''

r = requests.get(url, params = {'format': 'json', 'query': query})
try:
    #print(r.content)
    data = r.json()
    return {
        'gender': data['results']['bindings'][0]['genderLabel']['value'],
        'birthday': data['results']['bindings'][0]['bdayLabel']['value'],
        'death': data['results']['bindings'][0]['deathLabel']['value'],
        'nationality': data['results']['bindings'][0]['bnatLabel']['value'],
    }
except:
    return {
        'gender': 'Onbekend',
        'birthday': 'Onbekend',
       'death' : 'Onbekend',
        'nationality': 'Onbekend'
    }
但不幸的是,我注意到查询只在Q ID的所有四条信息都可用时返回信息

这是输出的一部分:

12
{'gender': 'male', 'birthday': '1934-08-04T00:00:00Z', 'death': '2012-07-11T00:00:00Z', 'nationality': 'Kingdom of the Netherlands'}
13
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
14
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
15
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
16
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
然后我试着一个接一个地查询这些信息(先是性别,然后是生日等等),但这确实需要很长时间

我如何调整查询以返回所有信息,即使只知道性别?我用
可选的
做了一些尝试,但很快就变得一团糟了。我是SPARQL新手,因此非常感谢您的帮助


另外,考虑到我花在这个数据集上的时间,我可能会受到隧道视觉的困扰,但是如果有python包可以做到这一点,我很想知道。

使用
可选
的直觉是正确的。你必须将它添加到你想考虑的每一个信息中(即不必要)。
此外,为了避免误报,我认为您还应该使用
rdfs:label
,而不是通用的
?label
(可以引用任何属性)

前缀模式:
选择?项目?职业?性别标签?bdayLabel?bnatLabel?死亡标签
在哪里{
?项目rdfs:标签“Marc Tritsmans”@en。
?项目wdt:P106?职业。
可选{项目wdt:P21?性别。}
可选{项目wdt:P569?b日期}
可选{项目wdt:P27?bnat.}
可选{项目wdt:P570?死亡。}
服务wikibase:标签{bd:serviceParam wikibase:语言“en”}
}

查看演示。

什么是“凌乱”?它是可选数据的预期语言功能。将每个特征放进<代码>可选的<代码>子句中,然后我做了两个注释:1)考虑全文搜索或至少在比较名称时集成可能的别名。2) 可能有多个同名的人-这需要额外的步骤来筛选正确的人-可能这两点与您的域不相关,但通常情况下会发生。谢谢!它起作用了。为了完成这篇文章,我还需要根据Combat403错误调整标题。API真的很慢,但我很高兴它现在正在运行!
12
{'gender': 'male', 'birthday': '1934-08-04T00:00:00Z', 'death': '2012-07-11T00:00:00Z', 'nationality': 'Kingdom of the Netherlands'}
13
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
14
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
15
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
16
{'gender': 'Onbekend', 'birthday': 'Onbekend', 'death': 'Onbekend', 'nationality': 'Onbekend'}
PREFIX schema: <http://schema.org/>
SELECT ?item ?occupation ?genderLabel ?bdayLabel ?bnatLabel ?deathLabel
WHERE {
    ?item rdfs:label "Marc Tritsmans"@en.
    ?item wdt:P106 ?occupation .
    OPTIONAL { ?item wdt:P21 ?gender . }
    OPTIONAL { ?item wdt:P569 ?bday . }
    OPTIONAL { ?item wdt:P27 ?bnat . }
    OPTIONAL { ?item wdt:P570 ?death . }
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}