2015-02-11 3 views
0

Я пытаюсь получить результаты от BNCF по адресу this endpoint.Ошибка Sparql Ошибка JSON от конечной точки BNCF

Мой запрос (с «AB» в качестве примера) является:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
SELECT DISTINCT ?source ?label ?content 
       WHERE { 
        ?source a skos:Concept; 
         skos:prefLabel ?label; 
         skos:scopeNote ?content. 
       FILTER regex(str(?label), "ab", "i") 
      } 

Запрос правильно на самом деле, если вы попытаетесь запустить это работает. Но когда я пытаюсь получить результаты от моего питона это ошибка:

SyntaxError: JSON Parse error: Unexpected EOF 

Это мой питон код:

__3store = "http://digitale.bncf.firenze.sbn.it/openrdf-workbench/repositories/NS_03_2014/query" 
sparql = SPARQLUpdateStore(queryEndpoint=__3store) 
sparql.setReturnFormat(JSON) 
results = sparql.query(query_rdf).convert() 
print json.dumps(result, separators=(',',':')) 

Я попытался код, указанный выше в соответствии с this answer, прежде чем мой код был вот так:

__3store = "http://digitale.bncf.firenze.sbn.it/openrdf-workbench/repositories/NS_03_2014/query" 
sparql = SPARQLWrapper(__3store,returnFormat="json") 
sparql.setQuery(query_rdf) 
result = sparql.query().convert() 
print json.dumps(result, separators=(',',':')) 

но оба эти же ошибки.

Кто-нибудь знает, как это исправить? Благодаря

EDIT:

Это питон код, надеюсь, что это достаточно, чтобы понять

import sys 
sys.path.append ('cgi/lib') 
import rdflib 
from rdflib.plugins.stores.sparqlstore import SPARQLUpdateStore, SPARQLStore 
import json 
from SPARQLWrapper import SPARQLWrapper, JSON 

#MAIN 
print "Content-type: application/json" 
print 
prefix_SKOS =  "prefix skos:  <http://www.w3.org/2004/02/skos/core#>" 
crlf = "\n" 
query_rdf = "" 
query_rdf += prefix_SKOS + crlf 
query_rdf += ''' 
      SELECT DISTINCT ?source ?title ?content 
       WHERE { 
        ?source a skos:Concept; 
         skos:prefLabel ?title; 
         skos:scopeNote ?content. 
       FILTER regex(str(?title), "ab", "i") 
      } 

     ''' 
__3store = "http://digitale.bncf.firenze.sbn.it/openrdf-workbench/repositories/NS_03_2014/query" 
sparql = SPARQLWrapper(__3store,returnFormat="json") 
sparql.setQuery(query_rdf) 
result = sparql.query().convert() 

print result 

Запуск этого в возвратов Python оболочки:

Content-type: application/json 


Warning (from warnings module): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SPARQLWrapper-1.6.4-py2.7.egg/SPARQLWrapper/Wrapper.py", line 689 
RuntimeWarning: Format requested was JSON, but XML (application/sparql-results+xml;charset=UTF-8) has been returned by the endpoint 
<xml.dom.minidom.Document instance at 0x105add710> 

Так что я думаю, результатом всегда является XML, если я специфицировал Json как формат возврата.

+0

Вы можете увидеть фактический JSON, который возвращаемой? –

+0

Кроме того, было бы неплохо, если бы вы могли предоставить минимальный пример, который мы можем запустить, чтобы воспроизвести проблему. Это не может быть намного больше, чем код, который вы на самом деле показывали. В строке запроса также содержатся необходимые префиксы? Иногда конечные точки будут определять их для интерактивного/веб-использования (хотя, похоже, это не похоже на это), но обычно не для запросов, отправленных на конечную точку. –

+0

Нет. Я не вижу реального JSON, эта ошибка вызывается ошибкой «error:» моего вызова Ajax. Поэтому мне кажется, что он не может выполнить запрос вообще, потому что он никогда не получает «успех:». –

ответ

0

Есть несколько проблем, играющих вместе здесь:

Во-первых, вы должны использовать только SPARQLUpdateStore из RDFLib, если вы хотите получить доступ к магазин SPARQL через интерфейс Graph RDFLib (например, вы можете добавить троек, вы можете перебирать над ними и т. д.). Если вы хотите написать запрос SPARQL самостоятельно, вы должны использовать SPARQLWrapper.

Во-вторых, если вы спросите SPARQLWrapper вернуть JSON, что он делает на самом деле запрашивает сервер для нескольких типов пантомимы, которые являются наиболее распространенными и стандартизированы для того, что мы просто называем «JSON», как показано here и here:

_SPARQL_JSON = ["application/sparql-results+json", "text/javascript", "application/json"] 

кажется, как будто ваш Sever, понимает application/sparql-results+json, но не комбинированный «дать мне какую-либо из этих мимов-типов заголовка», как RDFLib компилирует его для максимальной совместимости (так что ваш сервер по существу не полностью поддерживает HTTP Accept Headers) :

curl -i -G -H 'Accept: application/sparql-results+json' --data-urlencode 'query=PREFIX skos: 
<http://www.w3.org/2004/02/skos/core#> 
SELECT DISTINCT ?source ?label ?content 
WHERE { 
?source a skos:Concept; 
skos:prefLabel ?label; 
skos:scopeNote ?content. 
FILTER regex(str(?label), "ab", "i") 
}' http://digitale.bncf.firenze.sbn.it/openrdf-workbench/repositories/NS_03_2014/query 

вернется:

HTTP/1.1 200 OK 
Date: Mon, 18 May 2015 13:13:45 GMT 
Server: Apache/2.2.17 (Unix) PHP/5.3.6 mod_jk/1.2.31 
... 
Content-Type: application/sparql-results+json;charset=UTF-8 

{ 
    "head" : { 
    "vars" : [ ], 
    "vars" : [ "source", "label", "content" ], 
    "link" : [ "info" ] 
    }, 
    "results" : { 
    "bindings" : [ { 
     "content" : { 
     "type" : "literal", 
     "value" : "Il lasciare ingiustificatamente qualcuno o qualcosa di cui si è responsabili" 
     }, 
     "source" : { 
     "type" : "uri", 
     "value" : "http://purl.org/bncf/tid/12445" 
     }, 
     "label" : { 
     "xml:lang" : "it", 
     "type" : "literal", 
     "value" : "Abbandono" 
     } 
    }, 
... 

так что все в порядке, но если мы просим объединенным, более совместимых типов пантомимы:

curl -i -G -H 'Accept: application/sparql-results+json,text/javascript,application/json' --data-urlencode 'query=PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
SELECT DISTINCT ?source ?label ?content 
WHERE { 
?source a skos:Concept; 
skos:prefLabel ?label; 
skos:scopeNote ?content. 
FILTER regex(str(?label), "ab", "i") 
}' http://digitale.bncf.firenze.sbn.it/openrdf-workbench/repositories/NS_03_2014/query 

мы получаем результат XML:

HTTP/1.1 200 OK 
Server: Apache/2.2.17 (Unix) PHP/5.3.6 mod_jk/1.2.31 
... 
Content-Type: application/sparql-results+xml;charset=UTF-8 

<?xml version='1.0' encoding='UTF-8'?> 
... 

Короче говоря: это ошибка на сервере, который вы используете. Ниже противный обходной путь (кажется SPARQLWrapper не только позволяет вручную установить заголовки, но безоговорочно отвергает их в _createRequest), но это работает:

In [1]: import SPARQLWrapper as sw 

In [2]: sparql = sw.SPARQLWrapper("http://digitale.bncf.firenze.sbn.it/openrdf-workbench/repositories/NS_03_2014/query") 

In [3]: sparql.setReturnFormat(sw.JSON) 

In [4]: sparql.setQuery('''                          PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
SELECT DISTINCT ?source ?label ?content 
       WHERE { 
        ?source a skos:Concept; 
         skos:prefLabel ?label; 
         skos:scopeNote ?content. 
       FILTER regex(str(?label), "ab", "i") 
      } 
''') 

In [5]: request = sparql._createRequest() 

In [6]: request.add_header('Accept', 'application/sparql-results+json') 

In [7]: from urllib2 import urlopen 

In [8]: response = urlopen(request) 

In [9]: res = sw.Wrapper.QueryResult((response, sparql.returnFormat)) 

In [10]: result = res.convert() 

In [11]: result 
Out[11]: 
{u'head': {u'link': [u'info'], u'vars': [u'source', u'label', u'content']}, 
u'results': {u'bindings': [{u'content': {u'type': u'literal', 
    u'value': u'Il lasciare ingiustificatamente qualcuno o qualcosa di cui si \xe8 responsabili'}, 
    u'label': {u'type': u'literal', 
    u'value': u'Abbandono', 
    u'xml:lang': u'it'}, 
    u'source': {u'type': u'uri', u'value': u'http://purl.org/bncf/tid/12445'}}, 
    ... 
+0

дальнейшее обсуждение на https://github.com/RDFLib/sparqlwrapper/issues/52 – wikier