Re: SPARQL::Client::Repository and Spira

The issue is in the SPARQL repository, which is currently handing off
hash queries to the default rdf.rb implementation.  I think this may
end up being an RDF.rb bug, because as I recall, repositories are only
supposed to need to define query_pattern these days, which the SPARQL
repo does.  It also defines query, though, which may be its own bug.

Unfortunately there's no immediate workaround for this, because Spira
defines the query, and uses the hash form.  One would have to hack the
repository or Spira for an immediate solution.

Issue opened for SPARQL client at
http://github.com/bendiken/sparql-client/issues/issue/11

A minimal reproduction is (I had a hacked local copy of SPARQL repo to
inspect on query to find this):

#!/usr/bin/env ruby

require 'sparql/client'

repo = SPARQL::Client::Repository.new 'http://sparql.org/books'

p repo.query(:subject => RDF::URI.new("http://example.com/foo/1")).to_a
#=> "CONSTRUCT { ?s ?p ?o . } WHERE { ?s ?p ?o . }"
p repo.query(RDF::Statement.new(RDF::URI.new("http://example.com/foo/1"),
nil, nil)).to_a
#=> "CONSTRUCT { <http://example.com/foo/1> ?p ?o . } WHERE {
<http://example.com/foo/1> ?p ?o . }"

Thanks for reporting this.  As it's an undeniable catastrophe for
Spira, I'm going to get it done as soon as I remind myself what the
correct way to do it is.  Unfortunately that might be as late as
Wednesday.

Ben

On Sun, Oct 10, 2010 at 1:26 PM, Ben Lavender <blavender@gmail.com> wrote:
> Going over this initially, I'm not sure why it would be happening.
> #empty? is being called on a query result set, not the repository.
>
> Unfortunately, I'm traveling for work and don't have a local SPARQL
> endpoint to test with.  I'll figure something out tomorrow and try and
> get you a response as soon as possible, since, well, yeah, this is a
> pretty huge problem.
>
> Not that it means the current example is not a bug, but note that the
> SPARQL repository is more of an example/base, since SPARQL varies from
> implementation to implementation.  ARQ, for example, includes a
> non-standard count function, which prevents the default
> iterate-and-count implementation.  It's probably not a big deal to
> create an ARQ SPARQL repository class that has support for that, and
> I'd help you work on that if you wanted.
>
> Ben
>
> On Sat, Oct 9, 2010 at 10:55 AM, Christoph Badura <bad@bsd.de> wrote:
>> I'm trying to use SPARQL::Client as a Repository for Spira.
>>
>>    require 'spira'
>>    require 'sparql/client'
>>
>>    class Foo
>>      include Spira::Resource
>>
>>      property :whatever, :predicate => DC.whatever
>>    end
>>
>>    repo = SPARQL::Client::Repository.new 'http://localhost:2020/sparql'
>>    Spira.add_repository! :default, repo
>>
>>    foo = Foo.for(RDF::URI.new("http://example.com/foo/1"))
>>
>> As soon as I access the first property, the sparql server (i'm using joseki)
>> is reporting the first query:
>>
>>    INFO  SPARQL               :: Query: CONSTRUCT { ?s ?p ?o . } WHERE { ?s ?p ?o . }
>>
>> Returning all the triples in the graph will take a while for any real world
>> repository.  The test data I have loaded is some 40MB.
>>
>> The reason for this are the "unless stamtements.empty?" modifiers used in
>> #reload_attributes.  Countable#empty? relies on #each and SPARQL::Client::
>> Repository#each does
>>    client.construct([:s, :p, :o]).where([:s, :p, :o]).each_statement(&block)
>>
>> I haven't come up with a useful test case, so I'm posting here instead.
>>
>> Here's relevant info from the stacktraces:
>>
>> (rdb:1) l
>> [8, 17] in /usr/pkg/lib/ruby/gems/1.8/gems/rdf-0.2.3/lib/rdf/mixin/countable.rb
>>   8      # Returns `true` if `self` contains no RDF statements.
>>   9      #
>>   10      # @return [Boolean]
>>   11      def empty?
>>   12        empty = true
>> => 13        each { empty = false; break }
>>   14        empty
>>   15      end
>>   16
>>   17      ##
>> (rdb:1) up
>> #4 /usr/pkg/lib/ruby/gems/1.8/gems/spira-0.0.8/lib/spira/resource/instance_methods.rb:87:in `reload_attributes'
>> (rdb:1) where
>>    #1 /usr/pkg/lib/ruby/gems/1.8/gems/sparql-client-0.0.5/lib/sparql/client/repository.rb:26:in `each'
>>    #2 /usr/pkg/lib/ruby/gems/1.8/gems/rdf-0.2.3/lib/rdf/mixin/queryable.rb:67:in `query_pattern'
>>    #3 /usr/pkg/lib/ruby/gems/1.8/gems/rdf-0.2.3/lib/rdf/mixin/countable.rb:13:in `empty?'
>> --> #4 /usr/pkg/lib/ruby/gems/1.8/gems/spira-0.0.8/lib/spira/resource/instance_methods.rb:87:in `reload_attributes'
>>    #5 /usr/pkg/lib/ruby/gems/1.8/gems/spira-0.0.8/lib/spira/resource/instance_methods.rb:57:in `reload'
>>    #6 /usr/pkg/lib/ruby/gems/1.8/gems/promise-0.3.0/lib/promise.rb:89:in `method_missing'
>>    #7 /usr/pkg/lib/ruby/gems/1.8/gems/spira-0.0.8/lib/spira/resource/instance_methods.rb:323:in `attribute_get'
>>    #8 /usr/pkg/lib/ruby/gems/1.8/gems/spira-0.0.8/lib/spira/resource/dsl.rb:254:in `identifier'
>>    #9 test-sparql.rb:10
>> (rdb:1)
>>  down 3
>> #1 /usr/pkg/lib/ruby/gems/1.8/gems/sparql-client-0.0.5/lib/sparql/client/repository.rb:26:in `each'
>> (rdb:1) l
>> [21, 30] in /usr/pkg/lib/ruby/gems/1.8/gems/sparql-client-0.0.5/lib/sparql/client/repository.rb
>>   21      # @yield  [statement]
>>   22      # @yieldparam [RDF::Statement] statement
>>   23      # @return [Enumerator]
>>   24      # @see    RDF::Repository#each
>>   25      def each(&block)
>> => 26        unless block_given?
>>   27          RDF::Enumerator.new(self, :each)
>>   28        else
>>   29          client.construct([:s, :p, :o]).where([:s, :p, :o]).each_statement(&block)
>>   30        end
>> (rdb:1) p block_given?
>> true
>> (rdb:1)
>>
>> --chris
>>
>>
>

Received on Monday, 11 October 2010 10:43:20 UTC