Question

J'essaie d'interroger les points de terminaison distants et d'obtenir les mappages get owl: sameAs, j'ai essayé à la fois RDFLib et Redland mais aucun n'a fonctionné pour moi, je ne traite probablement pas correctement les espaces de noms.

Voici ma tentative dans 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

Et voici 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

Pouvez-vous nous dire ce qui ne va pas dans l'un de ces éléments? Encore une autre difficulté que j'ai: est-il possible d'obtenir le nom de l'ensemble de données de l'objet?Par exemple: s'il y a:

?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

Puis-je obtenir le nom du "Dbpedia" dans cet exemple?Ou tout autre ensemble de données vers lequel j'ai un lien sameAs?(Ou probablement je pourrais simplement rechercher les noms des ensembles de données intéressés dans la chaîne d'objet) merci beaucoup TRÈS à l'avance

Était-ce utile?

La solution

Diverses choses:

Vous avez raison, vous devez inclure n'importe quel URI dans < >. La requête correcte est:

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

... voir les résultats ici .

FROM n'est pas implémenté dans rdflib ou redland comme vous le pensez. Il ne récupère pas les points de terminaison SPARQL distants, il récupère les graphiques distants ou les graphiques portant ce nom dans un magasin local. Dans votre cas, vous souhaitez utiliser SERVICE voir comment cela fonctionne ici avec Jena . Malheureusement, ni rdflib ni redland n'implémentent la clause SERVICE pour SPARQL, mais il existe des solutions de contournement pour résoudre ce problème.

Une solution possible consiste à utiliser SPARQLWrapper pour python . C'est trivial, vous avez ici votre code avec cette bibliothèque:

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']

Comme vous pouvez le voir, le point de terminaison SPARQL distant devient un paramètre en dehors de la requête.

Autres conseils

Redland ne prend actuellement pas en charge l'utilisation de points de terminaison SPARQL dans FROM.Ce que vous utilisez ici sont des noms de graphes que vous chargez dans le jeu de données RDF.Aussi connu sous le nom de contextes redland lorsque vous chargez un triplet (s, p, o) + c avec quelque chose comme model.context_add_statement(statement, context)

Rasqal GIT prend en charge l'analyse du SERVICE mais ne l'exécute pas encore dans une requête.

Vous pouvez également envisager d'utiliser Virtuoso with RedLand pour implémenter leParamètre SPARQL-FED "Service" pour l'exécution de requêtes à distance, comme illustré dans ces exemples en ligne

Il existe une autre solution simple dans l'entrée de blog à l'adresse http://terse-words.blogspot.com/2012/01/get-real-data-from-semantic-web.html qui maintient le code assez propre.Il utilise également SPARQLWrapper.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top