电影KBQA-4

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服务,但它有两个缺点:

  1. 不支持直接将RDF数据通过endpoint发布到网络上。

  2. 不支持推理。

这次我们介绍的Apache Jena能够解决上面两个问题。

一、Apache Jena简介

Apache Jena(后文简称Jena),是一个开源的Java语义网框架(open source Semantic Web Framework for Java),用于构建语义网和链接数据应用。下面是Jena的架构图:

本次实践我们会用到的组件有:TDB、rule reasoner和Fuseki。

  1. TDB是Jena用于存储RDF的组件,是属于存储层面的技术。在单机情况下,它能够提供非常高的RDF存储性能。目前TDB的最新版本是TDB2,且与TDB1不兼容。
  2. Jena提供了RDFS、OWL和通用规则推理机。其实Jena的RDFS和OWL推理机也是通过Jena自身的通用规则推理机实现的。
  3. 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的方式存储。命令如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值