💭

Content Negotiationを使って、PythonでURIからRDFを取得する

2024/06/23に公開

概要

WikidataのエンティティのURIからRDFデータを取得する機会がありましたので、備忘録です。

Content Negotiationを使用しない

まず以下のように、headersを空のままリクエストします。

import requests

# URL for the Wikidata entity in RDF format
url = "http://www.wikidata.org/entity/Q12418"

headers = {
}

# Sending a GET request to the URL
response = requests.get(url, headers=headers)

# Checking if the request was successful
if response.status_code == 200:
    text = response.text
    print(text[:5000])
else:
    print("Failed to retrieve RDF data. Status code:", response.status_code)

この場合、以下のように、json形式のテキストデータを取得することができます。

{"entities":{"Q12418":{"pageid":14002,"ns":0,"title":"Q12418","lastrevid":2176343952,"modified":"2024-06-11T11:43:44Z","type":"item","id":"Q12418","labels":{"fr":{"language":"fr","value":"La Joconde"},"es":{"language":"es","value":"La Gioconda"},"en":{"language":"en","value":"Mona Lisa"},"af":{"language":"af","value":"Mona Lisa"},"am":{"language":"am","value":"\u121e\u1293 \u120a\u12db"},"ar":
...

ただし、求めているRDFデータは取得できません。

Content Negotiationを使用する

次にheadersRDF/XMLを指定します。

import requests
from lxml import etree

# URL for the Wikidata entity in RDF format
url = "http://www.wikidata.org/entity/Q12418"

# Headers to request RDF/XML format
headers = {
    'Accept': 'application/rdf+xml'
}

# Sending a GET request to the URL
response = requests.get(url, headers=headers)

# Checking if the request was successful
if response.status_code == 200:

    tree = etree.fromstring(response.content)

    # Convert _Element to _ElementTree
    tree = etree.ElementTree(tree)
    # Now you can use the write method
    tree.write("output.xml", pretty_print=True, xml_declaration=True, encoding='UTF-8')
else:
    print("Failed to retrieve RDF data. Status code:", response.status_code)

結果、以下のようにRDFデータを取得することができました。

<?xml version='1.0' encoding='UTF-8'?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:ontolex="http://www.w3.org/ns/lemon/ontolex#" xmlns:dct="http://purl.org/dc/terms/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:wikibase="http://wikiba.se/ontology#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:schema="http://schema.org/" xmlns:cc="http://creativecommons.org/ns#" xmlns:geo="http://www.opengis.net/ont/geosparql#" xmlns:prov="http://www.w3.org/ns/prov#" xmlns:wd="http://www.wikidata.org/entity/" xmlns:data="https://www.wikidata.org/wiki/Special:EntityData/" xmlns:s="http://www.wikidata.org/entity/statement/" xmlns:ref="http://www.wikidata.org/reference/" xmlns:v="http://www.wikidata.org/value/" xmlns:wdt="http://www.wikidata.org/prop/direct/" xmlns:wdtn="http://www.wikidata.org/prop/direct-normalized/" xmlns:p="http://www.wikidata.org/prop/" xmlns:ps="http://www.wikidata.org/prop/statement/" xmlns:psv="http://www.wikidata.org/prop/statement/value/" xmlns:psn="http://www.wikidata.org/prop/statement/value-normalized/" xmlns:pq="http://www.wikidata.org/prop/qualifier/" xmlns:pqv="http://www.wikidata.org/prop/qualifier/value/" xmlns:pqn="http://www.wikidata.org/prop/qualifier/value-normalized/" xmlns:pr="http://www.wikidata.org/prop/reference/" xmlns:prv="http://www.wikidata.org/prop/reference/value/" xmlns:prn="http://www.wikidata.org/prop/reference/value-normalized/" xmlns:wdno="http://www.wikidata.org/prop/novalue/">
	<rdf:Description rdf:about="https://www.wikidata.org/wiki/Special:EntityData/Q12418">
		<rdf:type rdf:resource="http://schema.org/Dataset"/>
		<schema:about rdf:resource="http://www.wikidata.org/entity/Q12418"/>
		<cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/"/>
		<schema:softwareVersion>1.0.0</schema:softwareVersion>
		<schema:version rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">2176343952</schema:version>
		<schema:dateModified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2024-06-11T11:43:44Z</schema:dateModified>
		<wikibase:statements rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">141</wikibase:statements>
		<wikibase:sitelinks rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">138</wikibase:sitelinks>
		<wikibase:identifiers rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">69</wikibase:identifiers>
	</rdf:Description>

まとめ

間違った理解をしている点もあるかもしれませんが、参考になりましたら幸いです。

Discussion