知识图谱分为科学知识图谱和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是本科生?反正我也就看到了这俩数。
加起来就可以了!