2011-05-04 33 views
8

我想查詢遠程端點並獲取owl:sameAs映射,我已經嘗試了RDFLib和Redland,但都沒有爲我工作,可能我沒有處理命名空間正確。在遠程遠程端點上的SPARQL查詢RDFLib/Redland

這是我在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 

這裏是雷德蘭:

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 

能否請您給一個提示什麼是錯在那些中的任何一個? 我還有另外一個難題:是否有可能獲得對象的數據集名稱?例如:如果有:

?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 

我可以在這個例子中得到「Dbpedia」的名字嗎?或任何其他數據集,我有sameAs鏈接? (或者也許我可以只查找對象字符串中感興趣的數據集的名字)非常感謝你非常事先

回答

12

各種各樣的東西:

你是對的,你需要內<>包圍任何URI。正確的查詢是:

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

...查看結果here

FROM未在rdflib或redland中實現,因爲您認爲它是。它不會獲取遠程SPARQL端點,它會在本地存儲中獲取具有該名稱的遠程圖形或圖形。在你的情況下,你想使用SERVICEhow it works here with Jena。遺憾的是,rdflib和redland都沒有針對SPARQL實現SERVICE子句,但有一些解決方法可以將其解決。

一個可能的解決方案是使用SPARQLWrapper for python。這是微不足道的,在這裏你有你的代碼庫:

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

正如你所看到的遠程SPARQL端點成爲查詢以外的參數。

3

雷德蘭證明目前不支持使用SPARQL端點FROM。你在這裏使用的是你加載到RDF數據集中的圖名。當您使用類似model.context_add_statement(statement, context)

加載三元組(s,p,o)+ c時,也稱爲redland上下文Rasqal GIT確實支持解析SERVICE,但尚未在查詢中執行它。