Как использовать wikidata API для доступа к утверждениям

Я пытаюсь получить информацию из Викиданных. Например, для доступа к «кобальту-70» я использую API.

API_ENDPOINT = "https://www.wikidata.org/w/api.php"

query = "cobalt-70"

params = {
    'action': 'wbsearchentities',
    'format': 'json',
    'language': 'en',
    'search': query
}
r = requests.get(API_ENDPOINT, params = params)
print(r.json())

Итак, есть «претензии», которые дают доступ к утверждениям. Есть ли лучший способ проверить, существует ли значение в выражении? Например, «кобальт-70» имеет значение 0,5 внутри свойства P2114. Итак, как я могу проверить, существует ли значение в выражении сущности? Как этот пример.

введите здесь описание изображения

Есть ли способ получить к нему доступ. Благодарю вас!


person elitebook190    schedule 18.06.2020    source источник
comment
r.json() не содержит информации, которую вы указали в вопросе или на изображении. Откуда это?   -  person Jack Fleeting    schedule 18.06.2020
comment
@JackFleeting Извините, я забыл ссылку на API: wikidata.org/w /api.php?action=wbgetclaims&entity=Q18844865   -  person elitebook190    schedule 18.06.2020


Ответы (2)


Я не уверен, что это именно то, что вы ищете, но если это достаточно близко, вы, вероятно, можете изменить его по мере необходимости:

import requests
import json
url = 'https://www.wikidata.org/wiki/Special:EntityData/Q18844865.json'
req = requests.get(url)
targets = j_dat['entities']['Q18844865']['claims']['P2114']
for target in targets:    
    values = target['mainsnak']['datavalue']['value'].items()
    for value in values:
        print(value[0],value[1])

Выход:

amount +0.5
unit http://www.wikidata.org/entity/Q11574
upperBound +0.6799999999999999
lowerBound +0.32
amount +108.0
unit http://www.wikidata.org/entity/Q723733
upperBound +115.0
lowerBound +101.0

РЕДАКТИРОВАТЬ: Чтобы найти идентификатор свойства по значению, попробуйте:

targets = j_dat['entities']['Q18844865']['claims'].items()
for target in targets:   
    line = target[1][0]['mainsnak']['datavalue']['value']
    if isinstance(line,dict):
        for v in line.values():
            if v == "+0.5":
                print('property: ',target[0])

Выход:

property:  P2114
person Jack Fleeting    schedule 18.06.2020
comment
Большое спасибо за ответ. Это не совсем то, что я ищу. Представьте, что у вас есть только значение 0,5, и я хочу узнать, существует ли оно в операторах кобальта-70 и возвращает идентификатор свойства 0,5 (свойство: P2114). - person elitebook190; 19.06.2020
comment
@elitebook190 - Кажется, я понимаю, что вы ищете (надеюсь). См. редактирование. - person Jack Fleeting; 19.06.2020

Я пробую решение, которое состоит в поиске внутри объекта json в качестве решения, предложенного здесь: https://stackoverflow.com/a/55549654/8374738. Я надеюсь, что это может помочь. Давайте дадим вам идею.

import pprint

def search(d, search_pattern, prev_datapoint_path=''):
    output = []
    current_datapoint = d
    current_datapoint_path = prev_datapoint_path
    if type(current_datapoint) is dict:
        for dkey in current_datapoint:
            if search_pattern in str(dkey):
                c = current_datapoint_path
                c+="['"+dkey+"']"
                output.append(c)
            c = current_datapoint_path
            c+="['"+dkey+"']"
            for i in search(current_datapoint[dkey], search_pattern, c):
                output.append(i)
    elif type(current_datapoint) is list:
        for i in range(0, len(current_datapoint)):
            if search_pattern in str(i):
                c = current_datapoint_path
                c += "[" + str(i) + "]"
                output.append(i)
            c = current_datapoint_path
            c+="["+ str(i) +"]"
            for i in search(current_datapoint[i], search_pattern, c):
                output.append(i)
    elif search_pattern in str(current_datapoint):
        c = current_datapoint_path
        output.append(c)
    output = filter(None, output)
    return list(output)

И вам просто нужно использовать:

pprint.pprint(search(res.json(),'0.5','res.json()'))

Output:

["res.json()['claims']['P2114'][0]['mainsnak']['datavalue']['value']['amount']"]
person elitebook190    schedule 19.06.2020