使用CSV文件中的值进行维基数据查询

fxnxkyjh  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(200)

我想对计算机上CSV文件列中列出的许多值进行维基数据查询。如何将CSV文件中的值自动加载到维基数据查询中,而无需手动复制它们?
到目前为止,我已经在Visual Studio代码中使用了Wikidata查询。
这是我为一个人制作的query

SELECT ?Author ?AuthorLabel ?VIAF ?birthLocation
   WHERE {
   VALUES ?VIAF {"2467372"}
   ?Author wdt:P214 ?VIAF ;
     wdt:P19 ?birthLocation .
           
   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_Language],de". }              
}

我想从CSV文件的列中自动加载许多值到上面查询的花括号中。

fruv7luv

fruv7luv1#

首先,我不得不指出,如果你还不知道一种编程语言,OpenRefine可以为你做这几个点击。
话虽如此,下面是一个基本的Python程序,它可以完成您的实际要求-阅读一组VIAF id并将它们添加到查询中:

import csv

def expand_query(ids):
    query = """
    SELECT ?Author ?AuthorLabel ?VIAF ?birthLocation ?birthLocationLabel WHERE {
        VALUES ?VIAF {
        """ + '"' + '" "'.join(ids) + '"' """
        }
        ?Author wdt:P214 ?VIAF. 
        OPTIONAL { ?Author wdt:P19 ?birthLocation. }
        SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_Language],de,en". }
    }
    """
    return query

def main():
    with open('../data/authors.csv', "rt") as csvfile:
        csvreader = csv.DictReader(csvfile, dialect=csv.excel)
        ids = [row["viaf"] for row in csvreader]
        print(expand_query(ids))

if __name__ == "__main__":
    main()

它需要一个CSV文件,其中包含一个名为viaf的列,并将忽略所有其他列。

name,viaf
Douglas Adams,113230702
William Shakespeare,96994048
Bertolt Brecht,2467372

我稍微调整了查询:

  • 即使出生地不可用,也始终输出一行
  • 输出出生地点的标注
  • 添加英语作为标签的其他备用语言

这就假设您有一个足够小的标识符集合,可以使用单个查询,但您可以将其扩展为:

  • 以方便的大小批量读取标识符
  • 使用SPARQLwrapper将结果发送到Wikidata SPARQL端点并解析结果
  • 在收到结果时,将结果以块的形式写入另一个CSV文件
u4vypkhs

u4vypkhs2#

因此,假设您有一个包含以下内容的文件my_file.csv

2467372
63468347
12447

首先,导入一个python库来阅读文件(比如fileinput)。
然后声明要用于查询的模式,使用%s作为标识符的占位符。
现在,构建标识符列表,如下所示:

identifiers = ['wd:'+line.strip() for line in fileinput.input(files='my_file.csv')]

最后,使用空格字符作为分隔符连接列表,并将此字符串传递给查询模式:

query = query_pattern % ' '.join(identifiers)

这是最终代码:

import fileinput

filename = 'my_file.csv'
query_pattern = '''SELECT ?Author ?AuthorLabel ?VIAF ?birthLocation
   WHERE {
   VALUES ?VIAF { %s }
   ?Author wdt:P214 ?VIAF ;
     wdt:P19 ?birthLocation .
           
   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_Language],de". }              
}'''

identifiers = ['"'+line.strip()+'"' for line in fileinput.input(files=filename)]
query = query_pattern % ' '.join(identifiers)
print(query)

执行它,您将获得:

SELECT ?Author ?AuthorLabel ?VIAF ?birthLocation
   WHERE {
   VALUES ?VIAF { "2467372" "63468347" "12447" }
   ?Author wdt:P214 ?VIAF ;
     wdt:P19 ?birthLocation .

   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_Language],de". }
}

相关问题