给定一个维基数据标识符列表,是否有一种方法可以找到哪些是使用Python和/或SPARQL直接相关的?



我有一个Wikidata 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请求中做到这一点?还有其他的解决办法吗?

边写边想办法。

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 . 
}

返回一个完全符合我要求的pair列表。然后,只需在Python中使用SPARQLWrapper或wdcuration之类的东西进行解析即可。

一个非常大的列表将不得不分割成块,因为SPARQL url可能会变得太长。

最新更新