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,72 @@
|
|
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_redland'
|
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 Redland RDF store"
|
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.requirements << 'librdf0 (Redland)'
|
38
|
+
spec.requirements << 'librdf-ruby (Redland Ruby bindings)'
|
39
|
+
end
|
40
|
+
|
41
|
+
task :verify_rubyforge do
|
42
|
+
raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
|
43
|
+
raise "RUBYFORGE_PASSWORD environment variable not set!" unless ENV['RUBYFORGE_PASSWORD']
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "release #$name-#$version gem on RubyForge"
|
47
|
+
task :release => [ :clean, :verify_rubyforge, :package ] do
|
48
|
+
release_files = FileList["pkg/#$distdir.gem"]
|
49
|
+
Rake::XForge::Release.new($project) do |release|
|
50
|
+
release.user_name = ENV['RUBYFORGE_USER']
|
51
|
+
release.password = ENV['RUBYFORGE_PASSWORD']
|
52
|
+
release.files = release_files.to_a
|
53
|
+
release.release_name = "#$name #$version"
|
54
|
+
release.package_name = "activerdf-redland"
|
55
|
+
release.release_notes = ""
|
56
|
+
|
57
|
+
changes = []
|
58
|
+
File.open("CHANGELOG") do |file|
|
59
|
+
current = true
|
60
|
+
|
61
|
+
file.each do |line|
|
62
|
+
line.chomp!
|
63
|
+
if current and line =~ /^==/
|
64
|
+
current = false; next
|
65
|
+
end
|
66
|
+
break if line.empty? and not current
|
67
|
+
changes << line
|
68
|
+
end
|
69
|
+
end
|
70
|
+
release.release_changes = changes.join("\n")
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
1.2.2
|
@@ -0,0 +1,362 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006 Eyal Oren
|
3
|
+
# License:: LGPL
|
4
|
+
# require 'active_rdf'
|
5
|
+
require 'federation/connection_pool'
|
6
|
+
require 'queryengine/query2sparql'
|
7
|
+
require 'rdf/redland'
|
8
|
+
|
9
|
+
# Adapter to Redland database
|
10
|
+
# uses SPARQL for querying
|
11
|
+
class RedlandAdapter < ActiveRdfAdapter
|
12
|
+
ActiveRdfLogger::log_info "Loading Redland adapter", self
|
13
|
+
ConnectionPool.register_adapter(:redland,self)
|
14
|
+
|
15
|
+
# instantiate connection to Redland database
|
16
|
+
# * location: Data location (:memory, :mysql, :postgresql)
|
17
|
+
# * database: Database name
|
18
|
+
# * new: Create new database
|
19
|
+
# * host: Database server address
|
20
|
+
# * password: Password
|
21
|
+
# * port: Database server port
|
22
|
+
# * reconnect: Set automatic reconnect to database server
|
23
|
+
# * user: Username
|
24
|
+
def initialize(params = {})
|
25
|
+
super()
|
26
|
+
|
27
|
+
if params[:location] and params[:location] == :postgresql
|
28
|
+
initialize_postgresql(params)
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
if params[:location] and params[:location] != :memory
|
33
|
+
# setup file defaults for redland database
|
34
|
+
type = 'bdb'
|
35
|
+
want_new = false # create new or use existing store
|
36
|
+
write = true
|
37
|
+
contexts = true
|
38
|
+
|
39
|
+
if params[:want_new] == true
|
40
|
+
want_new = true
|
41
|
+
end
|
42
|
+
if params[:write] == false
|
43
|
+
write = false
|
44
|
+
end
|
45
|
+
if params[:contexts] == false
|
46
|
+
contexts = false
|
47
|
+
end
|
48
|
+
|
49
|
+
if params[:location].include?('/')
|
50
|
+
path, file = File.split(params[:location])
|
51
|
+
else
|
52
|
+
path = '.'
|
53
|
+
file = params[:location]
|
54
|
+
end
|
55
|
+
else
|
56
|
+
# fall back to in-memory redland
|
57
|
+
type = 'memory'; path = ''; file = '.'; want_new = false; write = true; contexts = true
|
58
|
+
end
|
59
|
+
|
60
|
+
ActiveRdfLogger::log_info(self) { "Initializing with type: #{type} file: #{file} path: #{path}" }
|
61
|
+
|
62
|
+
begin
|
63
|
+
@store = Redland::HashStore.new(type, file, path, want_new, write, contexts)
|
64
|
+
@model = Redland::Model.new @store
|
65
|
+
@reads = true
|
66
|
+
@writes = true
|
67
|
+
ActiveRdfLogger.log_info(self) { "Initialised Redland adapter to #{@model.inspect}" }
|
68
|
+
|
69
|
+
rescue Redland::RedlandError => e
|
70
|
+
raise ActiveRdfError, "Could not initialise Redland database: #{e.message}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# instantiate connection to Redland database in Postgres or MySQL
|
75
|
+
# * database: Database name
|
76
|
+
# * new: Create new database
|
77
|
+
# * host: Database server address
|
78
|
+
# * password: Password
|
79
|
+
# * port: Database server port
|
80
|
+
# * reconnect: Set automatic reconnect to database server
|
81
|
+
# * user: Username
|
82
|
+
def initialize_postgresql(params = {})
|
83
|
+
# author: Richard Dale
|
84
|
+
type = 'postgresql'
|
85
|
+
name = params[:name]
|
86
|
+
|
87
|
+
options = []
|
88
|
+
options << "new='#{params[:new]}'" if params[:new]
|
89
|
+
options << "bulk='#{params[:bulk]}'" if params[:bulk]
|
90
|
+
options << "merge='#{params[:merge]}'" if params[:merge]
|
91
|
+
options << "host='#{params[:host]}'" if params[:host]
|
92
|
+
options << "database='#{params[:database]}'" if params[:database]
|
93
|
+
options << "user='#{params[:user]}'" if params[:user]
|
94
|
+
options << "password='#{params[:password]}'" if params[:password]
|
95
|
+
options << "port='#{params[:port]}'" if params[:port]
|
96
|
+
|
97
|
+
|
98
|
+
ActiveRdfLogger::log_info "Initializing with type: #{type} name: #{name} options: #{options.join(',')}", self
|
99
|
+
|
100
|
+
begin
|
101
|
+
@store = Redland::TripleStore.new(type, name, options.join(','))
|
102
|
+
@model = Redland::Model.new @store
|
103
|
+
@reads = true
|
104
|
+
@writes = true
|
105
|
+
rescue Redland::RedlandError => e
|
106
|
+
raise ActiveRdfError, "Could not initialise Redland database: #{e.message}"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# load a file from the given location with the given syntax into the model.
|
111
|
+
# use Redland syntax strings, e.g. "ntriples" or "rdfxml", defaults to "ntriples"
|
112
|
+
# * location: location of file to load.
|
113
|
+
# * syntax: syntax of file
|
114
|
+
def load(location, syntax="ntriples")
|
115
|
+
parser = Redland::Parser.new(syntax, "", nil)
|
116
|
+
if location =~ /^http/
|
117
|
+
raise ActiveRdfError, "Redland load error for #{location}" unless (parser.parse_into_model(@model, location) == 0)
|
118
|
+
else
|
119
|
+
raise ActiveRdfError, "Redland load error for #{location}" unless (parser.parse_into_model(@model, "file:#{location}") == 0)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# yields query results (as many as requested in select clauses) executed on data source
|
124
|
+
def query(query)
|
125
|
+
qs = Query2SPARQL.translate(query)
|
126
|
+
ActiveRdfLogger::log_debug(self) { "Executing SPARQL query #{qs}" }
|
127
|
+
|
128
|
+
clauses = query.select_clauses.size
|
129
|
+
redland_query = Redland::Query.new(qs, 'sparql')
|
130
|
+
query_results = @model.query_execute(redland_query)
|
131
|
+
|
132
|
+
# return Redland's answer without parsing if ASK query
|
133
|
+
return [[query_results.get_boolean?]] if query.ask?
|
134
|
+
|
135
|
+
ActiveRdfLogger::log_debug(self) { "Found #{query_results.size} query results" }
|
136
|
+
|
137
|
+
# verify if the query has failed
|
138
|
+
if query_results.nil?
|
139
|
+
ActiveRdfLogger::log_debug "Query has failed with nil result", self
|
140
|
+
return false
|
141
|
+
end
|
142
|
+
|
143
|
+
if not query_results.is_bindings?
|
144
|
+
ActiveRdfLogger::log_debug "Query has failed without bindings", self
|
145
|
+
return false
|
146
|
+
end
|
147
|
+
|
148
|
+
# convert the result to array
|
149
|
+
#TODO: if block is given we should not parse all results into array first
|
150
|
+
results = query_result_to_array(query_results, false, query.resource_class)
|
151
|
+
|
152
|
+
if block_given?
|
153
|
+
results.each do |clauses|
|
154
|
+
yield(*clauses)
|
155
|
+
end
|
156
|
+
else
|
157
|
+
results
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# executes query and returns results as SPARQL JSON or XML results
|
162
|
+
# requires svn version of redland-ruby bindings
|
163
|
+
# * query: ActiveRDF Query object
|
164
|
+
# * result_format: :json or :xml
|
165
|
+
def get_query_results(query, result_format=nil)
|
166
|
+
get_sparql_query_results(Query2SPARQL.translate(query), result_format, query.resource_class)
|
167
|
+
end
|
168
|
+
|
169
|
+
# executes sparql query and returns results as SPARQL JSON or XML results
|
170
|
+
# * query: sparql query string
|
171
|
+
# * result_format: :json or :xml
|
172
|
+
# * result_type: Is the type that is used for "resource" results
|
173
|
+
def get_sparql_query_results(qs, result_type, result_format=nil)
|
174
|
+
# author: Eric Hanson
|
175
|
+
|
176
|
+
# set uri for result formatting
|
177
|
+
result_uri =
|
178
|
+
case result_format
|
179
|
+
when :json
|
180
|
+
Redland::Uri.new('http://www.w3.org/2001/sw/DataAccess/json-sparql/')
|
181
|
+
when :xml
|
182
|
+
Redland::Uri.new('http://www.w3.org/TR/2004/WD-rdf-sparql-XMLres-20041221/')
|
183
|
+
end
|
184
|
+
|
185
|
+
# query redland
|
186
|
+
redland_query = Redland::Query.new(qs, 'sparql')
|
187
|
+
query_results = @model.query_execute(redland_query)
|
188
|
+
|
189
|
+
if (result_format != :array)
|
190
|
+
# get string representation in requested result_format (json or xml)
|
191
|
+
query_results.to_string()
|
192
|
+
else
|
193
|
+
# get array result
|
194
|
+
query_result_to_array(query_results, true, result_type)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# add triple to datamodel
|
199
|
+
# * s: subject
|
200
|
+
# * p: predicate
|
201
|
+
# * o: object
|
202
|
+
def add(s, p, o, c=nil)
|
203
|
+
result = false
|
204
|
+
ActiveRdfLogger::log_debug(self) { "Adding triple #{s} #{p} #{o}" }
|
205
|
+
|
206
|
+
# verify input
|
207
|
+
if s.nil? || p.nil? || o.nil?
|
208
|
+
ActiveRdfLogger::log_debug "Cannot add triple with empty subject, exiting", self
|
209
|
+
return false
|
210
|
+
end
|
211
|
+
|
212
|
+
unless (((s.class == String) && (p.class == String) && (o.class == String)) &&
|
213
|
+
((s[0..0] == '<') && (s[-1..-1] == '>')) &&
|
214
|
+
((p[0..0] == '<') && (p[-1..-1] == '>'))) || (s.respond_to?(:uri) && p.respond_to?(:uri))
|
215
|
+
ActiveRdfLogger::log_debug "Cannot add triple where s/p are not resources, exiting", self
|
216
|
+
return false
|
217
|
+
end
|
218
|
+
|
219
|
+
begin
|
220
|
+
if ((s.class != String) || (p.class != String) || (o.class != String))
|
221
|
+
result = (@model.add(wrap(s), wrap(p), wrap(o)) == 0)
|
222
|
+
else
|
223
|
+
result = (@model.add(wrapString(s), wrapString(p), wrapString(o)) == 0)
|
224
|
+
end
|
225
|
+
if (result == true)
|
226
|
+
result = save if ConnectionPool.auto_flush?
|
227
|
+
end
|
228
|
+
return result
|
229
|
+
rescue Redland::RedlandError => e
|
230
|
+
ActiveRdfLogger::log_warn "Adding triple failed in Redland library: #{e}", self
|
231
|
+
return false
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
# deletes triple(s,p,o) from datastore
|
236
|
+
# nil parameters match anything: delete(nil,nil,nil) will delete all triples
|
237
|
+
# * s: subject
|
238
|
+
# * p: predicate
|
239
|
+
# * o: object
|
240
|
+
def delete(s,p,o,c=nil)
|
241
|
+
if ((s.class != String) && (p.class != String) && (o.class != String))
|
242
|
+
s = wrap(s) unless s.nil?
|
243
|
+
p = wrap(p) unless p.nil?
|
244
|
+
o = wrap(o) unless o.nil?
|
245
|
+
|
246
|
+
# if any parameter is nil we need to iterate over all matching triples
|
247
|
+
if (s.nil? or p.nil? or o.nil?)
|
248
|
+
@model.find(s,p,o) { |s,p,o| @model.delete(s,p,o) }
|
249
|
+
else
|
250
|
+
@model.delete(s,p,o)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
@model.delete(s,p,o) == 0
|
255
|
+
end
|
256
|
+
|
257
|
+
# saves updates to the model into the redland file location
|
258
|
+
def save
|
259
|
+
Redland::librdf_model_sync(@model.model) == 0
|
260
|
+
end
|
261
|
+
alias flush save
|
262
|
+
|
263
|
+
# returns all triples in the datastore
|
264
|
+
# * type: dump syntax
|
265
|
+
def dump(type = 'ntriples')
|
266
|
+
Redland.librdf_model_to_string(@model.model, nil, type)
|
267
|
+
end
|
268
|
+
|
269
|
+
# returns size of datasources as number of triples
|
270
|
+
# warning: expensive method as it iterates through all statements
|
271
|
+
def size
|
272
|
+
# we cannot use @model.size, because redland does not allow counting of
|
273
|
+
# file-based models (@model.size raises an error if used on a file)
|
274
|
+
# instead, we just dump all triples, and count them
|
275
|
+
@model.triples.size
|
276
|
+
end
|
277
|
+
|
278
|
+
# clear all real triples of adapter
|
279
|
+
def clear
|
280
|
+
@model.find(nil, nil, nil) {|s,p,o| @model.delete(s,p,o)}
|
281
|
+
end
|
282
|
+
|
283
|
+
# close adapter and remove it from the ConnectionPool
|
284
|
+
def close
|
285
|
+
ConnectionPool.remove_data_source(self)
|
286
|
+
end
|
287
|
+
|
288
|
+
private
|
289
|
+
################ helper methods ####################
|
290
|
+
#TODO: if block is given we should not parse all results into array first
|
291
|
+
# result_type is the type that should be used for "resource" properties.
|
292
|
+
def query_result_to_array(query_results, to_string, result_type)
|
293
|
+
results = []
|
294
|
+
number_bindings = query_results.binding_names.size
|
295
|
+
|
296
|
+
# walk through query results, and construct results array
|
297
|
+
# by looking up each result (if it is a resource) and adding it to the result-array
|
298
|
+
# for literals we only add the values
|
299
|
+
|
300
|
+
# redland results are set that needs to be iterated
|
301
|
+
while not query_results.finished?
|
302
|
+
# we collect the bindings in each row and add them to results
|
303
|
+
results << (0..number_bindings-1).collect do |i|
|
304
|
+
# node is the query result for one binding
|
305
|
+
node = query_results.binding_value(i)
|
306
|
+
|
307
|
+
# we determine the node type
|
308
|
+
if node.literal?
|
309
|
+
# for literal nodes we just return the value
|
310
|
+
Redland.librdf_node_get_literal_value(node.node)
|
311
|
+
elsif node.blank?
|
312
|
+
# blank nodes we ignore
|
313
|
+
if to_string == false
|
314
|
+
nil
|
315
|
+
else
|
316
|
+
# check blank node id
|
317
|
+
if node.blank_identifier
|
318
|
+
"_:#{node.blank_identifier}"
|
319
|
+
else
|
320
|
+
"_:"
|
321
|
+
end
|
322
|
+
end
|
323
|
+
else
|
324
|
+
# other nodes are rdfs:resources
|
325
|
+
if to_string == false
|
326
|
+
result_type.new(node.uri.to_s)
|
327
|
+
else
|
328
|
+
"<#{node.uri.to_s}>"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end
|
332
|
+
# iterate through result set
|
333
|
+
query_results.next
|
334
|
+
end
|
335
|
+
|
336
|
+
results
|
337
|
+
end
|
338
|
+
|
339
|
+
def wrap node
|
340
|
+
if(node.respond_to?(:uri))
|
341
|
+
Redland::Uri.new(node.uri.to_s)
|
342
|
+
else
|
343
|
+
Redland::Literal.new(node.to_s)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
def wrapString node
|
348
|
+
node = node.to_s
|
349
|
+
if ((node[0..0] == '<') && (node[-1..-1] == '>'))
|
350
|
+
return Redland::Uri.new(node[1..-2])
|
351
|
+
elsif (node[0..1] == '_:')
|
352
|
+
if (node.length > 2)
|
353
|
+
return Redland::BNode.new(node[2..-1])
|
354
|
+
else
|
355
|
+
return Redland::BNode.new
|
356
|
+
end
|
357
|
+
else
|
358
|
+
return Redland::Literal.new(node)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
end
|