【问题标题】:A ruby SPARQL query that SELECT(s) all triples for a given subject一个 ruby​​ SPARQL 查询,它为给定主题选择所有三元组
【发布时间】:2014-01-16 15:32:35
【问题描述】:

我正在使用以下 ruby​​ 库来查询 SPARQL 端点。 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 给我的错误是:

预期的主题为 nil 或一个术语,为 "&lt;http://scta.info/items/lectio1&gt;"

【问题讨论】:

标签: ruby rdf sparql


【解决方案1】:

正如您在 cmets 中所指出的,

Sinatra 给我的错误是:预期的主题是
nil 或一个术语,是"&lt;http://scta.info/items/lectio1&gt;"

您正在向该方法传递一个字符串,但它需要 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多