gAnswer能够将自然语言问题转化成包含语义信息的查询图,然后,将查询图转化成标准的SPARQL查询,并将这些查询在图数据库中执行,最终得到用户的答案。这篇文章将介绍gAnswer的使用。
目前gAnswer仅仅提供了HTTP API,以JSON格式接受用户自然语言问题,同时以JSON格式返回生成的SPARQL查询和问题答案。首先介绍gAnswerHttp启动,然后是http API以及数据传输格式。
1、gAnswerHttp
gAnswerHttp是利用jetty开发的,嵌入式的,轻量级的gAnswer http server。在控制台/终端启动gAnswerHttp以后,可以通过http请求获取系统生成的问题sparql和问题答案。 启动的方法是:切换到工程文件夹下,控制台输入
java -jar Ganswer.jar
默认为9999端口。若想使用其他端口,例如8888,可以输入
java –jar Ganswer.jar port=8888
2、http API说明
2.1、简单样式
在本部分,会给出一个使用gAnswerHttp API的例子。 正常启动gAnswerHttp后,用户需要构建一个json格式的数据,例如:
{
“maxAnswerNum”: “3”
“needSparql”: “2”
“question”: “Who is the wife of Barack Obama?”
}
上述json数据的含义为:回答”Who is the wife of Barack Obama?”这个问题,要求最多返回3个不同的答案,1条生成的SPARQL查询。 将此json数据转化为字符串,进行url转码,然后使用ip:port/gSolve/?data=%json string%
(在%json string%处放入json数据字符串)这一uri来调用gAnswer系统。在样例中,实际访问的uri为:http://ip:port/gSolve/?data={maxAnswerNum:3, maxSparqlNum:1,question:Who is the wife of Ming Yao?}
若省略maxAnswerNum和maxSparqlNum则系统使用默认参数。假如系统返回了正确结果,返回的内容也是json格式的数据,如下所示:(注意,使用浏览器直接访问时,应在源代码页面查看返回结果,避免出现显示错误)
{
“status”: “200”
“query”: “Who is the wife of Barack Obama?”
“vars” : [ “?wife” ]
“sparql”: [
“select DISTINCT ?wife where { ?wife <spouse> <Yao_Ming>. } LIMIT 3”
]
“results”:{
“bindings” : [
{
“?wife” :
{
“type” : “uri”
“value”:”<Ye_Li>”
}
},
]
},
}
需要特别说明的是,其中“vars”代表识别到的变量名,“results”中为实际得到的答案,”value”中为实际答案的值,“status”则说明这是一次正常的请求返回。假如系统中出现了错误,那么同样会返回json格式的数据,而不会报错。如下:
{
“query”: “”,
“message”: “UnvalidQuestionException: the question you input is invalid, please check”,
“status”: “500”
}
这是输入了无效问题(长度过短)以后,返回的json数据,其中“message”提供了出错的详细信息,“status”说明了错误的代码。
2.2、API 结构
gSolve
uri : ip:port/gSolve/
作用:向gAnswer请求返回一个或多个用户问题的答案和sparql,用户可以选择返回答案还是sparql
输入:
{
“maxAnswerNum”: //一个整数,代表需要返回的答案的上限
“needSparql”: //一个整数,代表需要返回sparql的数量
“questions”: //用户问题
}
输出
{
“status”: //表示用户请求的状态
“query”: //用户问题
“vars” : [ …… ] //查询中涉及的变量
“sparql”: [ …… ] //由用户问题得到的sparql查询
“results”:{
“bindings” : [ //多个json对象,每个对象为一组变量的值绑定
{
“%varName%” : { //此处的key为上面“vars”中出现的变量的名字
“type” : //说明这个值的类型,比如uri
“value”://答案的值
}
}
]
},
//当maxAnswerNum大于0,会返回得到的答案
}
getInfouri:ip:port/getInfo/
作用:获取当前gAnswer系统的状态以及相关元数据 输入:不需要额外的参数 输出
{
“version”: //当前的系统版本
“dataset”: //当前使用的数据集
“GDB system”: //当前使用的gStore版本
}
2.3、Java API示例
我们在源代码的application.gAnswerHttpConnector中给出了使用Java通过http请求访问gAnswer系统的示例。
public String gSolve(String data){
String param = data;
String rst = sendGet(param,"/gSolve");
System.out.println(rst);
return rst;
}
public String gInfo(){
String param = "";
String rst = sendGet(param,"/gInfo");
System.out.println(rst);
return rst;
}
3、demo展示
gAnswer在DBpedia2016,bird,film三个数据集的demo演示可以公开访问:https://answer.gstore.cn/pc/index.html
我们的系统能轻松实现这种三跳的问题解析以及数据库查询:
系统还对中间数据细节可视化展示,包含对问题解析后的解析树,查询图,“vars”识别到的变量名。以及生成的 sparql 查询语句。
有任何问题可添加以下二维码联系我们的运营同学。
诚邀大家参加
·gStore-weekly技术文章征集活动·
相关技术文章,包含但不限于以下内容:系统技术解析、案例分享、实践总结、开发心得、客户案例、使用技巧、学习笔记等。文章要求原创。
入选周刊即送精美礼品~
欢迎关注北京大学王选计算机研究所数据管理实验室微信公众号“图谱学苑“
实验室官网:https://mod.wict.pku.edu.cn/
微信社区群:请回复“社区”获取
实验室开源产品图数据库gStore:
gStore官网:https://www.gstore.cn/
GitHub:https://github.com/pkumod/gStore
Gitee:https://gitee.com/PKUMOD/gStore