使用Python的SPARQLwrapper向DBPedia端点发送SPARQL查询时获取HTTP错误500
我想获取所有标签中包含特定字符串的属性。我使用了以下查询:
SELECT ?p ?l count(?p) as ?count WHERE {
?someobj ?p ?s .
?p a <http://www.w3.org/1999/02/22-rdf-syntax-ns#Property> .
?p <http://www.w3.org/2000/01/rdf-schema#label> ?l .
?l bif:contains "string" .
FILTER (lang(?l) = 'en').
FILTER (!isLiteral(?someobj)).
} ORDER BY DESC(?count) LIMIT 5
当我通过公共的 DBPedia 接口 @ http://dbpedia.org/sparql 发出查询时,它能正常工作,并返回我想要的结果。但是当我在我的 Python 脚本中使用 SPARQLWrapper 执行相同的查询时,我总是收到:
File "E:\thesis\sem_web21.py", line 254, in findWord
results = sparql.query().convert()
File "build/bdist.linux-i686/egg/SPARQLWrapper/Wrapper.py", line 355, in query
return QueryResult(self._query())
File "build/bdist.linux-i686/egg/SPARQLWrapper/Wrapper.py", line 334, in _query
raise e
HTTPError: HTTP Error 500: SPARQL Request Failed
我尝试了不同的查询方式,有的包含计数和排序,有的没有限制条件,但我总是收到 HTTP 500 错误。我觉得不是接口不稳定,因为在同一个脚本中其他查询都没有问题,只有这个查询出错。
类似的查询来获取对象是正常的(无论是在公共接口还是通过我的脚本):
SELECT ?s ?l count(?s) as ?count WHERE {
?someobj ?p ?s .
?s <http://www.w3.org/2000/01/rdf-schema#label> ?l .
?l bif:contains "computer" .
FILTER (!regex(str(?s), '^http://dbpedia.org/resource/Category:')).
FILTER (!regex(str(?s), '^http://dbpedia.org/resource/List')).
FILTER (!regex(str(?s), '^http://sw.opencyc.org/')).
FILTER (lang(?l) = 'en').
FILTER (!isLiteral(?someobj)).
} ORDER BY DESC(?count) LIMIT 20
你觉得这可能是什么原因呢?或者有没有办法让我获取更具体的错误信息?提前谢谢你。
2 个回答
1
COUNT这个表达式应该写成(count(?p) as ?count)
,记得加上括号。
我不确定这是不是问题所在,但觉得有必要提醒一下。
2
我觉得这是dbpedia那边的超时错误,因为它在不同的图中查找数据。当你通过dbpedia的网站界面进行查询时,它总是会包含你要查询的图的URI。所以你可以试着把这个URI加到你的查询中:
SELECT ?p ?l count(?p) as ?count FROM <http://dbpedia.org> WHERE {
?someobj ?p ?s .
?p a <http://www.w3.org/1999/02/22-rdf-syntax-ns#Property> .
?p <http://www.w3.org/2000/01/rdf-schema#label> ?l .
?l bif:contains "string" .
FILTER (lang(?l) = 'en').
FILTER (!isLiteral(?someobj)).
} ORDER BY DESC(?count) LIMIT 5
然后再试一次。
我用下面的Python脚本试了一下:
import sys
import urllib,urllib2
def query_e(query,epr,soft_limit=True):
try:
params = urllib.urlencode({'query': query})
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request(epr+'?'+params)
request.add_header('Accept', 'application/json')
request.get_method = lambda: 'GET'
url = opener.open(request)
data = url.read()
return data
except Exception, e:
traceback.print_exc(file=sys.stdout)
raise e