activerdf_net7 1.6.11
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 +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
|