这两年知识图谱炒的很热!

知识图谱分为科学知识图谱和Google知识图谱,前者就是根据论文分析作者、作者单位、关键字之间的关联关系。后者google把分词技术、贝叶斯分类等算法引入,对各种内容进行关联建库。其实都差不多!

DBpedia是一个开源库,把Wiki百科的内容抽取,其实只是抽取一部分,也比较乱,不过也没有比它好太多的东西。开源,往往就是凑合——文化人叫做抛砖引玉!

DBpedia有个sparql查询接口,https://dbpedia.org/sparql,有啥用呢?我觉得用于测试和学习sparql挺好。它有个关键字“万能接口”,http://lookup.dbpedia.org/api/search/KeywordSearch?QueryClass=university&QueryString=nankai

关于Sparkql的基本语法和用法,本站内容算是比较多的,就不说了。

下面的例子是:查出人数30000以上的中国大学!

这个问题,涉及到大学、人数、中国,就能想到类别、学生数、地址、国别等。如果对DBpedia不熟悉,确实不好入手!因为你根本不知道它的数据库结构、它的所谓本体层次。对于不熟悉的东西,采用“找个例子”的方式琢磨吧,解决方法就是:

用万能查询接口查一个熟悉的大学,看看怎么记录的!然后再用查询语句反查。具体如下:

首先,以“南开大学”为例子,看看它是怎么描述名称、人数、国别、地址等等,其实就是看看字段(属性)名;

然后照猫画虎,用sparql查出南开大学来;

最后,就是简单组合了!

1、第一步:

通过dbpedia的万能查询,获取一个XXX的URI

http://lookup.dbpedia.org/api/search/KeywordSearch?QueryClass=university&QueryString=nankai

两个参数:QueryClass=university,如果不知道要查的东西是什么类,就写QueryClass=thing;QueryString随便写。上述语句就是查询获取类别为大学、包含“南开”二字的所有资源。

通过这个查询工具,可以知道你要查的东西的属性。这种库,根本也不需要什么数据表结构说明书!

第二步:初步查询

在那个对话框里粘贴

select *

 where {<http://dbpedia.org/resource/Nankai_University> ?a ?b} LIMIT 100

这句是的意思其实就是 “南开大学(<http://dbpedia.org/resource/Nankai_University> )干(?a)嘛的(?b)"!当然,?a可以翻译为任何动词,比如干、做、为...?b好像只能翻译为“嘛”!这是个万能公式,你可以三个交换顺序玩,结果会有很不同,嘛是南开大学,问的是关于大学分类的事情,就是本体了——这个懒得说了,懂的不用说,不懂的说不清。

 

获取南开大学的所有属性,发现有Country属性,但是并没有location属性(一个大学没有地址,这个问题说明开源的数据库往往会让人匪夷所思,应了那句“开源的东西一定不是好东西”,这话是梁肈新说的,能够知道的人都不多了吧!)。

那么,怎么查询出中国的南开大学呢?语句如下:

select ?un where{

?un rdf:type <http://dbpedia.org/ontology/University>.

?un <http://dbpedia.org/ontology/country> <http://dbpedia.org/resource/China>.

?un <http://www.w3.org/2000/01/rdf-schema#label> "南开大学"@zh

}

解释:

?un rdf:type <http://dbpedia.org/ontology/University>. 什么东西 的类型是大学

?un <http://dbpedia.org/ontology/country> <http://dbpedia.org/resource/China>这是接上句,哪些大学的国家是中国。这个句子出现了中文逻辑问题——说中文是最好语言的人该酸了,中文没啥逻辑,这也说不清了!

第三步,列出中国所有的大学

就比较容易了。就是把上面那个“南开大学”的条件去掉就行了!

select ?un where{

?un rdf:type <http://dbpedia.org/ontology/University>.

?un <http://dbpedia.org/ontology/country> <http://dbpedia.org/resource/China>

}

回到有关location的问题,还真的有几所大学有location,但是没有country,而且这几所大学有没有学生数量。

select ?un where{

?un<http://dbpedia.org/property/location>  <http://dbpedia.org/resource/China>.}

所以,需要用UNION,最终语句为

select ?un where{

{?un rdf:type <http://dbpedia.org/ontology/University>.

?un <http://dbpedia.org/ontology/country> <http://dbpedia.org/resource/China>.}

UNION {?un<http://dbpedia.org/property/location>  <http://dbpedia.org/resource/China>.}

}

第四步,计算大学学生数量,并查询出来

select ?un, ?a, ?b, ?a+?b where{

{?un rdf:type <http://dbpedia.org/ontology/University>.

?un <http://dbpedia.org/ontology/country> <http://dbpedia.org/resource/China>.

?un<http://dbpedia.org/ontology/numberOfPostgraduateStudents> ?a.

?un <http://dbpedia.org/ontology/numberOfUndergraduateStudents>?b.

FILTER(?a+?b>30000)

}

UNION {?un<http://dbpedia.org/property/location>  <http://dbpedia.org/resource/China>.

?un<http://dbpedia.org/ontology/numberOfPostgraduateStudents> ?a.

?un <http://dbpedia.org/ontology/numberOfUndergraduateStudents>?b.

FILTER (?a+?b>30000)

}

}

numberOfPostgraduateStudents 是研究生numberOfUndergraduateStudents是本科生?反正我也就看到了这俩数。

加起来就可以了!

燕山大学、福建师大等还是查不出来!

完事!

 

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐