activerdf_sparql 1.3.4 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ == activerdf_sparql (1.3.5) Mon, 01 Oct 2007 12:03:40 +0200
2
+ * support for POSTing SPARQL queres (Edward Benson)
3
+ * added experimental sparql query cache: it never expires (Benjamin Heitmann)
4
+ * reverted gem dependency to json (Benjamin Heitmann)
5
+
1
6
  == activerdf_sparql (1.3.4) Fri, 21 Sep 2007 10:06:57 +0100
2
7
  * parse bnodes in SPARQL queries
3
8
 
@@ -9,28 +9,38 @@ require "#{File.dirname(__FILE__)}/sparql_result_parser"
9
9
  class SparqlAdapter < ActiveRdfAdapter
10
10
  $activerdflog.info "loading SPARQL adapter"
11
11
  ConnectionPool.register_adapter(:sparql, self)
12
+
13
+ attr_reader :engine
14
+ attr_reader :caching
15
+
16
+ @@sparql_cache = {}
17
+
18
+ def SparqlAdapter.get_cache
19
+ return @@sparql_cache
20
+ end
12
21
 
13
22
  # Instantiate the connection with the SPARQL Endpoint.
14
23
  # available parameters:
15
24
  # * :url => url: endpoint location e.g. "http://m3pe.org:8080/repositories/test-people"
16
25
  # * :results => one of :xml, :json, :sparql_xml
17
- attr_reader :engine
18
-
26
+ # * :request_method => :get (default) or :post
27
+ # * :timeout => timeout in seconds to wait for endpoint response
19
28
  def initialize(params = {})
20
29
  @reads = true
21
30
  @writes = false
22
31
 
23
32
  @url = params[:url] || ''
33
+ @caching = params[:caching] || false
34
+ @timeout = params[:timeout] || 50
35
+
24
36
  @result_format = params[:results] || :json
37
+ raise ActiveRdfError, "Result format unsupported" unless [:xml, :json, :sparql_xml].include? @result_format
38
+
25
39
  @engine = params[:engine]
40
+ raise ActiveRdfError, "SPARQL engine unsupported" unless [:yars2, :sesame2, :joseki, :virtuoso].include? @engine
26
41
 
27
- supported_engines = [:yars2, :sesame2, :joseki, :virtuoso]
28
- raise ActiveRdfError, "SPARQL engine unsupported" unless supported_engines.include?(@engine)
29
-
30
- known_formats = [:xml, :json, :sparql_xml]
31
- raise ActiveRdfError, "Result format unsupported" unless known_formats.include?(@result_format)
32
-
33
- $activerdflog.info "SPARQL adapter initialised #{inspect}"
42
+ @request_method = params[:request_method] || :get
43
+ raise ActiveRdfError, "Request method unsupported" unless [:get,:post].include? @request_method
34
44
  end
35
45
 
36
46
  def size
@@ -40,27 +50,49 @@ class SparqlAdapter < ActiveRdfAdapter
40
50
  # query datastore with query string (SPARQL), returns array with query results
41
51
  # may be called with a block
42
52
  def query(query, &block)
43
- time = Time.now
44
53
  qs = Query2SPARQL.translate(query)
45
- execute_sparql_query(qs, header(query), &block)
54
+
55
+ if @caching
56
+ result = query_cache(qs)
57
+ if result.nil?
58
+ $activerdflog.debug "cache miss for query #{qs}"
59
+ else
60
+ $activerdflog.debug "cache hit for query #{qs}"
61
+ return result
62
+ end
63
+ end
64
+
65
+ result = execute_sparql_query(qs, header(query), &block)
66
+ add_to_cache(qs, result) if @caching
67
+ result = [] if result == "timeout"
68
+ return result
46
69
  end
47
70
 
48
71
  # do the real work of executing the sparql query
49
72
  def execute_sparql_query(qs, header=nil, &block)
50
73
  header = header(nil) if header.nil?
51
74
 
52
- # encoding query string in URL
53
- url = "#@url?query=#{CGI.escape(qs)}"
54
- #url += "&content-type=#{CGI.escape('application/sparql-results+xml')}" if @yars2
55
- url = url.gsub("DISTINCT", "") if @yars2
56
- $activerdflog.debug "querying #{url}"
57
-
58
75
  # querying sparql endpoint
76
+ require 'timeout'
59
77
  response = ''
60
78
  begin
61
- open(url, header) do |f|
62
- response = f.read
63
- end
79
+ case @request_method
80
+ when :get
81
+ # encoding query string in URL
82
+ url = "#@url?query=#{CGI.escape(qs)}"
83
+ $activerdflog.debug "GET #{url}"
84
+ timeout(@timeout) do
85
+ open(url, header) do |f|
86
+ response = f.read
87
+ end
88
+ end
89
+ when :post
90
+ $activerdflog.debug "POST #@url with #{qs}"
91
+ response = Net::HTTP.post_form(URI.parse(@url),{'query'=>qs}).body
92
+ end
93
+ rescue Timeout::Error
94
+ raise ActiveRdfError, "timeout on SPARQL endpoint"
95
+ return "timeout"
64
96
  rescue OpenURI::HTTPError => e
65
97
  raise ActiveRdfError, "could not query SPARQL endpoint, server said: #{e}"
66
98
  return []
@@ -68,7 +100,6 @@ class SparqlAdapter < ActiveRdfAdapter
68
100
  raise ActiveRdfError, "connection refused on SPARQL endpoint #@url"
69
101
  return []
70
102
  end
71
- $activerdflog.debug "response:\n#{response}"
72
103
 
73
104
  # we parse content depending on the result format
74
105
  results = case @result_format
@@ -92,6 +123,26 @@ class SparqlAdapter < ActiveRdfAdapter
92
123
  end
93
124
 
94
125
  private
126
+ def add_to_cache(query_string, result)
127
+ unless result.nil? or result.empty?
128
+ if result == "timeout"
129
+ @@sparql_cache.store(query_string, [])
130
+ else
131
+ $activerdflog.debug "adding to sparql cache - query: #{query_string}"
132
+ @@sparql_cache.store(query_string, result)
133
+ end
134
+ end
135
+ end
136
+
137
+
138
+ def query_cache(query_string)
139
+ if @@sparql_cache.include?(query_string)
140
+ return @@sparql_cache.fetch(query_string)
141
+ else
142
+ return nil
143
+ end
144
+ end
145
+
95
146
  # constructs correct HTTP header for selected query-result format
96
147
  def header(query)
97
148
  case @result_format
@@ -146,4 +197,7 @@ class SparqlAdapter < ActiveRdfAdapter
146
197
  value.to_s
147
198
  end
148
199
  end
200
+
201
+
202
+
149
203
  end
@@ -56,7 +56,6 @@ class TestSparqlAdapter < Test::Unit::TestCase
56
56
  begin
57
57
  movies = Query.new.
58
58
  select(:title).
59
- where(:film, RDF.type, RDFS::Resource.new('http://dbpedia.org/class/yago/film')).
60
59
  where(:film, RDFS.label, :title).
61
60
  where(:title, RDFS::Resource.new('bif:contains'), 'kill').
62
61
  filter_regex(:title, /Kill$/).execute
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: activerdf_sparql
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.3.4
7
- date: 2007-09-21 00:00:00 +01:00
6
+ version: 1.3.5
7
+ date: 2007-10-01 00:00:00 +02:00
8
8
  summary: ActiveRDF adapter to SPARQL endpoint
9
9
  require_paths:
10
10
  - lib