Как использовать api викиданных для доступа к операторам - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь получить информацию из Викиданных. Например, для доступа к «кобальту-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. Итак, как я могу проверить, существует ли значение в заявлении объекта? Как этот пример.

enter image description here

Есть ли способ получить к нему доступ. Спасибо!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

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

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
0 голосов
/ 19 июня 2020

Я пробую решение, которое состоит в поиске внутри объекта json в качестве решения, предложенного здесь: { ссылка }. Надеюсь, это поможет. Давайте подскажем вам идею.

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']"]
...