<p>如果只需要输出边,可以通过调用<a href="https://www.wikidata.org/wiki/Special:EntityData/Q20145.nt" rel="nofollow noreferrer">https://www.wikidata.org/wiki/Special:EntityData/Q20145.nt</a>直接检索它们</p>
<pre><code>from rdflib import Graph
g = Graph()
g.parse('https://www.wikidata.org/wiki/Special:EntityData/Q20145.nt', format="nt")
for subj, pred, obj in g:
print(subj, pred, obj)
</code></pre>
<p>要获取传入和传出边缘,需要查询数据库。在Wikidata上,这是使用<a href="https://query.wikidata.org/" rel="nofollow noreferrer">Wikidata Query Service</a>和查询langauge SPARQL完成的。获取所有边的SPARQL表达式非常简单,如<code>DESCRIBE wd:Q20145</code></p>
<p>使用Python,您可以使用以下代码检索查询结果:</p>
<pre><code>import requests
import json
endpoint_url = "https://query.wikidata.org/sparql"
headers = { 'User-Agent': 'MyBot' }
payload = {
'query': 'DESCRIBE wd:Q20145',
'format': 'json'
}
r = requests.get(endpoint_url, params=payload, headers=headers)
results = r.json()
triples = []
for result in results["results"]["bindings"]:
triples.append((result["subject"], result["predicate"], result["object"]))
print(triples)
</code></pre>
<p>这为您提供了复杂基础数据模型的完整结果来源。如果要分别查询传入边和传出边,请写入<code>DESCRIBE wd:Q20145</code>而不是<code>CONSTRUCT {?s ?p ?o} WHERE {BIND(wd:Q20145 AS ?s) ?s ?p ?o}</code>以仅具有传出边或<code>CONSTRUCT {?s ?p ?o} WHERE {BIND(wd:Q20145 AS ?o) ?s ?p ?o}</code>以仅具有传入边</p>
<p>根据您的目标,您可能希望过滤掉一些三元组,例如语句三元组,并且您可能希望简化一些三元组。
获得更清晰结果的一种可能性是将最后四行替换为:</p>
<pre><code>triples = []
for result in results["results"]["bindings"]:
subject = result["subject"]["value"].replace('http://www.wikidata.org/entity/', '')
object = result["object"]["value"].replace('http://www.wikidata.org/entity/', '')
predicate = result["predicate"]["value"].replace('http://www.wikidata.org/prop/direct/', '')
if 'statement/' in subject or 'statement/' in object:
continue
triples.append((subject, predicate, object))
print(triples)
</code></pre>