D2RQ SPARQL endpoint与两种交互方式
这次我们介绍利用D2RQ开启SPARQL endpoint服务和两种交互方式:在浏览器中进行查询或者编写python脚本进行交互。
一、SPARQL endpoint
SPARQL endpoint是SPARQL协议的一部分,用于处理客户端的请求,可以类比web server提供用户浏览网页的服务。通过endpoint,我们可以把数据发布在网上,供用户查询。
D2RQ,是以虚拟RDF的方式来访问关系数据库中的数据,即我们不需要显式地把数据转为RDF形式。通过默认,或者自己定义的mapping文件,我们可以用查询RDF数据的方式来查询关系数据库中的数据。换个说法,D2RQ把SPARQL查询,按照mapping文件,翻译成SQL语句完成最终的查询,然后把结果返回给用户。
下面是D2R Server的架构图:
进入d2rq目录,使用下面的命令启动D2R Server:
d2r-server.bat kg_demo_movie_mapping.ttl
查询例子
“周星驰出演了哪些电影?”
SELECT ?n WHERE{
?s rdf:type :Person.
?s :personName '周星驰'.
?m :hasActedIn ?s.
?m :movieTitle ?n
}
limit 10
“英雄这部电影有哪些演员参演?”
SELECT ?n WHERE{
?s rdf:type :Movie.
?s :movieTitle '英雄'.
?s :hasActedIn ?a.
?a :personName ?n
}
“巩俐参演的评分大于7的电影有哪些?”
SELECT ?n WHERE{
?p rdf:type :Person.
?p :personName '巩俐'.
?m :hasActedIn ?p.
?m :movieTitle ?n.
?m :movieRating ?r.
FILTER (?r >=7)
}
三、编写Python脚本进行交互
构建基于知识图谱的应用,我们希望将SPARQL查询集成在代码当中,对其进行包装便于后续开发。这里介绍一个Python第三方库:SPARQLWrapper。如其名,这是一个Python下的包装器,可以让我们十分方便地和endpoint进行交互。下面是通过SPARQLWrapper,向D2RQ endpoint发送查询“巩俐参演的评分大于7的电影有哪些”,得到结果的代码。
首先安装工具包
! pip3 install sparqlwrapper
然后使用Python查看对应的结果
from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://localhost:2020/sparql")
sparql.setQuery("""
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?n WHERE{
?p rdf:type :Person.
?p :personName '巩俐'.
?m :hasActedIn ?p.
?m :movieTitle ?n.
?m :movieRating ?r.
FILTER (?r >=7)
}
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
for result in results["results"]["bindings"]:
print(result["n"]["value"])
Apache jena SPARQL endpoint及推理
在上一篇我们学习了如何利用D2RQ来开启endpoint服务,但它有两个缺点:
-
不支持直接将RDF数据通过endpoint发布到网络上。
-
不支持推理。
这次我们介绍的Apache Jena能够解决上面两个问题。
一、Apache Jena简介
Apache Jena(后文简称Jena),是一个开源的Java语义网框架(open source Semantic Web Framework for Java),用于构建语义网和链接数据应用。下面是Jena的架构图:
本次实践我们会用到的组件有:TDB、rule reasoner和Fuseki。
- TDB是Jena用于存储RDF的组件,是属于存储层面的技术。在单机情况下,它能够提供非常高的RDF存储性能。目前TDB的最新版本是TDB2,且与TDB1不兼容。
- Jena提供了RDFS、OWL和通用规则推理机。其实Jena的RDFS和OWL推理机也是通过Jena自身的通用规则推理机实现的。
- Fuseki是Jena提供的SPARQL服务器,也就是SPARQL endpoint。其提供了四种运行模式:单机运行、作为系统的一个服务运行、作为web应用运行或者作为一个嵌入式服务器运行。
Jena目前是使用最广泛、文档最全、社区最活跃的一个开源语义网框架。更多的细节,读者可以参考官方文档。
二、Fuseki与OWL推理实战
我们先下载Jena的最新版本(fuseki和其他的功能模块不在同一个文件中,需要分别下载apache-jena和apache-jena-fuseki)。
创建一个目录(我这里命名为“tdb”)用于存放tdb数据。进入“apache-jena-X.X.X”文件夹的bat目录,可以看到很多批处理文件,我们使用“tdbloader.bat”将之前我们的RDF数据以TDB的方式存储。命令如下: