JasonTPhillipsJr's picture
Upload 76 files
46e0dd0 verified
raw
history blame
6.63 kB
import requests
import pdb
import time
# for linkedgeodata: #http://linkedgeodata.org/sparql
class RequestWrapper:
def __init__(self, baseuri = "https://query.wikidata.org/sparql"):
self.baseuri = baseuri
def response_handler(self, response, query):
if response.status_code == requests.codes.ok:
ret_json = response.json()['results']['bindings']
elif response.status_code == 500:
ret_json = []
#print(q_id)
print('Internal Error happened. Set ret_json to be empty list')
elif response.status_code == 429:
print(response.status_code)
print(response.text)
retry_seconds = int(response.text.split('Too Many Requests - Please retry in ')[1].split(' seconds')[0])
print('rerun in %d seconds' %retry_seconds)
time.sleep(retry_seconds + 1)
response = requests.get(self.baseuri, params = {'format':'json', 'query':query})
ret_json = response.json()['results']['bindings']
#print(ret_json)
print('resumed and succeeded')
else:
print(response.status_code, response.text)
exit(-1)
return ret_json
'''Search for wikidata entities given the name string'''
def wikidata_query (self, name_str):
query = """
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wds: <http://www.wikidata.org/entity/statement/>
PREFIX wdv: <http://www.wikidata.org/value/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX pq: <http://www.wikidata.org/prop/qualifier/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX bd: <http://www.bigdata.com/rdf#>
SELECT ?item ?coordinates ?itemDescription WHERE {
?item rdfs:label \"%s\"@en;
wdt:P625 ?coordinates .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
"""%(name_str)
response = requests.get(self.baseuri, params = {'format':'json', 'query':query})
ret_json = self.response_handler(response, query)
return ret_json
'''Search for wikidata entities given the name string'''
def wikidata_query_withinstate (self, name_str, state_id = 'Q99'):
query = """
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wds: <http://www.wikidata.org/entity/statement/>
PREFIX wdv: <http://www.wikidata.org/value/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX pq: <http://www.wikidata.org/prop/qualifier/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX bd: <http://www.bigdata.com/rdf#>
SELECT ?item ?coordinates ?itemDescription WHERE {
?item rdfs:label \"%s\"@en;
wdt:P625 ?coordinates ;
wdt:P131+ wd:%s;
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
"""%(name_str, state_id)
#print(query)
response = requests.get(self.baseuri, params = {'format':'json', 'query':query})
ret_json = self.response_handler(response, query)
return ret_json
'''Search for nearby wikidata entities given the entity id'''
def wikidata_nearby_query (self, q_id):
query = """
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wds: <http://www.wikidata.org/entity/statement/>
PREFIX wdv: <http://www.wikidata.org/value/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX pq: <http://www.wikidata.org/prop/qualifier/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX bd: <http://www.bigdata.com/rdf#>
SELECT ?place ?placeLabel ?location ?instanceLabel ?placeDescription
WHERE
{
wd:%s wdt:P625 ?loc .
SERVICE wikibase:around {
?place wdt:P625 ?location .
bd:serviceParam wikibase:center ?loc .
bd:serviceParam wikibase:radius "5" .
}
OPTIONAL { ?place wdt:P31 ?instance }
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
BIND(geof:distance(?loc, ?location) as ?dist)
} ORDER BY ?dist
LIMIT 200
"""%(q_id)
# initially 2km
#pdb.set_trace()
response = requests.get(self.baseuri, params = {'format':'json', 'query':query})
ret_json = self.response_handler(response, query)
return ret_json
def linkedgeodata_query (self, name_str):
query = """
Prefix lgdo: <http://linkedgeodata.org/ontology/>
Prefix geom: <http://geovocab.org/geometry#>
Prefix ogc: <http://www.opengis.net/ont/geosparql#>
Prefix owl: <http://www.w3.org/2002/07/owl#>
Prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
Prefix owl: <http://www.w3.org/2002/07/owl#>
Prefix gn: <http://www.geonames.org/ontology#>
Select ?s, ?lat, ?long {
{?s rdfs:label \"%s\";
wgs84_pos:lat ?lat ;
wgs84_pos:long ?long;
}
}
"""%(name_str)
response = requests.get(self.baseuri, params = {'format':'json', 'query':query})
ret_json = self.response_handler(response, query)
return ret_json
if __name__ == '__main__':
request_wrapper_wikidata = RequestWrapper(baseuri = 'https://query.wikidata.org/sparql')
#print(request_wrapper_wikidata.wikidata_nearby_query('Q370771'))
#print(request_wrapper_wikidata.wikidata_query_withinstate('San Bernardino'))
# not working now
print(request_wrapper_wikidata.linkedgeodata_query('San Bernardino'))