我正在使用以下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>"
;
答案 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