2011-05-04 9 views
8

Estoy tratando de consultar puntos finales remotos y obtener búho: sameAs mapeos, he probado RDFLib y Redland pero ninguno de los dos funcionó, probablemente no estoy tratando con espacios de nombres correctamenteconsulta SPARQL en el punto remoto remoto RDFLib/Redland

Aquí está mi intento de rdflib:

import rdflib 

    rdflib.plugin.register('sparql', rdflib.query.Processor, 'rdfextras.sparql.processor', 'Processor') 
    rdflib.plugin.register('sparql', rdflib.query.Result, 'rdfextras.sparql.query', 'SPARQLQueryResult') 

    g = rdflib.Graph() 

    query = """ 
     SELECT * 
     FROM <http://api.talis.com/stores/bbc-backstage/services/sparql> 
     WHERE { 
      ?s a http://purl.org/ontology/mo/MusicArtist; 
       http://www.w3.org/2002/07/owl#sameAs ?o . 
     }Limit 50 
    """ 

    for row in g.query(query): 
     print row 

Y aquí es Redland:

import RDF 
model = RDF.Model() 

query = """ 
    SELECT * 
    FROM <http://api.talis.com/stores/bbc-backstage/services/sparql> 
    WHERE { 
     ?s a http://purl.org/ontology/mo/MusicArtist; 
      http://www.w3.org/2002/07/owl#sameAs ?o . 
    }Limit 50 
""" 

for statement in RDF.Query(query ,query_language="sparql").execute(model): 
    print statement 

Puede por favor dar una pista de lo que está mal en cualquiera de esos? Otra dificultad más que tengo: ¿es posible obtener el nombre del conjunto de datos del objeto? Por ejemplo: si existe:

?s = http://www.bbc.co.uk/music/artists/eb5c8564-927d-414d-b152-c7b48a2c9d8b#artist 
predicate = http://www.w3.org/2002/07/owl#sameAs 
?0 = http://dbpedia.org/resource/The_Boy_Least_Likely_To 

¿Puedo obtener el nombre de "Dbpedia" en este ejemplo? ¿O cualquier otro conjunto de datos al que estoy teniendo el mismo vínculo? (O probablemente podría sólo de consulta de nombres de conjuntos de datos interesadas en la cadena de objetos) muchas gracias mucho por adelantado

Respuesta

12

Varias cosas:

Tienes razón, es necesario adjuntar cualquier URI dentro <>. La consulta correcta es:

SELECT ?s ?o WHERE { 
     ?s a <http://purl.org/ontology/mo/MusicArtist>; 
      <http://www.w3.org/2002/07/owl#sameAs> ?o . 
    } limit 50 

... ver los resultados here.

FROM no está implementado en rdflib o redland como cree que es. No busca puntos finales SPARQL remotos, busca gráficos o gráficos remotos con ese nombre en una tienda local. En su caso, usted desea usar SERVICE, ver how it works here with Jena. Desafortunadamente, ni rdflib ni redland implementan la cláusula SERVICE para SPARQL, pero existen soluciones para solucionar esto.

Una posible solución es usar SPARQLWrapper for python. Es trivial, aquí tienes tu código con esa biblioteca:

from SPARQLWrapper import SPARQLWrapper, JSON 

sparql = SPARQLWrapper("http://api.talis.com/stores/bbc-backstage/services/sparql") 
sparql.setQuery(""" 
    SELECT ?s ?o 
    WHERE { 
     ?s a <http://purl.org/ontology/mo/MusicArtist>; 
      <http://www.w3.org/2002/07/owl#sameAs> ?o . 
    } limit 50 
""") 
sparql.setReturnFormat(JSON) 
results = sparql.query().convert() 

for result in results["results"]["bindings"]: 
    print result["s"]['value'], result["o"]['value'] 

Como se puede ver el punto final SPARQL a distancia se convierte en un parámetro fuera de la consulta.

3

Redland ¿Apoya que actualmente no utilizan criterios de valoración SPARQL en FROM. Lo que está utilizando aquí son nombres de gráfico que carga en el conjunto de datos RDF. También conocido como contextos de redland cuando carga un triple (s, p, o) + c con algo como model.context_add_statement(statement, context)

Rasqal GIT soporta el análisis SERVICE pero aún no lo ejecuta en una consulta.