我有一个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可能会变得太长。