1.问题描述

最近因研究需要,尝试使用SPARQL协议访问Endpoint,在使用Jena的ARQ组件访问DBPedia的Endpoint时出现了Connection Reset异常。在放弃Jena ARQ组件,直接使用Http请求时依然异常,异常的查询语句为 "Select ?p ?o where { <http://dbpedia.org/resource/Alabama> ?p ?o . }"  然而比较奇怪的是,如果将查询换成Endpoint的范例查询"select * where { ?s ?p ?o .} LIMIT 100" 时 程序没有报错,能将结果正常打印出来。有意思的是,如果在网页的endpoint使用"Select ?p ?o where { <http://dbpedia.org/resource/Alabama> ?p ?o . }"  这个查询,结果也能执行。DBPedia的Endpoint链接为http://dbpedia.org/sparql.

以下是使用HTTP发生请求的代码

public class HttpTest {public static String sendGet(String url, String param) {String result = "";BufferedReader in = null;try {String urlNameString = url + "?" + param;URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}public static void main(String[] args) throws Exception {HttpTest httpTest = new HttpTest();
//      String query="query="+URLEncoder.encode("select * where { ?s ?p ?o .} LIMIT 100","UTF-8");String query="query="+URLEncoder.encode("select ?p ?o where { <http://dbpedia.org/resource/Alabama> ?p ?o .}","UTF-8");System.out.println(httpTest.sendGet("http://dbpedia.org/sparql",query));//System.out.println(URLEncoder.encode("query= select distinct ?Concept where {[] a ?Concept} LIMIT 100","UTF-8"));}}
程序的异常
发送GET请求出现异常!java.net.SocketException: Software caused connection abort: recv failed
java.net.SocketException: Software caused connection abort: recv failedat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:422)at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1890)at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1885)at java.security.AccessController.doPrivileged(Native Method)at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1884)at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1457)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)at name.dxliu.test.HttpTest.sendGet(HttpTest.java:39)at name.dxliu.test.HttpTest.main(HttpTest.java:66)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.net.SocketException: Software caused connection abort: recv failedat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)at java.net.SocketInputStream.read(SocketInputStream.java:188)at java.net.SocketInputStream.read(SocketInputStream.java:141)at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)at java.io.BufferedInputStream.read(BufferedInputStream.java:345)at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704)at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:675)at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1536)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)at sun.net.www.protocol.http.HttpURLConnection.getHeaderFields(HttpURLConnection.java:2966)at name.dxliu.test.HttpTest.sendGet(HttpTest.java:32)... 6 moreProcess finished with exit code 0
2.问题解决。
  在咨询了实验室同学无果之后,尝试向DBPedia的Support咨询。问题依然没有解决。后来实验室一同学提醒有可能是GW防火墙
的问题,于是我将程序打包到Google Cloud Shell(Google cloud shell的使用,这里不作说明,大概需要在GAE上申请账
号,创建GAE应用,然后方可使用。一个可能有用的连接为https://console.cloud.google.com/)上执行,发现异常查询
能够正常执行。于是下结论,是防火墙锅。
 
  后来将结论发布在了DBPedia的Support社区,社区人员提示我可以测试下,是查询中的某个实体触发了防火墙屏蔽还是
DBPedia的名空间被屏蔽了。后来我将查询改成如下两句:
"select ?p ?o where { <http://dbpedia.org/resource/China> ?p ?o .}"
和"select ?s where { ?s a <http://www.w3.org/2002/07/owl#Thing> } LIMIT 100" 第一条语句里面将
'Alabama'换成了'China'第二条语句里面没有了DBPedia的名空间`http://dbpedia.org/resource/`
结果显示,第一条仍然跑出Connection Reset异常,而第二条语句正常执行。可见GW是把DBPedia的名空间都给屏蔽了。

参考链接贴出我在DBPedia Support中提出的问题链接:https://dbpedia.atlassian.net/wiki/questions/7441078/problem-occurred-during-making-http-request-to-dbpedia-endpoint

Java使用SPARQL访问DBPedia Endpoint错误相关推荐

  1. JAVA Web项目中所出现错误及解决方式合集(不断更新中)

    JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...

  2. 【微信Java开发 --番外篇】错误解析

    虽然在微信开发过程中,会有微信公众平台开发者文档中的<全局返回码>作为错误的参考对比:但是依旧的,会觉得有时候的问题莫名其妙.[注:本人使用weixin-java-tools进行开发] 下 ...

  3. java语言的数组描述_下列关于Java语言的数组描述中,错误的是()。_学小易找答案...

    [单选题]下面()是正确的main()方法说明. [填空题]Java规定,如果子类中定义的成员方法与父类中定义的成员方法同名,并且参数的( )和类型以及( )的类型也相同,则父类中的同名成员方法被屏蔽 ...

  4. Java对象的访问定位

    这篇博文主要介绍Java 对象的引用方式,以及对于Java 程序设计语言中关于"引用传递"与"值传递"问题谈一谈看法. Java对象的访问定位 我们知道Java ...

  5. java代码中哪些不能犯的错误_Java程序员工作中千万不能犯的3个低级错误

    常在河边走,哪有不湿鞋.Java工程师也是人,他们也会犯错误.但是千锋广州小编提醒大家有三个错误是万万不能犯的!工作中犯了这三个错误,今年的加薪就和你say goodbye了!快看看自己是不是中枪了. ...

  6. 本地方法(JNI)——访问数组元素+错误处理

    [0]README 1) 本文文字描述 均转自 core java volume 2 , 旨在理解 本地方法(JNI)--访问数组元素+错误处理 的基础知识 : 2)for source code, ...

  7. java 私有变量访问_Java - 访问私有实例变量

    我需要从以下类列表(Species.java)访问私有变量,以便在KlingonOx.java类中使用它们. KlingonOx.java类的目的是确定大象物种的种群数量将大于克林贡牛种的数量. 这是 ...

  8. Java内存不足之PermGen space错误探究

    一.Java 程序的运行机制与普通程序,如C或C++ 程序的运行机制有很大的区别. 普通程序运行之前必须首先编译成可执行的二进制码或机器码.机器码是与底层的硬件结构相关的,即使书写源代码的时候没有利用 ...

  9. java的默认访问权限_java类的访问权限

    1.解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符. private: Java语言中对访问权限限制的最窄的修 ...

最新文章

  1. zz[as3 hack技术]垃圾回收机强制执行
  2. 【工具】更新国内使用谷歌日历解决方案——飞书日历,谷歌输入法下载
  3. Little Sub and Applese
  4. rar for android最新版,RAR for Android手机版下载-RAR for Android 安卓压缩软件v5.30 安卓版下载-腾牛安卓网...
  5. python闪光培训班 费用-Python tk 按钮颜色
  6. 三级哪个不用学c语言,考全国计算机等级考试三级如何学C语言
  7. 春节档影片的成本各是多少?
  8. 一、CI框架(CodeIgniter)简介
  9. Java前端如何发送date类型的参数给后端
  10. 企业信息化与BI系统建设规划
  11. Cesium 高性能扩展之DrawCommand(二):OSGB倾斜模型展示应用
  12. 马哥Linux第52期-第四周作业
  13. 钉钉的微应用如何测试;
  14. centos查询 硬盘序列号查询_CentOS/Linux 查看硬件配置CPU内存磁盘
  15. E. Exits in Excess
  16. ISO20000信息技术服务管理体系认证条件
  17. 【数据结构与算法】之深入解析“三维形体投影面积”的求解思路与算法示例
  18. sharepoint显示不正常_正常的吸气和呼吸、异常的呼气丨胸部HRCT表现
  19. 简单好用的果蔬肉类净化工具,让食材餐具更安全,小尼熊果蔬清洗机体验
  20. Elasticsearch Top5典型应用场景

热门文章

  1. 巧用Photoshop为透明玻璃杯抠图
  2. Excel表格数据导入
  3. 李沐学AI之数据探索性分析
  4. 十八、阿里云api调用
  5. Mac 重置 idea
  6. 三个数差的平方公式推导过程_学懂因式分解 你只差这8个完全平方公式推导结论 立马见效...
  7. 什么是数据结构?什么是算法?怎么学习数据结构与算法?
  8. 微信小程序数组更新,但视图不更新的问题
  9. BAM: Bottleneck Attention Module算法笔记
  10. 探花交友_第2章-完善个人信息与MongoDB入门