2011-05-04 35 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,但尚未在查询中执行它。