【问题标题】:Rails 4- iterating over RDF::Query::Solutions & RDF::Query::SolutionRails 4- 迭代 RDF::Query::Solutions & RDF::Query::Solution
【发布时间】:2016-07-02 13:44:16
【问题描述】:

我有一个处理一些 sparql 查询结果的小型 Rails 应用程序。 sparql 创建了一个包含 6859 个解决方案的解决方案集 @solutions_array。解决方案集属于 RDF::Query::Solutions 类,其中包含 RDF::Query::Solutions 类的 6859 个实例。每个 RDF::Query::Solution 包含两个变量,:unit 和:battle。根据文档,这些应该以 solution.unit 和 solution.battle 的形式提供。当我使用@solutions_array.first.unit 时,我得到了完全预期的结果。我的输出中破折号上方的所有内容都按预期工作。

发现的概念

类:类 RDF::Query::Solutions

计数:6859 类

第一个查询解决方案:

#

URI:...resource/3rd_Guards_Infantry_Division_(German_Empire)>, :battle=>#})>

第一单元: ...resource/3rd_Guards_Infantry_Division_(German_Empire)


类:RDF::Query::Solution

检查:

#

URI:...resource/3rd_Guards_Infantry_Division_(German_Empire)>, :battle=>#})>

类:RDF::Query::Solution

检查:

#

URI:...resource/3rd_Guards_Infantry_Division_(German_Empire)>, :battle=>#})>

输出由以下几行产生:

<div class="span3 offset1">
      <h2> Discovered Concepts </h2>
            <P>Class:  class <%= @solutions_array.class %> </p> 
            <P>Count:  class <%= @solutions_array.count %> </p> 
            <p>First Query Solution: <%= @solutions_array.first.inspect %></p>
            <p>First Unit: <%= @solutions_array.first.unit %></p>
            <p>-------------------------------------------------</p>        
            <%= @solutions_array.each do |solution| %>
              <p>Class: <%= solution.class %></p>
              <p>Inspect: <%= solution.inspect %></p>

            <% end %>

现在,当我在迭代解决方案时尝试访问我的变量时,{|solution| puts solution.battle } 抛出错误“方法未知”。当我使用 irb 尝试相同的操作时,我没有收到任何错误。我的代码如下所示(与上面相同,除了单个添加行&lt;p&gt;Unit: &lt;%= solution.unit %&gt;&lt;/p&gt;

<div class="span3 offset1">
      <h2> Discovered Concepts </h2>
            <P>Class:  class <%= @solutions_array.class %> </p> 
            <P>Count:  class <%= @solutions_array.count %> </p> 
            <p>First Query Solution: <%= @solutions_array.first.inspect %></p>
            <p>First Unit: <%= @solutions_array.first.unit %></p>
            <p>-------------------------------------------------</p>        
            <%= @solutions_array.each do |solution| %>
              <p>Class: <%= solution.class %></p>
              <p>Inspect: <%= solution.inspect %></p>
              <p>Unit: <%= solution.unit %></p>
            <% end %>

运行此代码会导致:

   > NoMethodError in Pages#extract

    > Showing/.../app/views/pages/extract.html.erb where line #20 raised:
    > undefined method `unit' for #<RDF::Query::Solutions:0x007fd17b17bca0>
    > Extracted source (around line #20): 
20   <p>Unit: <%= solution.unit %>

有趣的是,错误表明“单元”不是 RDF::Query::Solutions 类的方法......原则上是正确的,但 solution.inspect 表明我正在处理一个实例类 RDF::Query::Solution 的变量名应该可用...

我做错了什么?或者这是 RDF.rb 中的错误?

【问题讨论】:

    标签: ruby-on-rails sparql rdf


    【解决方案1】:

    你能发布查询代码吗?

    一个可能的原因是 SPARQL 查询中的 optional 子句,这将导致某些变量在结果中未绑定。在这种情况下,您的某些RDF::Query::Solutions 将具有:unit 的变量绑定,而其他则没有。

    例如,我做了:

    results = client.select(:s, :p, :o, :contains).where([:s, :p, :o])
      .optional([:s, RDF::URI('http://www.w3.org/ns/ldp#contains'), :contains])
      .execute
    
    results.count  #=> 866
    
    contains = results.to_a.select { |solutions| solution.bound?(:contains) }
    contains.count #=> 575
    

    我的 SPARQL 端点中的 866 个三元组中有 575 个与可选模式中的谓词匹配。

    另外的 ~300 会给出你看到的行为。如果您遇到这种情况,您可以让您的#unit 呼叫以#bound?(:unit) 为条件,或者过滤未绑定的项目。

    我添加了一个patch,这使得#respond_to? 稍微好一点。我将推动 1.x 版本系列的反向移植。

    如果这没有帮助,发布一组有限的示例数据和一个可以重现问题的查询将有助于我们追踪问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多