应用场景
在平台初期或者后期都需要一些标准的官方信息来填充平台缺乏的内容,以往可能是通过爬虫进行爬取,但是这块受限于一些法律或者内容的付费独家信息和内容准确性的问题。因此需要一种渠道拿到我们希望获取的各类数据,比如,城市信息、人物信息、书籍刊物、歌曲、电影等等。
这类信息最直接的方式就是维基百科,里面基本可以搜索到我们能获取的数据,因此我们就考虑怎么从维基百科拉取标准化数据。
数据研究
最开始我们所了解到的一个平台是dbpedia, 基于wikipedia爬取的数据然后标准化落入图形数据库中,关于图形数据库的介绍大家可以自己前往学习了解,其主要是三元组(主谓宾),这里可能也短短几句话描述不完。他使用的查询语言主要是Cypher、Gremlin和Sparql三种,这里我们专注介绍Sparql,本文主要是介绍如何一步步优化,达到我们的目标。
数据库对比分析
在最开始我们使用的是dbpedia,但是这其中绕了一点弯路,因为dbpedia是基于wiki的数据更新的,但是它的数据不会实时更新,导致的一些问题就是很多东西在dbpedia没有。后面了解到wikidata,其完全是wikipedia的数据库。下面是一个对比表格:
| 数据库 | prefix | 语言/测试链接 | 更新方式 | 来源 | 导出 | SDK |
|---|---|---|---|---|---|---|
| wikidata | 自带查询 | Spraql | 实时更新 | 官方 | 不支持 | 有/无需 |
| dbpedia | 自行设置 | Spraql | 手动更新 | 非官方 | 支持 | 有 |
从上面对比,可以很明显发现,我们需要的是获取准确标准化准确内容,并且需要实时的与wikipedia同步,因此选择wikidata,那么接下来我们就看看如何一步步实践在wikidata上利用sparql语法查询到我们需要的内容。
wikidata实践以及优化策略
所有的语言或者db都应该从最简单的方式入手学习,所以从最简单的“hello world”入手,当然这里不是真实的hello world,这里只是一个最简单的实践例子。
“hello world”
现在我们希望使用wikidata查询江西有哪些包含行政区域实体,那么可以组成以下语法,具体如何构建的我们一步步来分析。
SELECT ?cityName
WHERE
{
?item ?label "江西"@zh.
?item wdt:P31 wd:Q1615742.
?item wdt:P150 ?city.
?city wdt:P1448 ?cityName.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],nl" }.
}
首先根据中文名找到江西的所有信息item,然后根据属性P31性质,筛选出Q1615742,该属性可以通过链接查看https://www.wikidata.org/wiki/Q1615742,可以看到起代表的意思是中国的省份,这样就可以拿到唯一的一个item信息。
第二步从item中获取P150属性,P150也可以通过该链接查看https://www.wikidata.org/wiki/Property:P150,它具体的意思就是行政区域实体。
第三部再根据拿到的行政区域实体,获取其P1448属性的名字,P1448就是其官方名字。
这样经过三个步骤就获取到了我们想要的数据了。
查询示例
wiki是有提供一些查询命令,这些都是一些示例,wikidata-query-example,在做查询时,可以根据相似的语句进行修改,然后来尝试。
脱离页面测试工具
如果需要服务端爬取,那么最基本的就是你需要用代码的方式来运行,wikidata的好处在于可以将查询结果灵活获取后分析结果数据,通过代码的方式落入我们自己需要的数据存储中。
在使用https://query.wikidata.org/的时候,打开浏览器network,你会发现其每次运行时候会发生一条请求,该请求样式如下:
https://query.wikidata.org/sparql?query={sparql}
知道这个以后,就可以很简单的拼凑该请求了,然后可以看到它的返回时一个json·结构,那么只需要构建一个HTTP请求即可,以下是node.js的测试运行代码。请注意opt的header信息,如果不加这个会出现403的情况。
const request = require('request');

本文介绍了如何利用wikidata获取标准化数据,从应用场景、数据研究、数据库对比分析到wikidata的实践策略,包括查询示例、多语种支持、条件限制等,并提供了优化策略以应对查询效率和准确性问题。
最低0.47元/天 解锁文章
788

被折叠的 条评论
为什么被折叠?



