【问题标题】:Given a list of Wikidata identifiers, is there a way to find which ones are directly related using Python and/or SPARQL?给定维基数据标识符列表,有没有办法使用 Python 和/或 SPARQL 找到哪些直接相关?
【发布时间】:2023-01-03 03:27:33
【问题描述】:
我有一个维基数据 ID 列表,我想找出其中哪些是其他人的子类 (P279)。
假设我有伪代码["Q42" (Douglas Adams) , "Q752870" (motor vehicle) , "Q1420" (motor car), "Q216762" (hatchback car) ] 中的列表。
我正在尝试找到一种方法来处理此列表并输出如下内容:
[("Q752870", "Q1420")("Q1420","Q216762")] 与子类对。
我可以用伪代码迭代列表并为每一对运行自定义 SPARQL 查询:
subclass_pairs = []
for a in list:
for b in list:
if custom_query_handler(a,b):
subclass_pairs.append((a,b))
但这意味着大量的 SPARQL 请求。
如何在单个 SPARQL 请求中执行此操作?还有其他解决方案吗?
`
【问题讨论】:
标签:
python
sparql
wikidata
【解决方案1】:
在写作时,我想出了解决方案。
类似 SPARQL 的查询(用于直接链接)
SELECT * WHERE
{
VALUES ?a {wd:Q42 wd:Q752870 wd:Q1420 wd:Q216762} .
VALUES ?b {wd:Q42 wd:Q752870 wd:Q1420 wd:Q216762} .
?a wdt:P279 ?b .
}
或喜欢(用于直接和间接链接)
SELECT DISTINCT * WHERE
{
VALUES ?a {wd:Q42 wd:Q752870 wd:Q1420 wd:Q216762} .
VALUES ?b {wd:Q42 wd:Q752870 wd:Q1420 wd:Q216762} .
FILTER (?a != ?b)
?a wdt:P279* ?b .
}
returns a list of pairs exactly like I wanted. Then, it is just a matter of parsing in Python with something like [SPARQLWrapper](https://rdflib.dev/sparqlwrapper/) or [wdcuration](https://github.com/lubianat/wdcuration).
A very large list will have to be split into chunks, as the SPARQL URLs might become too long.