【发布时间】:2020-07-20 13:08:05
【问题描述】:
我正在使用 SPARQLWrapper 从 Python 编写 SPARQL 查询。端点是 Uniprot,但 50% 的时间,执行代码时出错:
def getReviewProt(accession):
#print(accession)
mystring = '(uniprot:' + ') (uniprot:'.join(accession) + ')'
#print(mystring)
sparql = SPARQLWrapper("http://sparql.uniprot.org/sparql")
sparql.setQuery("""
PREFIX up_core: <http://purl.uniprot.org/core/>
PREFIX up_taxonomy: <http://purl.uniprot.org/taxonomy/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX apf: <http://jena.hpl.hp.com/ARQ/property#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX uniprot: <http://purl.uniprot.org/uniprot/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?is_true
WHERE
{
VALUES (?ac) {"""+mystring+"""}
?ac up_core:reviewed ?is_true
}
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
return results
if __name__ == '__main__' :
import sys
#print(sys.path)
accession = ["Q6GZX4","Q96375","B1XBG2"]
res = getReviewProt(accession)
for r in res['results']['bindings']:
print(r['is_true']['value'])
所以我得到了这个错误:
QueryBadFormed: a bad request has been sent to the endpoint, probably the sparql query is bad formed
当我尝试查看确切的错误时,这是我得到的:
Exception:virtuoso.jdbc4.VirtuosoException: SQ156: Internal Optimized compiler error : sqlo table has no index in sqldf.c:3782.
Please report the statement compiled
最奇怪的是,当我尝试执行它时,它可以工作,但有 50% 的时间。在此地址的端点中进行查询时,我得到完全相同的错误:http://sparql.uniprot.org/sparql。有时它工作得很好,所以我迷路了,当然,我希望我的程序每次执行时都能正常工作。 他们在端点中使用 Virtuoso 软件,所以我猜问题来自那里,但我不知道 Virtuoso 是如何工作的。 我是 SPARQL 的新手,所以我很难理解和解决所有错误, 谁能帮我 ?或者如果这个问题已经解决了,我很高兴有这个链接:) 谢谢
【问题讨论】:
-
该查询大部分时间都有效......这显然是一个非常基本的查询,所以也许您的某些实体无效?我的意思是,您使用的是 URI 的前缀形式,所以也许其中一些确实包含前缀形式的非法字符?
-
也就是说,整个端点是公共免费服务,不保证一直工作。显而易见的方法是下载数据并将其加载到您自己的三重存储中。这是保证 24/7 的唯一方法。我的意思是,如果他们决定关闭服务器或只进行几小时/几天的维护,你会怎么做?但是,是的,它也可能只是 Virtuoso 后端中的一个错误,尽管我会先检查您失败的查询。
-
您好@UninformedUser,感谢您的回答。我认为问题也可能是因为我使用 python 列表作为参数(查询中的 mystring),也许这会导致问题......但我使用了与 Uniprot 命名空间相同的前缀,所以通常它应该是正确的方式,不是吗?
-
我的意思是,您不能以资源的前缀形式处理所有字符。像
uniprot:foo/bar对包含未转义的/字符的本地表单无效。所以我的问题,你能重现错误吗?我的意思是,您应该能够跟踪 Python 列表的元素,对吧? -
是的,当然,这里的前缀
uniprot:与登录号一起使用,一串字符(只有大写的字母和数字)直接为我们提供了蛋白质的页面,因此可以不是那种字符,我打印了我的python列表中的项目,这没有问题,我的意思是我会看到它有一个错误,因为我有一个小列表,但我记住它以防万一它会发生
标签: python sparql virtuoso sparqlwrapper