2011-08-23 124 views
4

我目前正在使用Ruby on Rails SPARQL客户端尝试从dbpedia的公共SPARQL端点检索信息。我正在运行的通用查询如下:Ruby on Rails SPARQL客户端

query = " 
     PREFIX dbo: <http://dbpedia.org/ontology/> 
     PREFIX prop: <http://dbpedia.org/property/> 
     PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
     PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
     SELECT * WHERE { 
     ?city prop:name 'Antwerpen'@en; 
       a dbo:PopulatedPlace; 
       dbo:abstract ?abstract . 
     FILTER langMatches(lang(?abstract), 'en') 
     OPTIONAL { ?city foaf:homepage ?homepage } 
     OPTIONAL { ?city rdfs:comment ?comment . 
        FILTER langMatches(lang(?comment), 'en') } 
     }" 

这是一个通用查询,它从dbpedia返回有关城市的一些常规信息。我已经在sparql端点上手动测试了它,它检索我期望它返回的信息。 但是,我似乎无法找到一种方法来解析Ruby on Rails中的响应。

目前我与RDF想这对RubySPARQL客户端。代码看起来像这样(根据我能找到的例子):

result = {} 
    client = SPARQL::Client.new("http://dbpedia.org/sparql") 
    client.query(query).first.each_binding { |name, value| result[name] << value} 
    result 

但我无法检索任何东西。当使用调试器手动进入变量时,只要执行查询就会停止,并且我甚至无法查看返回值。

任何人都有一个关于如何针对SPARQL端点执行查询并解析响应的好例子?

+0

重复上http://answers.semanticweb.com/questions/11263/sparql-endpoint-in-ruby-on-rails – RobV

+0

现在有dbpedia gem与sparql支持https://github.com/farbenmeer/dbpedia – mahemoff

回答

4

我只是想你的代码(与未成年人修改使用=代替< <),它似乎工作:

require 'rubygems' 
require 'sparql/client' 

query = " 
    PREFIX dbo: <http://dbpedia.org/ontology/> 
    PREFIX prop: <http://dbpedia.org/property/> 
    PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
    SELECT * WHERE { 
    ?city prop:name 'Antwerpen'@en; 
      a dbo:PopulatedPlace; 
      dbo:abstract ?abstract . 
    FILTER langMatches(lang(?abstract), 'en') 
    OPTIONAL { ?city foaf:homepage ?homepage } 
    OPTIONAL { ?city rdfs:comment ?comment . 
       FILTER langMatches(lang(?comment), 'en') } 
    }" 

result = {} 
client = SPARQL::Client.new("http://dbpedia.org/sparql") 
client.query(query).first.each_binding { |name, value| result[name] = value} 
p result 

,当我运行它:

$ jruby sparql.rb 
{:city=>#<RDF::URI:0x890(http://dbpedia.org/resource/Antwerp)>, :abstract=>#<RDF::Literal:0x892("Antwerp is a city and municipality in Belgium and the capital of the Antwerp province in Flanders, one of Belgium's three regions. Antwerp's total population is 472,071 (as of 1 January 2008) and its total area is 204.51 km, giving a population density of 2,308 inhabitants per km\u00B2. The metropolitan area, including the outer commuter zone, covers an area of 1,449 km with a total of 1,190,769 inhabitants as of 1 January 2008. The nickname of inhabitants of Antwerp is Sinjoren, after the Spanish word se\u00F1or, which means 'mister' or 'gent'. Antwerp has long been an important city in the nations of the Benelux both economically and culturally, especially before the Spanish Fury of the Dutch Revolt. It is located on the right bank of the river Scheldt, which is linked to the North Sea by the estuary Westerschelde."@en)>, :homepage=>#<RDF::URI:0x898(http://www.antwerpen.be/)>, :comment=>#<RDF::Literal:0x89a("Antwerp is a city and municipality in Belgium and the capital of the Antwerp province in Flanders, one of Belgium's three regions. Antwerp's total population is 472,071 (as of 1 January 2008) and its total area is 204.51 km, giving a population density of 2,308 inhabitants per km\u00B2. The metropolitan area, including the outer commuter zone, covers an area of 1,449 km with a total of 1,190,769 inhabitants as of 1 January 2008."@en)>} 

鉴于你描述可能是你有连接问题,或者dbpedia可能已经被重载。

+0

我会再次看看它在工作中的表现,也许在Windows上jruby和ruby之间有区别 –

+0

这是不太可能的(尽管不是不可能),这是不同的。根据我的经验,dbpedia端点可能无法预测,所以我的钱就是这样。 – user205512

+0

好吧,很高兴知道。 JSON目前也在运作,所以我现在坚持使用这个解决方案。 –