我正在尝试接收标签包含特定字符串的所有属性。我使用以下查询:
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 500s。我不认为端点是不稳定的,因为我对同一个脚本中的其他查询没有任何问题,它只会停止此查询。
检索对象的类似查询工作正常(在公共端点和通过我的脚本):
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
知道可能导致这种情况的原因是什么?或者任何想法如何检索更具体的错误?提前谢谢。
答案 0 :(得分:2)
我认为这是dbpedia的一个超时错误,因为它在不同的图表中查找它。当您通过dbpedia Web界面进行尝试时,它始终包含您要查询的图形的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
答案 1 :(得分:1)
COUNT表达式应为(count(?p) as ?count)
,并带括号。
不确定这是问题,但我想我应该指出来。