【问题标题】:QueryBadFormed using Uniprot SPARQL endpointQueryBadFormed 使用 Uniprot SPARQL 端点
【发布时间】: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


【解决方案1】:

问题不在于您的代码,而在于运行 sparql.uniprot.org 端点的两台服务器之一。如果你请求去'好'机器它工作,如果它去'坏'机器它失败。两台机器现在应该都不错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多