Rails 4-迭代RDF :: Query :: Solutions& RDF ::查询::解决方案

时间:2016-03-16 15:13:38

标签: ruby-on-rails sparql rdf

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

  

发现的概念

     

类:类RDF :: Query :: Solutions

     

伯爵:6859级

     

第一个查询解决方案:

     #      

URI:...资源/ 3rd_Guards_Infantry_Division_(German_Empire)>中   :战斗=>#})>

     

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

           

类:RDF :: Query :: Solution

     

检查:

     #      

URI:...资源/ 3rd_Guards_Infantry_Division_(German_Empire)>中   :战斗=>#})>

     

类:RDF :: Query :: Solution

     

检查:

     #      

URI:...资源/ 3rd_Guards_Infantry_Division_(German_Empire)>中   :战斗=>#})>

输出由以下几行产生:

<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时,我没有得到任何错误。我的代码如下所示(与上面相同,除了单个添加的行<p>Unit: <%= solution.unit %></p>

<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 %>

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

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

1 个答案:

答案 0 :(得分:0)

您可以发布查询代码吗?

一个可能的原因是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 则不会。{/ p>

例如,我做了:

#unit

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

另一个~300会给出你所看到的行为。如果这是您的情况,您可以#bound?(:unit)#respond_to?为条件,或以其他方式过滤未绑定的项目。

我添加了patch,这使admin稍微好一些。我将推动1.x版本系列的后退。

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