【问题标题】: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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2015-02-01
      • 2021-08-08
      相关资源
      最近更新 更多