Git Product home page Git Product logo

sparql-client's Introduction

SPARQL Client for RDF.rb

This is a Ruby implementation of a SPARQL client for RDF.rb.

Gem Version Build Status Coverage Status Gitter chat

Features

  • Executes queries against any SPARQL 1.0/1.1-compatible endpoint over HTTP, or against an RDF::Queryable instance, using the SPARQL gem.
  • Provides a query builder DSL for ASK, SELECT, DESCRIBE and CONSTRUCT queries.
  • Includes preliminary support for some SPARQL 1.1 Update operations.
  • Supports tuple result sets in both XML, JSON, CSV and TSV formats, with JSON being the preferred default for content-negotiation purposes.
  • Supports graph results in any RDF serialization format understood by RDF.rb.
  • Returns results using the RDF.rb object model.
  • Supports accessing endpoints as read/write RDF::Repository instances {SPARQL::Client::Repository}.

Examples

Querying a remote SPARQL endpoint

require 'sparql/client'
sparql = SPARQL::Client.new("http://dbpedia.org/sparql")

Querying a remote SPARQL endpoint with a custom User-Agent

By default, SPARQL::Client adds a User-Agent field to requests, but applications may choose to provide their own, using the headers option:

require 'sparql/client'
sparql = SPARQL::Client.new("http://dbpedia.org/sparql", headers: {'User-Agent' => 'MyBotName'})

Querying a remote SPARQL endpoint with a specified default graph

require 'sparql/client'
sparql = SPARQL::Client.new("http://dbpedia.org/sparql", graph: "http://dbpedia.org")

Querying a RDF::Repository instance

require 'rdf/trig'
repository = RDF::Repository.load("http://example/dataset.trig")
sparql = SPARQL::Client.new(repository)

Executing a boolean query and outputting the result

# ASK WHERE { ?s ?p ?o }
result = sparql.ask.whether([:s, :p, :o]).true?
puts result.inspect   #=> true or false

Executing a tuple query and iterating over the returned solutions

# SELECT * WHERE { ?s ?p ?o } OFFSET 100 LIMIT 10
query = sparql.select.where([:s, :p, :o]).offset(100).limit(10)

query.each_solution do |solution|
  puts solution.inspect
end

Executing a graph query and iterating over the returned statements

# CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 10
query = sparql.construct([:s, :p, :o]).where([:s, :p, :o]).limit(10)

query.each_statement do |statement|
  puts statement.inspect
end

Executing an arbitrary textual SPARQL query string

result = sparql.query("ASK WHERE { ?s ?p ?o }")

puts result.inspect   #=> true or false

Inserting data into a graph

# INSERT DATA { <http://example.org/jhacker> <http://xmlns.com/foaf/0.1/name> "J. Random Hacker" .}
data = RDF::Graph.new do |graph|
  graph << [RDF::URI('http://example.org/jhacker'), RDF::Vocab::FOAF.name, "J. Random Hacker"]
end
sparql.insert_data(data)

Deleting data from a graph

# DELETE DATA { <http://example.org/jhacker> <http://xmlns.com/foaf/0.1/name> "J. Random Hacker" .}
data = RDF::Graph.new do |graph|
  graph << [RDF::URI('http://example.org/jhacker'), RDF::Vocab::FOAF.name, "J. Random Hacker"]
end
sparql.delete_data(data)

Documentation

Dependencies

Installation

The recommended installation method is via RubyGems. To install the latest official release of the SPARQL::Client gem, do:

% [sudo] gem install sparql-client

Download

To get a local working copy of the development repository, do:

% git clone git://github.com/ruby-rdf/sparql-client.git

Alternatively, download the latest development version as a tarball as follows:

% wget https://github.com/ruby-rdf/sparql-client/tarball/master

Mailing List

Authors

Contributors

Contributing

This repository uses Git Flow to mange development and release activity. All submissions must be on a feature branch based on the develop branch to ease staging and integration.

  • Do your best to adhere to the existing coding conventions and idioms.
  • Don't use hard tabs, and don't leave trailing whitespace on any line.
  • Do document every method you add using YARD annotations. Read the tutorial or just look at the existing code for examples.
  • Don't touch the .gemspec, VERSION or AUTHORS files. If you need to change them, do so on your private branch only.
  • Do feel free to add yourself to the CREDITS file and the corresponding list in the the README. Alphabetical order applies.
  • Do note that in order for us to merge any non-trivial changes (as a rule of thumb, additions larger than about 15 lines of code), we need an explicit public domain dedication on record from you, which you will be asked to agree to on the first commit to a repo within the organization. Note that the agreement applies to all repos in the Ruby RDF organization.

Resources

License

This is free and unencumbered public domain software. For more information, see https://unlicense.org/ or the accompanying {file:UNLICENSE} file.

sparql-client's People

Contributors

artob avatar bad avatar bhuga avatar bryant1410 avatar cbeer avatar cecton avatar ckristo avatar cldwalker avatar clockwerx avatar conorsheehan1 avatar dannybtran avatar davidrupp avatar descl avatar drankard avatar fumi avatar gkellogg avatar jamespjh avatar jcoyne avatar marcelotto avatar mikaa123 avatar moustaki avatar ngottlieb avatar njh avatar nvdk avatar pdlug avatar selvan avatar simaris avatar tomjnixon avatar white-gecko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sparql-client's Issues

Update endpoint incorrect for Open RDF Sesame

I'm not sure how broadly this issue applies, for but for Open RDF Sesame, the update URL endpoint is host:port/openrdf-sesame/repositories/name/statements, not host:port/openrdf-sesame/repositories/name (the query endpoint).

As written, the SPARQL::Client#update method sends the request to the same query endpoint (but with the form key update= rather than query=. This causes the server to respond back with a 400 Bad Request saying Missing parameter: query.

If this is an issue that is true for all repositories, SPARQL::Client#update should just append "/statements" to the path and be done with it. But if there is variation among different RDF servers, it's probably prudent to parameterize this in the #upload call.

If you are using Wikidata, it requires User-Agent

You can't query Wikidata without an User-Agent, so I propose to leave a note in the README to say that you should do things like:
SPARQL::Client.new(endpoint, :method => :get, :headers => { 'User-Agent': 'MyBotName'}) to use Wikidata.

Ruby warning in query_without_retry method

Since Ruby 2.7 a warning is shown:

.../lib/sparql/client.rb:10: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
.../.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/sparql-client-3.1.0/lib/sparql/client.rb:311: warning: The called method `query_without_retry' is defined here

Request doesn't contain text of SPARQL query

From the README, I ran

require 'rubygems'
require 'sparql/client'

sparql = SPARQL::Client.new("http://dbpedia.org/sparql")
result = sparql.ask.whether([:s, :p, :o]).true?
puts result.inspect   #=> true or false

but it seems sparql-client is not sending the query


Virtuoso 22023 Error The request does not contain text of SPARQL query (SPARQL::Client::MalformedQuery)

Unclosed connections with SPARQL::CLIENT

Hi there,

I've been struggling with a problem for a while now in my rails of unclosed connections leading to the app exceeding its limits and returning errors like:

Error during failsafe response: Too many open files @ rb_sysopen - /app/app/views/errors/internal_server_error.html.erb

After making sure every open-uri request is closed and no luck solving the problem I've started investigating deeper.

using lsof I've noticed each page request delivers the following

TCP 192.168.0.22:52703->144.126.4.43:http (CLOSE_WAIT)
ruby 8093 jcwitt 50u IPv4 0x47acd29a34c3cb9b 0t0 TCP 192.168.0.22:52800->144.126.4.43:http (CLOSE_WAIT)
ruby 8093 jcwitt 51u IPv4 0x47acd29a34bd9b9b 0t0 TCP 192.168.0.22:52803->144.126.4.43:http (CLOSE_WAIT)
ruby 8093 jcwitt 52u IPv4 0x47acd29a2bec3f7b 0t0 TCP 192.168.0.22:52804->144.126.4.43:http (CLOSE_WAIT)
ruby 8093 jcwitt 53u IPv4 0x47acd29a33acf23b 0t0 TCP 192.168.0.22:52704->144.126.4.43:http (CLOSE_WAIT)
ruby 8093 jcwitt 54u IPv4 0x47acd29a2df4723b 0t0 TCP 192.168.0.22:52705->144.126.4.43:http (CLOSE_WAIT)

and as the app gets used the number of (CLOSE_WAIT) files keeps climbing, about 5 per page requests.

Using the IP, I learned that these requests are being made with the following snippet of code

sparql = SPARQL::Client.new(sparqlendpoint) result = sparql.query(query) return result

BTW I'm using sparql-client (~> 2.0).

So I'm wondering if I'm doing something wrong with the way I'm using SPARQL::Client or perhaps I've found a bug and SPARQL::Client should be closing connections and is not.

https://github.com/ruby-rdf/sparql-client/blob/develop/lib/sparql/client.rb#L726-L731

Among other places a http request is being opened at line 729.

Is getting closed anywhere?

I appreciate any help you can provide.

DSL support for `MINUS`

SPARQL MINUS is missing from the DSL, and are hard to write into queries created using SPARQL::Client::Query.

We should consider ways to support this through the query builder.

SPARQL::Client::Query#values raises NameError

Example code

require 'sparql/client'
SPARQL::Client::Query
  .select
  .where(%i[s p o])
  .values(:s, RDF::URI('http://example.com/1'), RDF::URI('http://example.com/2'))

Result

$ bundle exec ruby /foo/bar/test.rb"
Traceback (most recent call last):
  6: from /foo/bar/test.rb:5:in `<main>'
  5: from /foo/bar/tmp/bundle/ruby/2.6.0/gems/sparql-client-3.0.1/lib/sparql/client/query.rb:598:in `values'
  4: from /foo/bar/tmp/bundle/ruby/2.6.0/gems/sparql-client-3.0.1/lib/sparql/client/query.rb:598:in `map'
  3: from /foo/bar/tmp/bundle/ruby/2.6.0/gems/sparql-client-3.0.1/lib/sparql/client/query.rb:599:in `block in values'
  2: from /foo/bar/tmp/bundle/ruby/2.6.0/gems/sparql-client-3.0.1/lib/sparql/client/query.rb:599:in `map'
  1: from /foo/bar/tmp/bundle/ruby/2.6.0/gems/sparql-client-3.0.1/lib/sparql/client/query.rb:603:in `block (2 levels) in values'
/foo/bar/tmp/bundle/ruby/2.6.0/gems/rdf-3.0.12/lib/rdf/mixin/enumerable.rb:761:in `method_missing': undefined local variable or method `graph_uri_or_var' for #<SPARQL::Client::Query:0x00007f95858a65c0> (NameError)

Process finished with exit code 1

The line raises exception is

when RDF::Value then graph_uri_or_var

I think the return might be local variable nil_literal_or_term instead of graph_uri_or_var.

Update requests parse the result for no purpose

Hello,

I'm already sorry if this question is totally irrelevant. I'm don't know Ruby at all but I show the issue to a few Ruby developers and none of them found a solution to it.

Here is the piece of code that is puzzling me in the SPARQL::Client:

    def update(query, options = {})
      @op = :update
      @alt_endpoint = options[:endpoint] unless options[:endpoint].nil?
      case @url
      when RDF::Queryable
        require 'sparql' unless defined?(::SPARQL::Grammar)
        SPARQL.execute(query, @url, options.merge(update: true))
      else
        parse_response(response(query, options), options) # <------- here
      end
      self
    end

As you can see. The result of the request is parsed but it is not stored and I believe it is not accessible to the caller since this method returns self.

Is there some magic somewhere that allows retrieving the parsed result?

Thanks

Failing tests in 1.8.x

Most tests are failing in 1.8.6 and 1.8.7 due to a whitespace issue starting from here http://github.com/bendiken/sparql-client/blob/3e000c36a84cfc8f9e4158ebe04fc7cb18651e80/lib/sparql/client/query.rb#L236

A failed test example:
7)
'SPARQL::Client::Query when building SELECT queries should support OFFSET' FAILED
expected: "SELECT * WHERE { ?s ?p ?o . } OFFSET 100",
got: "SELECT * WHERE { ?s ?p ?o . } OFFSET 100" (using ==)
./spec/query_spec.rb:64:

I don't mind forking and fixing as long as I know whether you want the whitespace removed from the tests or the library.

Can't access SSL endpoints without port

Originally reported by ekolvets:

Due to Net::HTTP's dependence on URI, SPARQL::Client connections to https endpoints fail because Net::HTTP::Persistent attempts to connect to port 80 instead of port 443.

URI.parse('https://dbpedia.org/').port # returns 443
Addressable::URI.parse("https://dbpedia.org/").port # returns nil

# queries with this wil fail
sparql = SPARQL::Client.new("https://dbpedia.org/sparql")

# queries with this  will succeed
sparql = SPARQL::Client.new("https://dbpedia.org:443/sparql")

Not sure if this is a bug, but its something users should be aware of. The root of the issue is inside of Net::HTTP::Persisent where uri.address and uri.port are passed in to Net::HTTP.new(). Net::HTTP documents its dependence on URI, so I'm not sure if Net::HTTP::Persistent should change to work with Addressable::URIs or whether SPARQL::Client should be passing in a URI instead of an Addressable::URI.

Accessing the RDF::Repository instance

Hello, RDF.rb is awesome library suite, but can you explain the RDF::Repository accessing feature?

I'm trying to do the following things:

puts 'Pure RDF'
repo = RDF::Repository.load('ontology.owl')
repo.each_subject { |s| p s }

puts 'SPARQL'
repo = SPARQL::Client::Repository.load('ontology.owl')
repo.each_subject { |s| p s }
p repo.client.ask.whether([:s, :p, :o]).true?

But all I see is just the following output instead of expected behavior:

Pure RDF
#<RDF::Node:0x16c16a4(_:g23860900)>
#<RDF::Node:0x16bd9a0(_:g23845280)>
#<RDF::Node:0x16b3ec8(_:g23805640)>
#<RDF::Node:0x16ae824(_:g23783460)>
...
SPARQL
/home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/net-http-persistent-2.7/lib/net/http/persistent.rb:472:in `connection_for': undefined method `downcase' for nil:NilClass (NoMethodError)
  from /home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/net-http-persistent-2.7/lib/net/http/persistent.rb:806:in `request'
  from /home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/sparql-client-0.1.1.1/lib/sparql/client.rb:300:in `get'
  from /home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/sparql-client-0.1.1.1/lib/sparql/client.rb:124:in `response'
  from /home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/sparql-client-0.1.1.1/lib/sparql/client.rb:111:in `query'
  from /home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/sparql-client-0.1.1.1/lib/sparql/client.rb:90:in `block in call_query_method'
  from /home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/sparql-client-0.1.1.1/lib/sparql/client/query.rb:276:in `result'
  from /home/eveel/.rvm/gems/ruby-1.9.3-p194/gems/sparql-client-0.1.1.1/lib/sparql/client/query.rb:236:in `true?'
  from test.rb:22:in `<main>'

Am I right? I just want to execute SPARQL queries with sparql-client against my ontology.

Semantic Versioning & Import Fixes to Previous Versions

Hello,

This issue is probably not related to you directly but I believe it can brings something good to this project. So please take it as a proposal of improvement for this project.

Here is my proposal:

I may be wrong but your version format looks like semantic versioning. Therefore it would be nice if you maintain a branch my MAJOR.MINOR.x version (1.99.x, 2.0.x, etc...). Every fixes should cherry-picked on every branch. And from time to time, you release a fixed version of the branch by tagging a commit in the specific branch with all the fixes and increasing the x value.

Which basically means that the fixes that got merged in the develop branch can be merged to 1.99.x and 2.0.x and can fix already released versions. (If they are considered as "fixes" (this can be argued)).

Why am I proposing this?

So the question is... cui bono? 😀 Well... _me_ in the first place because the maintainers of the public repository I'm currently "fixing" are reluctant to merge my PR because it's close to dirty monkey patching. Which is totally true 😄

So, there aren't many solutions:

  • we merge my PR that monkey patch
  • we make a fork of sparql-client with all the fixes (despite they're going to be available at some point)
  • we make sparql-client follows the semantic version and all future version of sparql-client will benefit of fixes made later on (which is cool!)
  • I fork the mu-ruby-template template to a private repository for my company and have the fix available (may include more work on my side 😒 )

So what do you think?

In brief:

  • make 1.99.x branch
  • make 2.0.x branch
  • cherry-pick fixes and later fixes to every branch
  • set up CI to test every branch
  • tag once a while every maintained branch

(And I can help)

Thanks for taking time to read this

Additional info: a colleague just pointed out that the rubygems.org recommends the semantic versioning: http://guides.rubygems.org/patterns/#semantic-versioning

Using prefixed URIs with Query#where

After adding PREFIX support, I noticed that I can't actually use it because of the way Query#where works:

>> SPARQL::Client::Query.select.prefix("dc: <http://purl.org/dc/elements/1.1/>").where([:s, :p, RDF::URI.new('dc:abstract')]).to_s
 => "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT * WHERE { ?s ?p <dc:abstract> .  }"

The above query isn't valid because I need 'dc:abstract' instead of 'dc:abstract'.

To fix this I looked inside RDF::Query::Pattern#to_s and noticed '<%s>' is hardcoded. From the fixme I'm guessing this behavior will eventually be moved into a Statement instance method.

But even when this is done, I'll still need a RDF::Value subclass which just returns the original string. I looked for one and didn't find one.

The solution I propose is just to add this as the first case statement in SPARQL::Client::Query#serialize_value:

when !value.is_a?(RDF::Value) then value.to_s

This would allow the above example to do:

 >> SPARQL::Client::Query.select.prefix("dc: <http://purl.org/dc/elements/1.1/>").where([:s, :p, 'dc:abstract']).to_s
 => "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT * WHERE { ?s ?p dc:abstract .  }"

An added benefit to this change would be that any SPARQL syntax that isn't supported yet can just be passed as a string i.e. blank nodes:

>> SPARQL::Client::Query.select.where([ :s, :p, '[]' ])
=> "SELECT * WHERE { ?s ?p [] . }

Thoughts?
Gabriel

Question about building query

I'm looking to do this kind of SQPARQL query: (to http://dbpedia.org/sparql/ )

SELECT DISTINCT ?name ?country ?abstract ?coords
WHERE { ?city rdf:type dbpedia-owl:City ; 
              rdfs:label ?name ;
              dbpedia-owl:country ?country;
              dbpedia-owl:abstract ?abstract;
              grs:point ?coords
FILTER (regex(?name, 'Abilene, Texas') && langmatches(lang(?name), "EN") && langmatches(lang(?abstract), "EN"))

I've tried some way to write it with the select/where/filter methods, but without success. Is it possible it with them? Otherwise I'll stay on

sparql = SPARQL::Client.new("http://dbpedia.org/sparql")
results = sparql.query("QUERY")

Thank you

Select query in README doesn't trigger execute()

Going through the SELECT example in the README, I noticed execute() wasn't being triggered. The example in the README therefore returns an empty array.

require 'sparql/client'
sparql = SPARQL::Client.new("http://dbpedia.org/sparql")
query = sparql.select.where([:s, :p, :o]).offset(100).limit(10)
query.each_solution do |solution|
  puts solution.inspect
end

VALUES statements

I just ran into a situation where I unfortunately had to abandon sparql-client for a query because I needed to restrict one of the variables using a VALUES list. Is there any chance of supporting this in a future version?

Feature request: support for SERVICE

SERVICE is a feature of SPARQL 1.1 that allows an executing query to make a SPARQL protocol to another SPARQL endpoint.
It is very helpful to retrieve labels, as it reduces the complexity of SPARQL queries, but is not implemented in sparql-client yet.

Authorization fails - verbose option?

How are the authorization headers set and debugged? Is there a verbose option, like the curl -v option? Here's the code that fails (substitute real auth parameters), which is a query on a MarkLogic SPARQL endpoint where the Kb is running on port 8322.

  auth_code = Base64.encode64('myUser:myPass').chomp
  auth_header= {'Authorization' => "Basic #{auth_code}"}
  uri = 'http://devbox.example.org:8322/v1/graphs/sparql?'
  sparql = SPARQL::Client.new(uri, {headers: auth_header} )
  q = sparql.select.where([:s, :p, :o]).limit(10)
  q.each_statement {|s| puts s.inspect }
  SPARQL::Client::ClientError: <rapi:error xmlns:rapi="http://marklogic.com/rest-api"><rapi:status-code>401</rapi:status-code><rapi:status>Failed Auth</rapi:status><rapi:message-code/><rapi:message>Unauthenticated</rapi:message></rapi:error>
  Processing query SELECT * WHERE { ?s ?p ?o . } LIMIT 10
  from /home/dlweber/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/sparql-client-1.1.3.1/lib/sparql/client.rb:342:in `block in response'

The same host and auth parameters work with curl, e.g.

curl -v --anyauth --user myUser:myPass "http:///devbox.example.org:8322/v1/graphs/sparql?query=DESCRIBE <http://id.loc.gov/authorities/names/n2006182879>"
* Hostname was NOT found in DNS cache
*   Trying 172.XX.XX.XX...
* Connected to xxx (172.xx.xx.xx) port 8322 (#0)
> GET /v1/graphs/sparql?query=DESCRIBE <http://id.loc.gov/authorities/names/n2006182879> HTTP/1.1
> User-Agent: curl/7.37.1
> Host: xxx:8322
> Accept: */*
> 
< HTTP/1.1 401 Unauthorized
< WWW-Authenticate: Digest realm="public", qop="auth", nonce="d01666e5d0158e66faa415f4fb21ccc6", opaque="5a267bbd6a277eb9"
< Content-type: application/xml
* Server MarkLogic is not blacklisted
< Server: MarkLogic
< Content-Length: 211
< Connection: close
< 
* Closing connection 0
* Issue another request to this URL: 'http://xxx:8322/v1/graphs/sparql?query=DESCRIBE+<http://id.loc.gov/authorities/names/n2006182879>'
* Hostname was found in DNS cache
*   Trying 172.xx.xx.xx...
* Connected to xxx (172.xx.xx.xx) port 8322 (#1)
* Server auth using Digest with user 'myUser'
> GET /v1/graphs/sparql?query=DESCRIBE+<http://id.loc.gov/authorities/names/n2006182879> HTTP/1.1
> Authorization: Digest username="myUser", realm="public", nonce="d01666e5d0158e66faa415f4fb21ccc6", uri="/v1/graphs/sparql?query=DESCRIBE+<http://id.loc.gov/authorities/names/n2006182879>", cnonce="NWFmZmNlYmM0ZWZhMWY1NmVmMzZkYjc2NTUyMGU0NTU=", nc=00000001, qop=auth, response="e2eed963198b23a165e652abc7bcf3c3", opaque="5a267bbd6a277eb9"
> User-Agent: curl/7.37.1
> Host: xxx:8322
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-type: application/n-quads
* Server MarkLogic is not blacklisted
< Server: MarkLogic
< Content-Length: 1155
< Connection: Keep-Alive
< Keep-Alive: timeout=5

utf-8 characters raise errors in URI/common

Performing the following query:

select * where {<http://pl.dbpedia.org/resource/Ch%C5%82opi_%28powie%C5%9B%C4%87%29> <http://pl.dbpedia.org/property/językOrygWyd> ?value}

an exception is raised

incompatible character encodings: ASCII-8BIT and UTF-8
/home/fox/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/uri/common.rb:331:in `gsub'
/home/fox/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/uri/common.rb:331:in `unescape'
/home/fox/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/uri/common.rb:649:in `unescape'
/home/fox/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.6/lib/rdf/model/uri.rb:1276:in `normalize_segment'
/home/fox/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.6/lib/rdf/model/uri.rb:1240:in `block (2 levels) in query_values='
/home/fox/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.6/lib/rdf/model/uri.rb:1236:in `map'
/home/fox/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.6/lib/rdf/model/uri.rb:1236:in `block in query_values='
/home/fox/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.6/lib/rdf/model/uri.rb:1231:in `each'
/home/fox/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.6/lib/rdf/model/uri.rb:1231:in `map'
/home/fox/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.6/lib/rdf/model/uri.rb:1231:in `query_values='
/home/fox/.rvm/gems/ruby-2.1.2/gems/sparql-client-0.0.11/lib/sparql/client.rb:294:in `get'
/home/fox/.rvm/gems/ruby-2.1.2/gems/sparql-client-0.0.11/lib/sparql/client.rb:124:in `response'
/home/fox/.rvm/gems/ruby-2.1.2/gems/sparql-client-0.0.11/lib/sparql/client.rb:111:in `query'
./lib/download_authors.rb:12:in `get_values'
./lib/download_authors.rb:25:in `<main>'

The reason for that is the presence of ę in the result which is passed to URI library.

Client#query detecting wrong format?

I get the following error:
>> client = SPARQL::Client.new('http://data.linkedmdb.org/sparql')
>> result = client.query('DESCRIBE ?kb WHERE { ?kb http://data.linkedmdb.org/resource/movie/actor_name "Kevin Bacon" . }')
>> result.map {|e| e.to_hash }
RDF::ReaderError: expected subject in #StringIO:0x19b37f4 line 2
from /Library/Ruby/Gems/1.8/gems/rdf-0.1.10/lib/rdf/reader.rb:177:in fail_subject' from /Library/Ruby/Gems/1.8/gems/rdf-0.1.10/lib/rdf/ntriples/reader.rb:176:inread_triple'
from /Library/Ruby/Gems/1.8/gems/rdf-0.1.10/lib/rdf/ntriples/reader.rb:170:in loop' from /Library/Ruby/Gems/1.8/gems/rdf-0.1.10/lib/rdf/ntriples/reader.rb:170:inread_triple'
from /Library/Ruby/Gems/1.8/gems/rdf-0.1.10/lib/rdf/reader.rb:165:in `read_statement'

I printed debug statements and found the error was occurring on the first line of the result on @prefix. Here's the results returned by the above query. Since @prefix is n3 notation, it seems @client.query is detecting the wrong format in @client.parse_rdf_serialization. I have rdf-n3 installed but it doesn't seem to be picking it up. This may be the website's fault for returning the wrong content type. If that's the case, perhaps @client.query should take an option to explicitly set the reader in @client.parse_rdf_serialization.

Thoughts?

UTF-8 characters raise an error on sparql insert

Dear developers,

I'm trying to upload some triples with SPARQL insert. For example i tried to insert a triple describing a 'title'. If it contains special characters or a german umlaut the following error is returned by the sparql client:

C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/sparql-client-3.0.0/lib/sparql/client.rb:351:in `block in response': Error 500: 400: Unable to parse form content (SPARQL::Client::ServerError)
...
 Processing query INSERT DATA {
<http://kb.esit4sip.eu/learning-instances/dbc6b574906c57e6f531edcfa2df82ba> <http://kb.esit4sip.eu/learning/title> "!§$%&/()=?`*áé" .
}
from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/sparql-client-3.0.0/lib/sparql/client.rb:704:in `call'
from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/sparql-client-3.0.0/lib/sparql/client.rb:704:in `block in request'

Futhermore my fuseki (3.8.0) server returns this error:

[2018-08-02 13:51:33] Fuseki     INFO  [1] POST http://localhost:3030/esit4sip-test1/update
[2018-08-02 13:51:33] Fuseki     WARN  [1] RC = 500 : 400: Unable to parse form content
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse form content
        at org.eclipse.jetty.server.Request.getParameters(Request.java:376)
        at org.eclipse.jetty.server.Request.getParameterValues(Request.java:1049)
        at javax.servlet.ServletRequestWrapper.getParameterValues(ServletRequestWrapper.java:221)

... ...

Caused by: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte F5 in state 0
        at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:247)
        at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:157)
        at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:522)
        at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:572)
        at org.eclipse.jetty.server.Request.extractFormParameters(Request.java:525)
        at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:457)
        at org.eclipse.jetty.server.Request.getParameters(Request.java:372)
        ... 50 more
[2018-08-02 13:51:33] Fuseki     INFO  [1] 500 400: Unable to parse form content (37 ms)

Here is the ruby code I'm using:

sparql = SPARQL::Client.new(SPARQL_ENDPOINT)
graph = RDF::Graph.new
title = "a german umlaut: ä "
graph << [LEARNING_INSTANCES[resource_id], LEARNING['title'], title]
sparql.insert_data(graph)

As soon as I'm using a title without special characters everything works fine with the sparql client. Furthermore, if I'm using the fuseki web-gui, the umlaut title is accepted. So it seems that the character encoding is making some trouble. Because I'm not an expert when it comes to programming, I can't say if this error comes from the sparql-client, fuseki or the jetty server. My google research didn't bring me further too. So feel free to comment, if this error does not come from the client.

I'm using the following software:

  • sparql-client-3.0.0
  • Fuseki 3.8.0

Thank you
Alexander

Blank Nodes in Graph Patterns

SPARQL::Client::Repository#query_pattern runs afoul of a restriction in SPARQL about the allowed blank node labels in queries. I suspect most SPARQL implementations will just interpret these as two unique blank nodes without problem, but I noticed that Blazegraph throws errors and it seems technically correct to do so.

We have the option to change the node labels within the method, here; better might be to find a place somewhere in Pattern to change the blank node labels so they won't be repeated.

Thoughts?

Using wildcards as predicates

Hello, Thank you for your fast reply on my last question.

I learned how to use wildcards and had time trying it out on various query attempts. I was able to use wildcards on subjects and objects but whenever I use wildcard (in this case i used RDF::Node.new) i get an error saying that the query is malformed. Do you know any solution to this problem?

I want to make a rdf crawler that crawls linked data and want to dereference all the adjacent nodes.

Thanks again.

Infinite redirect error for unesco vocabulary sparql endpoint

Unesco provide a sparql endpoint http://vocabularies.unesco.org/sparql-form/
The first example on that page is

SELECT ?s ?p ?o
WHERE {
  ?s ?p ?o .
} 
LIMIT 100

I tried to do the same thing using the sparql-client but I the following error:

sparql = SPARQL::Client.new("http://vocabularies.unesco.org/sparql")
query = sparql.select.where([:s, :p, :o]).limit(100)
query.each_solution {|solution| puts solution}

# error
SPARQL::Client::ServerError: Infinite redirect at http://vocabularies.unesco.org/sparql. Redirected more than 10 times.
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/sparql-client-1.99.1/lib/sparql/client.rb:699:in `request'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/sparql-client-1.99.1/lib/sparql/client.rb:344:in `response'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/sparql-client-1.99.1/lib/sparql/client.rb:305:in `query'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/sparql-client-1.99.1/lib/sparql/client.rb:270:in `block in call_query_method'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/sparql-client-1.99.1/lib/sparql/client/query.rb:416:in `result'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/sparql-client-1.99.1/lib/sparql/client/query.rb:409:in `each_solution'
  from (irb):120
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-4.2.10/lib/rails/commands/console.rb:110:in `start'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-4.2.10/lib/rails/commands/console.rb:9:in `start'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:68:in `console'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-4.2.10/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
  from /home/$user/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/railties-4.2.10/lib/rails/commands.rb:17:in `<top (required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'

http://vocabularies.unesco.org/sparql does redirect to http://vocabularies.unesco.org/sparql-form/,
but if the url has all the required params, e.g. this uri, generated by selecting the first query on the page and clicking run query, it resolves.

I'm not sure whether this is an issue with

  1. the unesco api
  2. the uri that gets build by the query not matching what unesco is expecting, or
  3. a case of altering config to increase the redirect threshold

I'm probably going to switch to using a regular http get for now using the url generated by the page,
but ideally I'd like to build the query using ruby. Thanks in advance!

No results with cache enable

Hello, i'm currently using you gem which work well on de development mode but when i turn "config.cache_classes" (on rails) to true, my sparql requests don't give me results. And when i turn back "config.cache_classes" to false i have my results back.

the code:

    $endpoint = "http://fr.dbpedia.org/sparql"
    query = "PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
    SELECT * WHERE{
                ?a ?b ?c
             } LIMIT 10"
    store = SPARQL::Client.new($endpoint)
    store.query(query).each do |item|
      puts item[:label].value
    end

thanks for this good tool, chris

Providing a sparql endpoint with GET params fails to preserve existing GET params

Reproduce steps:

sparql = SPARQL::Client.new("http://api.kasabi.com/dataset/foodista/apis/sparql?apikey=hi")
sparql.inspect
=> #SPARQL::Client:0xc90810(http://api.kasabi.com/dataset/foodista/apis/sparql?apikey=hi)

sparql.query(
"PREFIX dct: http://purl.org/dc/terms/
PREFIX f: http://linkedrecipes.org/schema/
PREFIX foaf: http://xmlns.com/foaf/0.1/
SELECT ?uri ?title ?recipePage WHERE {
?uri a f:Recipe;
dct:title ?title;
foaf:isPrimaryTopicOf ?recipePage;
<ngredient http://data.kasabi.com/dataset/foodista/food/4CXZ7VHS;
<ngredient http://data.kasabi.com/dataset/foodista/food/CX8CMQHZ.
}
LIMIT 10"
)

=> SPARQL::Client::ClientError: HTTP/1.1 403 Forbidden

The fix should be easy enough - just altering https://github.com/bendiken/sparql-client/blob/master/lib/sparql/client.rb#L287 to merge, not replace query_values

NoMethodError: undefined method is_a?

When running the README examples with SPARQL::Client 0.0.2 and RDF.rb 0.1.6:

irb(main):005:0> query = sparql.select.where([:s, :p, :o]).offset(100).limit(10)
=> #<SPARQL::Client::Query:0x810c3768(SELECT * WHERE { ?s ?p ?o . } OFFSET 100 LIMIT 10)>
irb(main):006:0> query.each_solution do |solution|
irb(main):007:1*   puts solution.inspect
irb(main):008:1> end
NoMethodError: undefined method `is_a?' for #<RDF::Query::Solution:0x1020decd0>
    from /opt/local/lib/ruby/gems/1.8/gems/rdf-0.1.6/lib/rdf/query/solution.rb:134:in `method_missing'
    from /opt/local/lib/ruby/gems/1.8/gems/rdf-0.1.6/lib/rdf/query.rb:88:in `each_solution'
    from /opt/local/lib/ruby/gems/1.8/gems/rdf-0.1.6/lib/rdf/query.rb:87:in `each'
    from /opt/local/lib/ruby/gems/1.8/gems/rdf-0.1.6/lib/rdf/query.rb:87:in `each_solution'
    from (irb):6

malformed prefix example in docs

I noticed that the example in the docs for query.prefix produces a malformed query

require 'sparql/client'

client = SPARQL::Client.new('http://dbpedia.org/sparql')
query = client.select.
  prefix(dc: RDF::URI("http://purl.org/dc/elements/1.1/")).
  prefix(foaf: RDF::URI("http://xmlns.com/foaf/0.1/")).
  where([:s, :p, :o])

puts query.to_s
# "PREFIX {:dc=>RDF::URI(<http://purl.org/dc/elements/1.1/>)} PREFIX {:foaf=>RDF::URI(<http://xmlns.com/foaf/0.1/>)} SELECT * WHERE { ?s ?p ?o . }"

query.each_solution do |solution|
  puts solution.inspect
end

# <SPARQL::Client::MalformedQuery: Virtuoso 37000 Error SP030: SPARQL compiler, line 1: syntax error at '{' before ':dc'

# SPARQL query:
# PREFIX {:dc=>RDF::URI(<http://purl.org/dc/elements/1.1/>)} PREFIX {:foaf=>RDF::URI(<http://xmlns.com/foaf/0.1/>)} SELECT * WHERE { ?s ?p ?o . } Processing query PREFIX {:dc=>RDF::URI(<http://purl.org/dc/elements/1.1/>)} PREFIX {:foaf=>RDF::URI(<http://xmlns.com/foaf/0.1/>)} SELECT * WHERE { ?s ?p ?o . }>

Related to #4

EOFError when using sparql_client.query ...

I am pretty sure this is just a very simple mistake on my side but I am not able to find any clues on google or elsewhere.

If I use sparql_client inside a rails 3.07 app to query against a local 4store or virtuoso sparql-endpoint the query results in an
EOFError
end of file reached
exception.

sparql_client = SPARQL::Client.new("http://localhost:8890/sparql/")
result = sparql_client.query("SELECT * WHERE { ?s ?p ?o } LIMIT 10")

Against the dbpedia endpoint the same query works perfectly.

I am pretty sure I have set up my local sparql-endpoints as they should be - and using a simple http request as below returns a valid result.

query = "SELECT * WHERE { ?s ?p ?o } LIMIT 10"
baseURL = "http://localhost:8890/sparql/"
sparqlURL=baseURL+"?query=#{CGI.escape query}"
response = Net::HTTP.get_response(URI.parse(sparqlURL))

Any Idea what this may be causing?

EOF Error leading to segmentation fault for heavy construct queries.

Hello,

I want to retrieve a TTL from a virtuoso endpoint.

      query(construct_query).each_statement do |statement|
        puts statement.inspect
      end

The construct query returns ~652977 statements.

CONSTRUCT {
  ?s ?p ?o
}
FROM <http://tempgraph>
WHERE {
  ?s ?p ?o .
}

But I get a segmentation fault.

/usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:209: [BUG] Segmentation fault at 0x00000000000000
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0057 p:---- s:0289 e:000288 CFUNC  :raptor_parser_parse_chunk
c:0056 p:0018 s:0282 E:001128 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:209
c:0055 p:0025 s:0278 E:001198 RESCUE /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:163
c:0054 p:0056 s:0275 E:001be0 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:157
c:0053 p:0175 s:0268 E:0006d8 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:92
c:0052 p:0018 s:0262 E:000110 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi.rb:118
c:0051 p:0048 s:0257 E:001290 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi.rb:84
c:0050 p:0130 s:0252 E:000f38 METHOD /app/lib/queries.rb:146
... etc

However testing to query the virtuoso endpoint via HTTP directly the result is successfully fetched and created.

require 'net/http'
require 'linkeddata'
require 'cgi'

query = "CONSTRUCT { ?s ?p ?o  } FROM <http://tempgraph> WHERE { ?s ?p ?o . }"
baseURL = "http://localhost:8890/sparql/"
sparqlURL=baseURL+"?query=#{CGI.escape query}"
response = Net::HTTP.get_response(URI.parse(sparqlURL))


File.open("response.ttl", "wb") do |res|
  res.puts response.body
end                             

And it creates the full TTL

$ cat response.ttl | wc -l
652996

SPARQL::Repository#query hands off hashes to default RDF.rb implementation

SPARQL::Repository will query the entire repository and iterate for hash queries:

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 . }"

These queries should be equivalent (and in particular should be the form that RDF::Statement currently produces)

SPARQL Query => SPARQL::Client::Query API Interface

Hi,

I want to demonstrate the functionality of sparql-clients querying API; therefore I want to translate the following query string into API calls:

%q(
    PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
    PREFIX dbpprop: <http://dbpedia.org/property/>
    SELECT ?country ?population
    WHERE {
        ?country a dbpedia-owl:Country .
        ?country dbpprop:populationCensus ?population .
        FILTER ( isNumeric(?population) && ?population > 50000000 )
    }
    ORDER BY DESC(?population)
    LIMIT 5
)

=>

# - define ad-hoc vocabs
DBP_ONT  = RDF::Vocabulary.new('http://dbpedia.org/ontology/')
DBP_PROP = RDF::Vocabulary.new('http://dbpedia.org/property/')

client = SPARQL::Client.new('http://dbpedia.org/sparql')

# - define SPARQL query
query = client.select(:country, :population)
  .where([ :country, RDF.type, DBP_ONT.Country ])
  .where([ :country, DBP_PROP.populationCensus, :population ])
  # ...

but I just don't know how to "translate" the FILTER and the ORDER BY DESC parts. Anyone done that and can support me here?

wrong parameter in HTTP headers?

I found a strange in HTTP headers made by sparql-client.
I dumped request header, and I could find 'Accept' header as below,

application/sparql-results+json, application/sparql-results+xml, text/boolean, text/tab-separated-values;p=0.8, text/csv;p=0.2, */*;p=0.1

I assume the quality parameter is q=?.?, not p=?.?.
This page may help,
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Thanks.

0.1.1 not actually sending query to endpoint

I recently migrated to sparql-client 0.1.1 (from 0.0.11), and noticed an odd regression.

Steps to reproduce:

sparql = SPARQL::Client.new("http://dbpedia.org/sparql/")
query = sparql.select.where([:s, :p, :o]).offset(100).limit(10)
query.execute

which outputs:

SPARQL::Client::MalformedQuery: Virtuoso 22023 Error The request does not contain text of SPARQL query

I tried with a number of endpoints, and can confirm it's not specific to DBpedia

Different results between sparql-client and linkeddata gems

tl;dr. summary:

Using the sparql-client gem, the results of queries with embedded quotes differ from when using the linkeddata gem.

Expected Results:

  • The label is "From "Voyage dans l’intérieur de l’Amérique du Nord, executé pendant les années 1832, 1833 et 1834, par le prince Maximilien de Wied-Neuwied" (Paris & Coblenz, 1839-1843)"

Actual Results:

  • The label is "From "

In depth:

When I run the following code:

require 'linkeddata'
# require 'sparql/client'


sparql = SPARQL::Client.new("http://data.americanartcollaborative.org/sparql")
uri = RDF.URI("http://data.crystalbridges.org/object/2258")
label = RDF.URI("http://www.w3.org/2000/01/rdf-schema#label")

query = sparql.construct([uri, label, :o]).where([uri, label, :o])
query.each_statement {|s| puts s.inspect}

I get the results I expect:

#<RDF::Statement:0x3fdd71454f78(<http://data.crystalbridges.org/object/2258> <http://www.w3.org/2000/01/rdf-schema#label> "Bison-Dance of the Mandan Indians in front of their Medicine Lodge in Mih-Tuta-Hankush" .)>
#<RDF::Statement:0x3fdd71440a78(<http://data.crystalbridges.org/object/2258> <http://www.w3.org/2000/01/rdf-schema#label> "From \"Voyage dans l’intérieur de l’Amérique du Nord, executé pendant les années 1832, 1833 et 1834, par le prince Maximilien de Wied-Neuwied\" (Paris & Coblenz, 1839-1843)" .)>

but when I comment out the linkeddata gem and instead use just the sparql-query gem the results with embedded quotes no longer work, and my results look like:

#<RDF::Statement:0x3fd7f58e2ee0(<http://data.crystalbridges.org/object/2258> <http://www.w3.org/2000/01/rdf-schema#label> "Bison-Dance of the Mandan Indians in front of their Medicine Lodge in Mih-Tuta-Hankush" .)>
#<RDF::Statement:0x3fd7f58df2a4(<http://data.crystalbridges.org/object/2258> <http://www.w3.org/2000/01/rdf-schema#label> "From " .)>

I'm using ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16], and I'm using a gemfile that includes the line gem "linkeddata", '~> 2.1.0', and the Gemfile.lock file says I'm using

sparql-client (2.1.0)
linkeddata (2.1.0)

FILTER inside OPTIONAL Clause

We have a use case for writing a query where the FILTER statement resides inside an OPTIONAL clause. The query was given to us by our triple store support engineers (AllegroGraph). The query looks like this:

SELECT DISTINCT ?id ?prefLabel ?synonym 
FROM <http://data.bioontology.org/ontologies/CSV_TEST_BRO/submissions/1> 
WHERE { 
	?id a <http://www.w3.org/2002/07/owl#Class> . 
	OPTIONAL { 
		?id ?rewrite0 ?prefLabel . 
		FILTER(?rewrite0 = <http://data.bioontology.org/metadata/def/prefLabel> || 
			?rewrite0 = <http://www.w3.org/2004/02/skos/core#prefLabel>)
	} 
	OPTIONAL { 
		?id ?rewrite1 ?synonym . 
		FILTER(?rewrite1 = <http://www.geneontology.org/formats/oboInOwl#hasExactSynonym> || 
			?rewrite1 = <http://purl.obolibrary.org/obo/synonym> || 
			?rewrite1 = <http://www.geneontology.org/formats/oboInOwl#hasBroadSynonym>) 	
	} 
	FILTER(?id = <http://bioontology.org/ontologies/Activity.owl#Activity> || 
		?id = <http://bioontology.org/ontologies/Activity.owl#Biospecimen_Management> || 
		?id = <http://bioontology.org/ontologies/Activity.owl#Community_Engagement> || 
		?id = <http://bioontology.org/ontologies/Activity.owl#Deprecated_Activity>)
}

I've reviewed the sparql-client API and didn't find an obvious way to embed a FILTER statement inside an OPTIONAL block. I wanted to check with you to make sure I'm not missing anything obvious. Is it possible to construct such a query without customizing the sparql-client?

Thank you!

Feature request: support for COUNT

(I tried to raise the request in the ruby-rdf space, but it doesn't seem to have an 'Issues' tab for some reason)

COUNT queries are very useful for a wide range of reasons, e.g. pagination. Right now the only way to do such queries in sparql-client is to write a full SPARQL query. It would be good to be able to do something like:

client = SPARQL::Client.new 'http://dbpedia.org/sparql/'
client.count(:uri).where([:uri, RDF.type, RDF::OWL.Class])
--> 73

I am using the following monkey-patch to do that: https://gist.github.com/3053508 - there must be a cleaner way to do it though.

SPARQL Example Query fails in Ruby-RDF/sparql-client

Code:

gem 'sparql-client', '~> 1.1.2'
require 'sparql/client'

sparql = SPARQL::Client.new("http://dbpedia.org/sparql")

result = sparql.ask.whether([:s, :p, :o]).true?

Error:
/home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/reader.rb:410:in fail_subject': ERROR [line 1] Expected subject (found: "{ \"head\": { \"link\": [] }, \"boolean\": true}") (RDF::ReaderError) from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/ntriples/reader.rb:210:inblock in read_triple'
from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/ntriples/reader.rb:204:in loop' from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/ntriples/reader.rb:204:inread_triple'
from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/reader.rb:391:in read_statement' from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/reader.rb:308:inblock in each_statement'
from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/reader.rb:308:in loop' from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/reader.rb:308:ineach_statement'
from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/util/aliasing.rb:46:in block in alias_method' from /home/USER/.rvm/gems/ruby-2.1.2/gems/rdf-1.1.4.2/lib/rdf/mixin/countable.rb:12:inempty?'
from /home/USER/.rvm/gems/ruby-2.1.2/gems/sparql-client-1.1.2/lib/sparql/client/query.rb:268:in true?' from /home/USER/tutorial_workspace/sentiment_dev/sparql_query.rb:6:in

'

Result in RDF::NTriples::Reader .. sparql.query("describe .....

sparql = SPARQL::Client.new("http://teste:[email protected]:10035/repositories/projetos")
result = sparql.query("describe ?x WHERE { ?x #{"<"+RDF.type+">"} ?nome }")

result

<RDF::NTriples::Reader:0x000000022b6b58 @options={:validate=>false, :canonicalize=>false, :intern=>true, :prefixes=>{}, :encoding=>#Encoding:UTF-8}, @input=#StringIO:0x000000022b6a40, @line=".", @line_rest=nil>

irb(main):038:0>

I need to this query for RDF/XML..

Help me

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.