一个ruby SPARQL查询,SELECT(s)为给定主题的三倍

时间:2014-01-16 15:32:35

标签: ruby rdf sparql

我正在使用以下ruby库来查询SPARQL endpont。 http://ruby-rdf.github.io/sparql-client/

我真的很接近实现我的目标。使用以下代码,我可以打印出数据库中的所有三元组。

sparql = SPARQL::Client.new("http://localhost:3030/ds/query")
query = sparql.select.where([:s, :p, :o]).offset(100).limit(1000)
query.each_solution do |solution|
puts solution.inspect
end

但是现在我想稍微改变这一点并选择给定主题的所有三元组。我认为以下内容可行,但事实并非如此。

sparql = SPARQL::Client.new("http://localhost:3030/ds/query")
itemname = "lectio1"    
query = sparql.select.where(["<http://scta.info/items/#{itemname}>", :p, :o]).offset(100).limit(1000)
query.each_solution do |solution|
puts solution.inspect
end

这可以在一个简单的SPARQL语法中工作,但不知何故用我想要查询的文字主题替换符号:s不起作用。 Sinatra给我的错误是:

  

预期为零或期限,为"<http://scta.info/items/lectio1>";

1 个答案:

答案 0 :(得分:0)

正如你在评论中所说,

  

Sinatra给我的错误是:预期受制于   零或一个词,是"<http://scta.info/items/lectio1>"

您正在将该方法设为字符串,但它期望nil或一个术语。它所期望的那种术语是RDF::Term。在您的特定情况下,您需要一个URI(它是RDF :: Resource的子类,它是RDF :: Term的子类)。您可以使用

创建您要查找的参考
RDF::URI.new("http://scta.info/items/#{itemname}")

因此您应该能够将代码更新为以下内容(并且根据您的导入,您可以删除RDF::前缀):

sparql = SPARQL::Client.new("http://localhost:3030/ds/query")
itemname = "lectio1"    
query = sparql.select.where([ RDF::URI.new("http://scta.info/items/#{itemname}"), :p, :o]).offset(100).limit(1000)
query.each_solution do |solution|
  puts solution.inspect
end