activerdf_net7 1.6.11
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +79 -0
- data/LICENSE +504 -0
- data/README.rdoc +34 -0
- data/activerdf-jena/CHANGELOG +14 -0
- data/activerdf-jena/LICENSE +504 -0
- data/activerdf-jena/README +57 -0
- data/activerdf-jena/Rakefile +87 -0
- data/activerdf-jena/TODO +18 -0
- data/activerdf-jena/VERSION +1 -0
- data/activerdf-jena/ext/antlr-2.7.5.jar +0 -0
- data/activerdf-jena/ext/arq-extra.jar +0 -0
- data/activerdf-jena/ext/arq.jar +0 -0
- data/activerdf-jena/ext/aterm-java-1.6.jar +0 -0
- data/activerdf-jena/ext/commons-logging-1.1.jar +0 -0
- data/activerdf-jena/ext/concurrent.jar +0 -0
- data/activerdf-jena/ext/icu4j_3_4.jar +0 -0
- data/activerdf-jena/ext/iri.jar +0 -0
- data/activerdf-jena/ext/jena.jar +0 -0
- data/activerdf-jena/ext/jenatest.jar +0 -0
- data/activerdf-jena/ext/json.jar +0 -0
- data/activerdf-jena/ext/junit.jar +0 -0
- data/activerdf-jena/ext/log4j-1.2.12.jar +0 -0
- data/activerdf-jena/ext/lucene-core-2.0.0.jar +0 -0
- data/activerdf-jena/ext/ng4j.jar +0 -0
- data/activerdf-jena/ext/pellet.jar +0 -0
- data/activerdf-jena/ext/relaxngDatatype.jar +0 -0
- data/activerdf-jena/ext/stax-api-1.0.jar +0 -0
- data/activerdf-jena/ext/wstx-asl-3.0.0.jar +0 -0
- data/activerdf-jena/ext/xercesImpl.jar +0 -0
- data/activerdf-jena/ext/xml-apis.jar +0 -0
- data/activerdf-jena/ext/xsdlib.jar +0 -0
- data/activerdf-jena/lib/activerdf_jena/init.rb +26 -0
- data/activerdf-jena/lib/activerdf_jena/jena.rb +59 -0
- data/activerdf-jena/lib/activerdf_jena/jena_adapter.rb +515 -0
- data/activerdf-jena/lib/activerdf_jena/lucene.rb +22 -0
- data/activerdf-jena/lib/activerdf_jena/ng4j.rb +50 -0
- data/activerdf-jena/lib/activerdf_jena/ng4j_adapter.rb +379 -0
- data/activerdf-jena/lib/activerdf_jena/pellet.rb +25 -0
- data/activerdf-jena/test/bnode_org_rss.rdf +793 -0
- data/activerdf-jena/test/eyal-foaf.nt +39 -0
- data/activerdf-jena/test/fun_with_bnodes.nt +2 -0
- data/activerdf-jena/test/s1.n3 +18 -0
- data/activerdf-jena/test/test_data.nt +32 -0
- data/activerdf-jena/test/test_jena_adapter.rb +451 -0
- data/activerdf-jena/test/test_ng4j_adapter.rb +354 -0
- data/activerdf-rdflite/CHANGELOG +31 -0
- data/activerdf-rdflite/LICENSE +504 -0
- data/activerdf-rdflite/README +16 -0
- data/activerdf-rdflite/Rakefile +73 -0
- data/activerdf-rdflite/VERSION +1 -0
- data/activerdf-rdflite/lib/activerdf_rdflite/fetching.rb +34 -0
- data/activerdf-rdflite/lib/activerdf_rdflite/init.rb +13 -0
- data/activerdf-rdflite/lib/activerdf_rdflite/rdflite.rb +582 -0
- data/activerdf-rdflite/lib/activerdf_rdflite/suggesting.rb +87 -0
- data/activerdf-rdflite/test/test_bnode_data.nt +5 -0
- data/activerdf-rdflite/test/test_data.nt +32 -0
- data/activerdf-rdflite/test/test_escaped_data.nt +2 -0
- data/activerdf-rdflite/test/test_fetching.rb +33 -0
- data/activerdf-rdflite/test/test_rdflite.rb +277 -0
- data/activerdf-redland/CHANGELOG +12 -0
- data/activerdf-redland/LICENSE +504 -0
- data/activerdf-redland/README +9 -0
- data/activerdf-redland/Rakefile +72 -0
- data/activerdf-redland/VERSION +1 -0
- data/activerdf-redland/lib/activerdf_redland/init.rb +10 -0
- data/activerdf-redland/lib/activerdf_redland/redland.rb +362 -0
- data/activerdf-redland/test/test_person_data.nt +42 -0
- data/activerdf-redland/test/test_redland_adapter.rb +242 -0
- data/activerdf-sesame/CHANGELOG +6 -0
- data/activerdf-sesame/LICENSE +10 -0
- data/activerdf-sesame/LICENSE-aduna +10 -0
- data/activerdf-sesame/LICENSE-lgpl +504 -0
- data/activerdf-sesame/README +33 -0
- data/activerdf-sesame/Rakefile +77 -0
- data/activerdf-sesame/VERSION +1 -0
- data/activerdf-sesame/ext/commons-codec-1.3.jar +0 -0
- data/activerdf-sesame/ext/commons-dbcp-1.2.2.jar +0 -0
- data/activerdf-sesame/ext/commons-httpclient-3.1.jar +0 -0
- data/activerdf-sesame/ext/commons-logging-1.1.1.jar +0 -0
- data/activerdf-sesame/ext/commons-pool-1.3.jar +0 -0
- data/activerdf-sesame/ext/commons-pool-1.5.2.jar +0 -0
- data/activerdf-sesame/ext/junit-3.8.2.jar +0 -0
- data/activerdf-sesame/ext/openrdf-sesame-2.0-onejar.jar +0 -0
- data/activerdf-sesame/ext/openrdf-sesame-2.3-pr1-onejar.jar +0 -0
- data/activerdf-sesame/ext/slf4j-api-1.4.3.jar +0 -0
- data/activerdf-sesame/ext/slf4j-nop-1.4.3.jar +0 -0
- data/activerdf-sesame/ext/wrapper-sesame2.jar +0 -0
- data/activerdf-sesame/java/build.number +3 -0
- data/activerdf-sesame/java/build.xml +313 -0
- data/activerdf-sesame/java/javadoc/allclasses-frame.html +31 -0
- data/activerdf-sesame/java/javadoc/allclasses-noframe.html +31 -0
- data/activerdf-sesame/java/javadoc/constant-values.html +146 -0
- data/activerdf-sesame/java/javadoc/deprecated-list.html +146 -0
- data/activerdf-sesame/java/javadoc/help-doc.html +223 -0
- data/activerdf-sesame/java/javadoc/index-files/index-1.html +150 -0
- data/activerdf-sesame/java/javadoc/index-files/index-10.html +145 -0
- data/activerdf-sesame/java/javadoc/index-files/index-2.html +157 -0
- data/activerdf-sesame/java/javadoc/index-files/index-3.html +146 -0
- data/activerdf-sesame/java/javadoc/index-files/index-4.html +145 -0
- data/activerdf-sesame/java/javadoc/index-files/index-5.html +145 -0
- data/activerdf-sesame/java/javadoc/index-files/index-6.html +142 -0
- data/activerdf-sesame/java/javadoc/index-files/index-7.html +145 -0
- data/activerdf-sesame/java/javadoc/index-files/index-8.html +152 -0
- data/activerdf-sesame/java/javadoc/index-files/index-9.html +146 -0
- data/activerdf-sesame/java/javadoc/index.html +36 -0
- data/activerdf-sesame/java/javadoc/org/activerdf/wrapper/sesame2/WrapperForSesame2.html +665 -0
- data/activerdf-sesame/java/javadoc/org/activerdf/wrapper/sesame2/class-use/WrapperForSesame2.html +144 -0
- data/activerdf-sesame/java/javadoc/org/activerdf/wrapper/sesame2/package-frame.html +32 -0
- data/activerdf-sesame/java/javadoc/org/activerdf/wrapper/sesame2/package-summary.html +157 -0
- data/activerdf-sesame/java/javadoc/org/activerdf/wrapper/sesame2/package-tree.html +150 -0
- data/activerdf-sesame/java/javadoc/org/activerdf/wrapper/sesame2/package-use.html +144 -0
- data/activerdf-sesame/java/javadoc/overview-summary.html +156 -0
- data/activerdf-sesame/java/javadoc/overview-tree.html +152 -0
- data/activerdf-sesame/java/javadoc/package-list +1 -0
- data/activerdf-sesame/java/javadoc/resources/inherit.gif +0 -0
- data/activerdf-sesame/java/javadoc/stylesheet.css +29 -0
- data/activerdf-sesame/java/lib/commons-codec-1.3.jar +0 -0
- data/activerdf-sesame/java/lib/commons-dbcp-1.2.2.jar +0 -0
- data/activerdf-sesame/java/lib/commons-httpclient-3.1.jar +0 -0
- data/activerdf-sesame/java/lib/commons-logging-1.1.1.jar +0 -0
- data/activerdf-sesame/java/lib/commons-pool-1.3.jar +0 -0
- data/activerdf-sesame/java/lib/commons-pool-1.5.2.jar +0 -0
- data/activerdf-sesame/java/lib/junit-3.8.2.jar +0 -0
- data/activerdf-sesame/java/lib/openrdf-sesame-2.0-onejar.jar +0 -0
- data/activerdf-sesame/java/lib/openrdf-sesame-2.3-pr1-onejar.jar +0 -0
- data/activerdf-sesame/java/lib/slf4j-api-1.4.3.jar +0 -0
- data/activerdf-sesame/java/lib/slf4j-nop-1.4.3.jar +0 -0
- data/activerdf-sesame/java/manifest.mf +3 -0
- data/activerdf-sesame/java/settings.xml +135 -0
- data/activerdf-sesame/java/src/org/activerdf/wrapper/sesame2/WrapperForSesame2.java +145 -0
- data/activerdf-sesame/java/test-src/org/activerdf/wrapper/sesame2/TestWrapperForSesame2.java +41 -0
- data/activerdf-sesame/lib/activerdf_sesame/init.rb +11 -0
- data/activerdf-sesame/lib/activerdf_sesame/sesame.rb +400 -0
- data/activerdf-sesame/test/eyal-foaf.nt +39 -0
- data/activerdf-sesame/test/eyal-foaf.rdf +65 -0
- data/activerdf-sesame/test/test_sesame_adapter.rb +341 -0
- data/activerdf-sparql/CHANGELOG +35 -0
- data/activerdf-sparql/LICENSE +504 -0
- data/activerdf-sparql/README +10 -0
- data/activerdf-sparql/Rakefile +78 -0
- data/activerdf-sparql/VERSION +1 -0
- data/activerdf-sparql/lib/activerdf_sparql/init.rb +10 -0
- data/activerdf-sparql/lib/activerdf_sparql/sparql.rb +212 -0
- data/activerdf-sparql/lib/activerdf_sparql/sparql_result_parser.rb +55 -0
- data/activerdf-sparql/test/test_sparql_adapter.rb +108 -0
- data/activerdf-yars/LICENSE +504 -0
- data/activerdf-yars/README +10 -0
- data/activerdf-yars/Rakefile +38 -0
- data/activerdf-yars/lib/activerdf_yars/init.rb +10 -0
- data/activerdf-yars/lib/activerdf_yars/jars2.rb +119 -0
- data/lib/active_rdf.rb +85 -0
- data/lib/active_rdf/directaccess/direct_access.rb +49 -0
- data/lib/active_rdf/federation/active_rdf_adapter.rb +47 -0
- data/lib/active_rdf/federation/connection_pool.rb +156 -0
- data/lib/active_rdf/federation/federation_manager.rb +112 -0
- data/lib/active_rdf/instance_exec.rb +13 -0
- data/lib/active_rdf/objectmanager/bnode.rb +7 -0
- data/lib/active_rdf/objectmanager/literal.rb +71 -0
- data/lib/active_rdf/objectmanager/namespace.rb +106 -0
- data/lib/active_rdf/objectmanager/object_manager.rb +119 -0
- data/lib/active_rdf/objectmanager/ordered_set.rb +116 -0
- data/lib/active_rdf/objectmanager/property_list.rb +76 -0
- data/lib/active_rdf/objectmanager/resource.rb +609 -0
- data/lib/active_rdf/objectmanager/resource_like.rb +28 -0
- data/lib/active_rdf/queryengine/ntriples_parser.rb +90 -0
- data/lib/active_rdf/queryengine/query.rb +245 -0
- data/lib/active_rdf/queryengine/query2jars2.rb +22 -0
- data/lib/active_rdf/queryengine/query2sparql.rb +139 -0
- data/lib/active_rdf_helpers.rb +30 -0
- data/lib/active_rdf_log.rb +100 -0
- data/test/common.rb +119 -0
- data/test/directaccess/test_direct_access.rb +64 -0
- data/test/federation/test_connection_pool.rb +86 -0
- data/test/federation/test_federation_manager.rb +145 -0
- data/test/objectmanager/test_literal.rb +52 -0
- data/test/objectmanager/test_namespace.rb +83 -0
- data/test/objectmanager/test_object_manager.rb +96 -0
- data/test/objectmanager/test_ordered_set.rb +110 -0
- data/test/objectmanager/test_resource_reading.rb +150 -0
- data/test/objectmanager/test_resource_writing.rb +39 -0
- data/test/objectmanager/test_talia_syntax.rb +68 -0
- data/test/queryengine/my_external_resource.rb +24 -0
- data/test/queryengine/test_external_resource_class.rb +49 -0
- data/test/queryengine/test_ntriples_parser.rb +71 -0
- data/test/queryengine/test_query.rb +55 -0
- data/test/queryengine/test_query2jars2.rb +51 -0
- data/test/queryengine/test_query2sparql.rb +76 -0
- data/test/queryengine/test_query_engine.rb +52 -0
- data/test/test_adapters.rb +58 -0
- metadata +266 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
== ActiveRDF SPARQL adapter
|
2
|
+
This is the ActiveRDF adapter to a SPARQL endpoint serving RDF.
|
3
|
+
See http://www.activerdf.org/ for more information.
|
4
|
+
|
5
|
+
== License
|
6
|
+
This adapter is distributed under the LGPL license.
|
7
|
+
|
8
|
+
== Authors
|
9
|
+
* Eyal Oren
|
10
|
+
* Sebastian Gerke
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'meta_project'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/clean'
|
5
|
+
require 'rake/gempackagetask'
|
6
|
+
require 'rake/rdoctask'
|
7
|
+
require 'rake/contrib/xforge'
|
8
|
+
require 'rubygems'
|
9
|
+
require 'fileutils'
|
10
|
+
require '../tools/rakehelp'
|
11
|
+
|
12
|
+
$version = IO.read('VERSION').strip
|
13
|
+
$name = 'activerdf_sparql'
|
14
|
+
$project = MetaProject::Project::XForge::RubyForge.new('activerdf')
|
15
|
+
$distdir = "#$name-#$version"
|
16
|
+
|
17
|
+
# setup tests
|
18
|
+
setup_tests
|
19
|
+
setup_clean ["pkg", "lib/*.bundle", "*.gem", ".config"]
|
20
|
+
|
21
|
+
# setup rdoc
|
22
|
+
Rake::RDocTask.new do |rdoc|
|
23
|
+
rdoc.rdoc_dir = 'doc/rdoc'
|
24
|
+
rdoc.options << '--line-numbers'
|
25
|
+
rdoc.rdoc_files.add ['README', 'LICENSE', 'lib/**/*.rb', 'doc/**/*.rdoc']
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Does a full compile, test run"
|
29
|
+
task :default => [:test, :package]
|
30
|
+
|
31
|
+
setup_gem($name, $version) do |spec|
|
32
|
+
spec.summary = "ActiveRDF adapter to SPARQL endpoint"
|
33
|
+
spec.description = spec.summary
|
34
|
+
spec.author="Eyal Oren <eyal.oren@deri.org"
|
35
|
+
spec.add_dependency('gem_plugin', '>= 0.2.1')
|
36
|
+
spec.add_dependency('activerdf', '>= 1.6.4')
|
37
|
+
spec.add_dependency('json', '>= 1.1.1')
|
38
|
+
# if RUBY_PLATFORM =~ /java/
|
39
|
+
# # require json_pure which has no native c extensions when running under jruby
|
40
|
+
# spec.add_dependency('json_pure', '>= 1.1.1')
|
41
|
+
# else
|
42
|
+
# spec.add_dependency('json', '>= 1.1.1')
|
43
|
+
# end
|
44
|
+
end
|
45
|
+
|
46
|
+
task :verify_rubyforge do
|
47
|
+
raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
|
48
|
+
raise "RUBYFORGE_PASSWORD environment variable not set!" unless ENV['RUBYFORGE_PASSWORD']
|
49
|
+
end
|
50
|
+
|
51
|
+
desc "release #$name-#$version gem on RubyForge"
|
52
|
+
task :release => [:clean, :verify_rubyforge, :package ] do
|
53
|
+
release_files = FileList["pkg/#$distdir.gem"]
|
54
|
+
|
55
|
+
Rake::XForge::Release.new($project) do |release|
|
56
|
+
release.user_name = ENV['RUBYFORGE_USER']
|
57
|
+
release.password = ENV['RUBYFORGE_PASSWORD']
|
58
|
+
release.files = release_files.to_a
|
59
|
+
release.release_name = "#$name #$version"
|
60
|
+
release.package_name = "activerdf-sparql"
|
61
|
+
release.release_notes = ""
|
62
|
+
|
63
|
+
changes = []
|
64
|
+
File.open("CHANGELOG") do |file|
|
65
|
+
current = true
|
66
|
+
|
67
|
+
file.each do |line|
|
68
|
+
line.chomp!
|
69
|
+
if current and line =~ /^==/
|
70
|
+
current = false; next
|
71
|
+
end
|
72
|
+
break if line.empty? and not current
|
73
|
+
changes << line
|
74
|
+
end
|
75
|
+
end
|
76
|
+
release.release_changes = changes.join("\n")
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
1.3.6
|
@@ -0,0 +1,212 @@
|
|
1
|
+
# require 'active_rdf'
|
2
|
+
require 'queryengine/query2sparql'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'cgi'
|
5
|
+
require 'rexml/document'
|
6
|
+
require "#{File.dirname(__FILE__)}/sparql_result_parser"
|
7
|
+
|
8
|
+
# SPARQL adapter
|
9
|
+
class SparqlAdapter < ActiveRdfAdapter
|
10
|
+
ActiveRdfLogger::log_info "Loading SPARQL adapter", self
|
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
|
21
|
+
|
22
|
+
# Instantiate the connection with the SPARQL Endpoint.
|
23
|
+
# available parameters:
|
24
|
+
# * :url => url: endpoint location e.g. "http://m3pe.org:8080/repositories/test-people"
|
25
|
+
# * :results => one of :xml, :json, :sparql_xml
|
26
|
+
# * :request_method => :get (default) or :post
|
27
|
+
# * :timeout => timeout in seconds to wait for endpoint response
|
28
|
+
# * :auth => [user, pass]
|
29
|
+
def initialize(params = {})
|
30
|
+
super()
|
31
|
+
@reads = true
|
32
|
+
@writes = false
|
33
|
+
|
34
|
+
@url = params[:url] || ''
|
35
|
+
@caching = params[:caching] || false
|
36
|
+
@timeout = params[:timeout] || 50
|
37
|
+
@auth = params[:auth] || nil
|
38
|
+
|
39
|
+
@result_format = params[:results] || :json
|
40
|
+
raise ActiveRdfError, "Result format unsupported" unless [:xml, :json, :sparql_xml].include? @result_format
|
41
|
+
|
42
|
+
@engine = params[:engine]
|
43
|
+
raise ActiveRdfError, "SPARQL engine unsupported" unless [:yars2, :sesame2, :joseki, :virtuoso].include? @engine
|
44
|
+
|
45
|
+
@request_method = params[:request_method] || :get
|
46
|
+
raise ActiveRdfError, "Request method unsupported" unless [:get,:post].include? @request_method
|
47
|
+
ActiveRdfLogger::log_info(self) { "Sparql adapter initialised #{inspect}" }
|
48
|
+
end
|
49
|
+
|
50
|
+
def size
|
51
|
+
query(Query.new.select(:s,:p,:o).where(:s,:p,:o)).size
|
52
|
+
end
|
53
|
+
|
54
|
+
# query datastore with query string (SPARQL), returns array with query results
|
55
|
+
# may be called with a block
|
56
|
+
def query(query, &block)
|
57
|
+
qs = Query2SPARQL.translate(query)
|
58
|
+
ActiveRdfLogger::log_debug(self) { "Executing sparql query #{query}" }
|
59
|
+
|
60
|
+
if @caching
|
61
|
+
result = query_cache(qs)
|
62
|
+
if result.nil?
|
63
|
+
ActiveRdfLogger.log_debug(self) { "Cache miss for query #{qs}" }
|
64
|
+
else
|
65
|
+
ActiveRdfLogger.log_debug(self) { "Cache hit for query #{qs}" }
|
66
|
+
return result
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
result = execute_sparql_query(qs, query.resource_class, header(query), &block)
|
71
|
+
add_to_cache(qs, result) if @caching
|
72
|
+
result = [] if result == "timeout"
|
73
|
+
return result
|
74
|
+
end
|
75
|
+
|
76
|
+
# do the real work of executing the sparql query
|
77
|
+
def execute_sparql_query(qs, resource_type, header=nil, &block)
|
78
|
+
ActiveRdfLogger::log_debug(self) { "Executing query #{qs} on url #@url" }
|
79
|
+
header = header(nil) if header.nil?
|
80
|
+
|
81
|
+
# querying sparql endpoint
|
82
|
+
require 'timeout'
|
83
|
+
response = ''
|
84
|
+
begin
|
85
|
+
case @request_method
|
86
|
+
when :get
|
87
|
+
# encoding query string in URL
|
88
|
+
url = "#@url?query=#{CGI.escape(qs)}"
|
89
|
+
ActiveRdfLogger.log_debug(self) { "GET #{url}" }
|
90
|
+
timeout(@timeout) do
|
91
|
+
open(url, header) do |f|
|
92
|
+
response = f.read
|
93
|
+
end
|
94
|
+
end
|
95
|
+
when :post
|
96
|
+
ActiveRdfLogger.log_debug(self) { "POST #@url with #{qs}" }
|
97
|
+
response = Net::HTTP.post_form(URI.parse(@url),{'query'=>qs}).body
|
98
|
+
end
|
99
|
+
rescue Timeout::Error
|
100
|
+
raise ActiveRdfError, "timeout on SPARQL endpoint"
|
101
|
+
rescue OpenURI::HTTPError => e
|
102
|
+
raise ActiveRdfError, "error on SPARQL endpoint, server said: \n%s:\n%s" % [e,e.io.read]
|
103
|
+
rescue Errno::ECONNREFUSED
|
104
|
+
raise ActiveRdfError, "connection refused on SPARQL endpoint #@url"
|
105
|
+
end
|
106
|
+
|
107
|
+
# we parse content depending on the result format
|
108
|
+
results = case @result_format
|
109
|
+
when :json
|
110
|
+
parse_json(response, resource_type)
|
111
|
+
when :xml, :sparql_xml
|
112
|
+
parse_xml(response, resource_type)
|
113
|
+
end
|
114
|
+
|
115
|
+
if block_given?
|
116
|
+
results.each do |*clauses|
|
117
|
+
yield(*clauses)
|
118
|
+
end
|
119
|
+
else
|
120
|
+
results
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def close
|
125
|
+
ConnectionPool.remove_data_source(self)
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
# FIXME: Cache not primed for handling res classes!
|
130
|
+
def add_to_cache(query_string, result)
|
131
|
+
unless result.nil? or result.empty?
|
132
|
+
if result == "timeout"
|
133
|
+
@@sparql_cache.store(query_string, [])
|
134
|
+
else
|
135
|
+
ActiveRdfLogger.log_debug(self) { "Adding to sparql cache - query: #{query_string}" }
|
136
|
+
@@sparql_cache.store(query_string, result)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
def query_cache(query_string)
|
143
|
+
if @@sparql_cache.include?(query_string)
|
144
|
+
return @@sparql_cache.fetch(query_string)
|
145
|
+
else
|
146
|
+
return nil
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# constructs correct HTTP header for selected query-result format
|
151
|
+
def header(query)
|
152
|
+
header = case @result_format
|
153
|
+
when :json
|
154
|
+
{ 'accept' => 'application/sparql-results+json' }
|
155
|
+
when :xml
|
156
|
+
{ 'accept' => 'application/rdf+xml' }
|
157
|
+
when :sparql_xml
|
158
|
+
{ 'accept' => 'application/sparql-results+xml' }
|
159
|
+
end
|
160
|
+
if @auth
|
161
|
+
header.merge( :http_basic_authentication => @auth )
|
162
|
+
else
|
163
|
+
header
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# parse json query results into array. resource_type is the type to be used
|
168
|
+
# for "resource" objects.
|
169
|
+
def parse_json(s, resource_type)
|
170
|
+
require 'json'
|
171
|
+
|
172
|
+
parsed_object = JSON.parse(s)
|
173
|
+
return [] if parsed_object.nil?
|
174
|
+
|
175
|
+
results = []
|
176
|
+
vars = parsed_object['head']['vars']
|
177
|
+
objects = parsed_object['results']['bindings']
|
178
|
+
|
179
|
+
objects.each do |obj|
|
180
|
+
result = []
|
181
|
+
vars.each do |v|
|
182
|
+
result << create_node( obj[v]['type'], obj[v]['value'], resource_type)
|
183
|
+
end
|
184
|
+
results << result
|
185
|
+
end
|
186
|
+
|
187
|
+
results
|
188
|
+
end
|
189
|
+
|
190
|
+
# parse xml stream result into array
|
191
|
+
def parse_xml(s, resource_type)
|
192
|
+
parser = SparqlResultParser.new(resource_type)
|
193
|
+
REXML::Document.parse_stream(s, parser)
|
194
|
+
parser.result
|
195
|
+
end
|
196
|
+
|
197
|
+
# create ruby objects for each RDF node. resource_type is the class to be used
|
198
|
+
# for "resource" objects.
|
199
|
+
def create_node(type, value, resource_type)
|
200
|
+
case type
|
201
|
+
when 'uri'
|
202
|
+
resource_type.new(value)
|
203
|
+
when 'bnode'
|
204
|
+
BNode.new(value)
|
205
|
+
when 'literal','typed-literal'
|
206
|
+
value.to_s
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Parser for SPARQL XML result set.
|
2
|
+
class SparqlResultParser
|
3
|
+
attr_reader :result
|
4
|
+
|
5
|
+
# The resource_type is the class that
|
6
|
+
def initialize(resource_type)
|
7
|
+
@result = []
|
8
|
+
@vars = []
|
9
|
+
@current_type = nil
|
10
|
+
@resource_type = resource_type
|
11
|
+
end
|
12
|
+
|
13
|
+
def tag_start(name, attrs)
|
14
|
+
case name
|
15
|
+
when 'variable'
|
16
|
+
@vars << attrs['name']
|
17
|
+
when 'result'
|
18
|
+
@current_result = []
|
19
|
+
when 'binding'
|
20
|
+
@index = @vars.index(attrs['name'])
|
21
|
+
when 'bnode', 'literal', 'typed-literal', 'uri'
|
22
|
+
@current_type = name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def tag_end(name)
|
27
|
+
if name == "result"
|
28
|
+
@result << @current_result
|
29
|
+
elsif name == 'bnode' || name == 'literal' || name == 'typed-literal' || name == 'uri'
|
30
|
+
@current_type = nil
|
31
|
+
elsif name == "sparql"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def text(text)
|
36
|
+
if !@current_type.nil?
|
37
|
+
@current_result[@index] = create_node(@current_type, text)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# create ruby objects for each RDF node
|
42
|
+
def create_node(type, value)
|
43
|
+
case type
|
44
|
+
when 'uri'
|
45
|
+
@resource_type.new(value)
|
46
|
+
when 'bnode'
|
47
|
+
BNode.new(value)
|
48
|
+
when 'literal','typed-literal'
|
49
|
+
value.to_s
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def method_missing (*args)
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require "rubygems"
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'test/unit'
|
8
|
+
require 'federation/federation_manager'
|
9
|
+
require 'queryengine/query'
|
10
|
+
|
11
|
+
|
12
|
+
class TestSparqlAdapter < Test::Unit::TestCase
|
13
|
+
def setup
|
14
|
+
ConnectionPool.clear
|
15
|
+
@adapter = ConnectionPool.add(:type => :sparql, :url => 'http://dbpedia.org/sparql', :engine => :virtuoso)
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_registration
|
22
|
+
assert_instance_of SparqlAdapter, @adapter
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_language
|
26
|
+
sunset = RDFS::Resource.new("http://dbpedia.org/resource/77_Sunset_Strip")
|
27
|
+
abstract = RDFS::Resource.new("http://dbpedia.org/property/abstract")
|
28
|
+
|
29
|
+
german = Query.new.distinct(:o).where(sunset,abstract,:o).limit(1).lang(:o,'de').execute.first
|
30
|
+
english = Query.new.distinct(:o).where(sunset,abstract,:o).limit(1).lang(:o,'en').execute.first
|
31
|
+
|
32
|
+
assert english =~ /^77 Sunset Strip is the first hour-length private detective series in American television history/
|
33
|
+
assert german =~ /^77 Sunset Strip ist ein Serienklassiker aus den USA um das gleichnamige, in Los Angeles am Sunset Boulevard angesiedelte Detektivbüro/
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_limit_offset
|
37
|
+
one = Query.new.select(:s).where(:s,:p,:o).limit(10).execute
|
38
|
+
assert_equal 10, one.size
|
39
|
+
|
40
|
+
one.all? do |r|
|
41
|
+
assert_instance_of RDFS::Resource, r
|
42
|
+
end
|
43
|
+
|
44
|
+
two = Query.new.select(:s).where(:s,:p,:o).limit(10).offset(1).execute
|
45
|
+
assert_equal 10, two.size
|
46
|
+
assert_equal one[1], two[0]
|
47
|
+
|
48
|
+
three = Query.new.select(:s).where(:s,:p,:o).limit(10).offset(0).execute
|
49
|
+
assert_equal one, three
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_regex_filter
|
53
|
+
Namespace.register :yago, 'http://dbpedia.org/class/yago/'
|
54
|
+
Namespace.register :dbpedia, 'http://dbpedia.org/property/'
|
55
|
+
Namespace.register :dbresource, 'http://dbpedia.org/resource/'
|
56
|
+
|
57
|
+
movies = Query.new.
|
58
|
+
distinct(:title).
|
59
|
+
where(DBRESOURCE::Kill_Bill, RDFS.label, :title).
|
60
|
+
filter_regex(:title, /^Kill/).limit(10).execute
|
61
|
+
|
62
|
+
assert !movies.empty?, "regex query returns empty results"
|
63
|
+
assert movies.all? {|m| m =~ /^Kill/ }, "regex query returns wrong results"
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_query_with_block
|
67
|
+
reached_block = false
|
68
|
+
Query.new.select(:s, :p).where(:s,:p,:o).limit(1).execute do |s, p|
|
69
|
+
reached_block = true
|
70
|
+
assert_equal RDFS::Resource, s.class
|
71
|
+
assert_equal RDFS::Resource, p.class
|
72
|
+
end
|
73
|
+
assert reached_block, "querying with a block does not work"
|
74
|
+
|
75
|
+
reached_block = false
|
76
|
+
Query.new.select(:s, :p).where(:s,:p,:o).limit(3).execute do |s, p|
|
77
|
+
reached_block = true
|
78
|
+
assert_equal RDFS::Resource, s.class
|
79
|
+
assert_equal RDFS::Resource, p.class
|
80
|
+
end
|
81
|
+
assert reached_block, "querying with a block does not work"
|
82
|
+
|
83
|
+
reached_block = false
|
84
|
+
Query.new.select(:s).where(:s,:p,:o).limit(3).execute do |s|
|
85
|
+
reached_block = true
|
86
|
+
assert_equal RDFS::Resource, s.class
|
87
|
+
end
|
88
|
+
|
89
|
+
assert reached_block, "querying with a block does not work"
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_refuse_to_write
|
93
|
+
eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
|
94
|
+
age = RDFS::Resource.new 'foaf:age'
|
95
|
+
test = RDFS::Resource.new 'test'
|
96
|
+
|
97
|
+
# NameError gets thown if the method is unknown
|
98
|
+
assert_raises NoMethodError do
|
99
|
+
@adapter.add(eyal, age, test)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_literal_conversion
|
104
|
+
# test literal conversion
|
105
|
+
label = Query.new.distinct(:label).where(:s, RDFS::label, :label).limit(1).execute(:flatten)
|
106
|
+
assert_instance_of String, label
|
107
|
+
end
|
108
|
+
end
|