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,112 @@
|
|
|
1
|
+
require 'federation/connection_pool'
|
|
2
|
+
|
|
3
|
+
include ActiveRdfBenchmark
|
|
4
|
+
|
|
5
|
+
# Manages the federation of datasources: distributes queries to right
|
|
6
|
+
# datasources and merges their results
|
|
7
|
+
|
|
8
|
+
class FederationManager
|
|
9
|
+
# add triple s,p,o (context is optional) to the currently selected write-adapter
|
|
10
|
+
def FederationManager.add(s,p,o,c=nil)
|
|
11
|
+
benchmark("SPARQL/RDF", Logger::DEBUG) do |bench_message|
|
|
12
|
+
bench_message << "ADD #{s} - #{p} - #{o} : #{c}" if(bench_message)
|
|
13
|
+
# TODO: allow addition of full graphs
|
|
14
|
+
raise ActiveRdfError, "cannot write without a write-adapter" unless ConnectionPool.write_adapter
|
|
15
|
+
ConnectionPool.write_adapter.add(s,p,o,c)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# delete triple s,p,o (context is optional) to the currently selected write-adapter
|
|
20
|
+
def FederationManager.delete(s,p,o,c=nil)
|
|
21
|
+
benchmark("SPARQL/RDF", Logger::DEBUG) do |bench_message|
|
|
22
|
+
bench_message << "DELETE #{s} - #{p} - #{o} : #{c}" if(bench_message)
|
|
23
|
+
raise ActiveRdfError, "cannot write without a write-adapter" unless ConnectionPool.write_adapter
|
|
24
|
+
# transform wildcard symbols to nil (for the adaptors)
|
|
25
|
+
s = nil if s.is_a? Symbol
|
|
26
|
+
p = nil if p.is_a? Symbol
|
|
27
|
+
o = nil if o.is_a? Symbol
|
|
28
|
+
ConnectionPool.write_adapter.delete(s,p,o,c)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# delete every triples about a specified resource
|
|
33
|
+
def FederationManager.delete_all(resource)
|
|
34
|
+
delete(resource, nil, nil)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Clear the store (or the given context)
|
|
38
|
+
def FederationManager.clear(context=nil)
|
|
39
|
+
# FIXME: Make sure that all adapters support clearing
|
|
40
|
+
raise(RuntimeError, "Adapter #{ConnectionPool.write_adapter.class} doesn't support clear") unless(ConnectionPool.write_adapter.respond_to?(:clear))
|
|
41
|
+
ConnectionPool.write_adapter.clear(context)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# executes read-only queries
|
|
45
|
+
# by distributing query over complete read-pool
|
|
46
|
+
# and aggregating the results
|
|
47
|
+
def FederationManager.query(q, options={:flatten => true, :result_format => nil})
|
|
48
|
+
if ConnectionPool.read_adapters.empty?
|
|
49
|
+
raise ActiveRdfError, "cannot execute query without data sources"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
benchmark("SPARQL/RDF", Logger::DEBUG) do |bench_message|
|
|
53
|
+
# Only build the benchmark message if we need it
|
|
54
|
+
bench_message << ((q.class == String) ? q : q.to_sp) if(bench_message)
|
|
55
|
+
# ask each adapter for query results
|
|
56
|
+
# and yield them consequtively
|
|
57
|
+
if block_given?
|
|
58
|
+
ConnectionPool.read_adapters.each do |source|
|
|
59
|
+
source.query(q) do |*clauses|
|
|
60
|
+
yield(*clauses)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
else
|
|
64
|
+
# build Array of results from all sources
|
|
65
|
+
# TODO: write test for sebastian's select problem
|
|
66
|
+
# (without distinct, should get duplicates, they
|
|
67
|
+
# were filtered out when doing results.union)
|
|
68
|
+
# FIXME: Calling get_sparql_query_results? This *only* exists on the redland adapter
|
|
69
|
+
results = []
|
|
70
|
+
ConnectionPool.read_adapters.each do |source|
|
|
71
|
+
if (q.class != String)
|
|
72
|
+
source_results = source.query(q)
|
|
73
|
+
else
|
|
74
|
+
source_results = source.get_sparql_query_results(q, RDFS::Resource, options[:result_format])
|
|
75
|
+
end
|
|
76
|
+
source_results.each do |clauses|
|
|
77
|
+
results << clauses
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# filter the empty results
|
|
82
|
+
results.reject {|ary| ary.empty? }
|
|
83
|
+
|
|
84
|
+
# remove duplicate results from multiple
|
|
85
|
+
# adapters if asked for distinct query
|
|
86
|
+
# (adapters return only distinct results,
|
|
87
|
+
# but they cannot check duplicates against each other)
|
|
88
|
+
results.uniq! if ((q.class != String) && (q.distinct?))
|
|
89
|
+
|
|
90
|
+
# flatten results array if only one select clause
|
|
91
|
+
# to prevent unnecessarily nested array [[eyal],[renaud],...]
|
|
92
|
+
if (q.class != String)
|
|
93
|
+
results.flatten! if (q.select_clauses.size == 1 or q.ask?)
|
|
94
|
+
else
|
|
95
|
+
results.flatten! if q.scan(/[?]/).length == 2
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# remove array (return single value or nil) if asked to
|
|
99
|
+
if options[:flatten] or ((q.class != String) && (q.count?))
|
|
100
|
+
case results.size
|
|
101
|
+
when 0
|
|
102
|
+
results = nil
|
|
103
|
+
when 1
|
|
104
|
+
results = results.first
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
results
|
|
110
|
+
end # End benchmark
|
|
111
|
+
end # End query
|
|
112
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Kernel
|
|
2
|
+
# Like instace_eval but allows parameters to be passed.
|
|
3
|
+
def instance_exec(*args, &block)
|
|
4
|
+
mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
|
|
5
|
+
Object.class_eval{ define_method(mname, &block) }
|
|
6
|
+
begin
|
|
7
|
+
ret = send(mname, *args)
|
|
8
|
+
ensure
|
|
9
|
+
Object.class_eval{ undef_method(mname) } rescue nil
|
|
10
|
+
end
|
|
11
|
+
ret
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# require 'active_rdf'
|
|
2
|
+
require 'time'
|
|
3
|
+
|
|
4
|
+
module Literal
|
|
5
|
+
Namespace.register :xsd, 'http://www.w3.org/2001/XMLSchema#'
|
|
6
|
+
def xsd_type
|
|
7
|
+
case self
|
|
8
|
+
when String
|
|
9
|
+
XSD::string
|
|
10
|
+
when Integer
|
|
11
|
+
XSD::integer
|
|
12
|
+
when Float
|
|
13
|
+
XSD::double
|
|
14
|
+
when TrueClass, FalseClass
|
|
15
|
+
XSD::boolean
|
|
16
|
+
when DateTime, Date, Time
|
|
17
|
+
XSD::date
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.typed(value, type)
|
|
22
|
+
case type
|
|
23
|
+
when XSD::string
|
|
24
|
+
String.new(value)
|
|
25
|
+
when XSD::date
|
|
26
|
+
DateTime.parse(value)
|
|
27
|
+
when XSD::boolean
|
|
28
|
+
value == 'true' or value == 1
|
|
29
|
+
when XSD::integer
|
|
30
|
+
value.to_i
|
|
31
|
+
when XSD::double
|
|
32
|
+
value.to_f
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def to_ntriple
|
|
37
|
+
if $activerdf_without_xsdtype
|
|
38
|
+
"\"#{to_s}\""
|
|
39
|
+
else
|
|
40
|
+
"\"#{to_s}\"^^#{xsd_type}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class String; include Literal; end
|
|
46
|
+
class Integer; include Literal; end
|
|
47
|
+
class Float; include Literal; end
|
|
48
|
+
class DateTime; include Literal; end
|
|
49
|
+
class Date; include Literal; end
|
|
50
|
+
class Time; include Literal; end
|
|
51
|
+
class TrueClass; include Literal; end
|
|
52
|
+
class FalseClass; include Literal; end
|
|
53
|
+
|
|
54
|
+
class LocalizedString < String
|
|
55
|
+
include Literal
|
|
56
|
+
attr_reader :lang
|
|
57
|
+
def initialize value, lang=nil
|
|
58
|
+
super(value)
|
|
59
|
+
|
|
60
|
+
@lang = lang
|
|
61
|
+
@lang = lang[1..-1] if @lang[0..0] == '@'
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def to_ntriple
|
|
65
|
+
if @lang
|
|
66
|
+
"\"#{to_s}\"@#@lang"
|
|
67
|
+
else
|
|
68
|
+
super
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# require 'active_rdf'
|
|
2
|
+
|
|
3
|
+
# Manages namespace abbreviations and expansions
|
|
4
|
+
|
|
5
|
+
class Namespace
|
|
6
|
+
@@namespaces = Hash.new
|
|
7
|
+
@@inverted_namespaces = Hash.new
|
|
8
|
+
|
|
9
|
+
# registers a namespace prefix and its associated expansion (full URI)
|
|
10
|
+
# e.g. :rdf and 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
|
|
11
|
+
def self.register(prefix, fullURI)
|
|
12
|
+
raise ActiveRdfError, 'prefix nor uri can be empty' if (prefix.to_s.empty? or fullURI.to_s.empty?)
|
|
13
|
+
# raise ActiveRdfError, "namespace uri should end with # or /" unless /\/|#/ =~ fullURI.to_s[-1..-1]
|
|
14
|
+
ActiveRdfLogger::log_info(self) { "Namespace: registering #{fullURI} to #{prefix}" }
|
|
15
|
+
@@namespaces[prefix.to_sym] = fullURI.to_s
|
|
16
|
+
@@inverted_namespaces[fullURI.to_s] = prefix.to_sym
|
|
17
|
+
|
|
18
|
+
# enable namespace lookups through FOAF::name
|
|
19
|
+
# if FOAF defined, add to it
|
|
20
|
+
if Object.const_defined?(prefix.to_s.upcase)
|
|
21
|
+
ns = Object.const_get(prefix.to_s.upcase)
|
|
22
|
+
else
|
|
23
|
+
# otherwise create a new module for it
|
|
24
|
+
ns = Module.new
|
|
25
|
+
Object.const_set(prefix.to_s.upcase, ns)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# catch FOAF::name or all other lookups
|
|
29
|
+
class << ns
|
|
30
|
+
def method_missing(method, *args)
|
|
31
|
+
Namespace.lookup(self.to_s.downcase.to_sym, method)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def const_missing(klass)
|
|
35
|
+
ObjectManager.construct_class(Namespace.lookup(self.to_s.downcase.to_sym, klass))
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# make some builtin methods private because lookup doesn't work otherwise
|
|
39
|
+
# on e.g. RDF::type and FOAF::name
|
|
40
|
+
[:type, :name, :id].each {|m| private(m) }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# return the namespace proxy object
|
|
44
|
+
ns
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# returns a resource whose URI is formed by concatenation of prefix and localname
|
|
48
|
+
def self.lookup(prefix, localname, resource_type = RDFS::Resource)
|
|
49
|
+
resource_type.new(expand(prefix, localname))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# returns URI (string) formed by concatenation of prefix and localname
|
|
53
|
+
def self.expand(prefix, localname)
|
|
54
|
+
@@namespaces[prefix.to_sym].to_s + localname.to_s
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# returns prefix (if known) for the non-local part of the URI,
|
|
58
|
+
# or nil if prefix not registered
|
|
59
|
+
def self.prefix(resource)
|
|
60
|
+
# get string representation of resource uri
|
|
61
|
+
uri = if(resource.respond_to?(:uri))
|
|
62
|
+
resource.uri.to_s
|
|
63
|
+
else
|
|
64
|
+
resource.to_s
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# uri.to_s gives us the uri of the resource (if resource given)
|
|
68
|
+
# then we find the last occurrence of # or / (heuristical namespace
|
|
69
|
+
# delimitor)
|
|
70
|
+
delimiter = uri.rindex(/#|\//)
|
|
71
|
+
|
|
72
|
+
# if delimiter not found, URI cannot be split into (non)local-part
|
|
73
|
+
return uri if delimiter.nil?
|
|
74
|
+
|
|
75
|
+
# extract non-local part (including delimiter)
|
|
76
|
+
nonlocal = uri[0..delimiter]
|
|
77
|
+
|
|
78
|
+
@@inverted_namespaces[nonlocal]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# returns local-part of URI
|
|
82
|
+
def self.localname(resource)
|
|
83
|
+
# get string representation of resource uri
|
|
84
|
+
uri = if(resource.respond_to?(:uri))
|
|
85
|
+
resource.uri.to_s
|
|
86
|
+
else
|
|
87
|
+
resource.to_s
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
delimiter = uri.rindex(/#|\//)
|
|
91
|
+
if delimiter.nil? or delimiter == uri.size-1
|
|
92
|
+
uri
|
|
93
|
+
else
|
|
94
|
+
uri[delimiter+1..-1]
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# returns currently registered namespace abbreviations (e.g. :foaf, :rdf)
|
|
99
|
+
def self.abbreviations
|
|
100
|
+
@@namespaces.keys
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
Namespace.register(:rdf, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
|
|
105
|
+
Namespace.register(:rdfs, 'http://www.w3.org/2000/01/rdf-schema#')
|
|
106
|
+
Namespace.register(:owl, 'http://www.w3.org/2002/07/owl#')
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# require 'active_rdf'
|
|
2
|
+
|
|
3
|
+
# Constructs Ruby classes for RDFS classes (in the right namespace)
|
|
4
|
+
|
|
5
|
+
class ObjectManager
|
|
6
|
+
# Constructs empty Ruby classes for all RDF types found in the data. Allows
|
|
7
|
+
# users to invoke methods on classes (e.g. FOAF::Person) without
|
|
8
|
+
# getting symbol undefined errors (because e.g. foaf:person wasnt encountered
|
|
9
|
+
# before so no class was created for it)
|
|
10
|
+
def self.construct_classes
|
|
11
|
+
# find all rdf:types and construct class for each of them
|
|
12
|
+
#q = Query.new.select(:t).where(:s,Namespace.lookup(:rdf,:type),:t)
|
|
13
|
+
|
|
14
|
+
# find everything defined as rdfs:class or owl:class
|
|
15
|
+
type = Namespace.lookup(:rdf,:type)
|
|
16
|
+
rdfsklass = Namespace.lookup(:rdfs,:Class)
|
|
17
|
+
|
|
18
|
+
# TODO: we should not do this, we should not support OWL
|
|
19
|
+
# instead, owl:Class is defined as subclass-of rdfs:Class, so if the
|
|
20
|
+
# reasoner has access to owl definition it should work out fine.
|
|
21
|
+
owlklass = Namespace.lookup(:owl,:Class)
|
|
22
|
+
|
|
23
|
+
klasses = []
|
|
24
|
+
klasses << Query.new.distinct(:s).where(:s,type,rdfsklass).execute
|
|
25
|
+
klasses << Query.new.distinct(:s).where(:s,type,owlklass).execute
|
|
26
|
+
|
|
27
|
+
# flattening to get rid of nested arrays
|
|
28
|
+
# compacting array to get rid of nil (if one of these queries returned nil)
|
|
29
|
+
klasses = klasses.flatten.compact
|
|
30
|
+
ActiveRdfLogger::log_debug(self) { "Construct_classes: classes found: #{klasses}" }
|
|
31
|
+
|
|
32
|
+
# then we construct a Ruby class for each found rdfs:class
|
|
33
|
+
# and return the set of all constructed classes
|
|
34
|
+
klasses.collect { |t| construct_class(t) }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# constructs Ruby class for the given resource (and puts it into the module as
|
|
38
|
+
# defined by the registered namespace abbreviations)
|
|
39
|
+
def self.construct_class(resource)
|
|
40
|
+
# get prefix abbreviation and localname from type
|
|
41
|
+
# e.g. :foaf and Person
|
|
42
|
+
localname = Namespace.localname(resource)
|
|
43
|
+
prefix = Namespace.prefix(resource)
|
|
44
|
+
|
|
45
|
+
# find (ruby-acceptable) names for the module and class
|
|
46
|
+
# e.g. FOAF and Person
|
|
47
|
+
if prefix.nil?
|
|
48
|
+
# if the prefix is unknown, we create our own from the full URI
|
|
49
|
+
modulename = create_module_name(resource)
|
|
50
|
+
ActiveRdfLogger::log_debug(self) { "Construct_class: constructing modulename #{modulename} from URI #{resource}" }
|
|
51
|
+
else
|
|
52
|
+
# otherwise we convert the registered prefix into a module name
|
|
53
|
+
modulename = prefix_to_module(prefix)
|
|
54
|
+
ActiveRdfLogger::log_debug(self) { "ObjectManager: construct_class: constructing modulename #{modulename} from registered prefix #{prefix}" }
|
|
55
|
+
end
|
|
56
|
+
klassname = localname_to_class(localname)
|
|
57
|
+
|
|
58
|
+
# look whether module defined
|
|
59
|
+
# else: create it
|
|
60
|
+
_module = if Object.const_defined?(modulename.to_sym)
|
|
61
|
+
ActiveRdfLogger::log_debug(self) { "ObjectManager: construct_class: module name #{modulename} previously defined" }
|
|
62
|
+
Object.const_get(modulename.to_sym)
|
|
63
|
+
else
|
|
64
|
+
ActiveRdfLogger::log_debug(self) { "ObjectManager: construct_class: defining module name #{modulename} now" }
|
|
65
|
+
Object.const_set(modulename, Module.new)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# look whether class defined in that module
|
|
69
|
+
if _module.const_defined?(klassname.to_sym)
|
|
70
|
+
ActiveRdfLogger::log_debug(self) { "ObjectManager: construct_class: given class #{klassname} defined in the module" }
|
|
71
|
+
# if so, return the existing class
|
|
72
|
+
_module.const_get(klassname.to_sym)
|
|
73
|
+
else
|
|
74
|
+
ActiveRdfLogger::log_debug(self) { "ObjectManager: construct_class: creating given class #{klassname}" }
|
|
75
|
+
# otherwise: create it, inside that module, as subclass of RDFS::Resource
|
|
76
|
+
# (using toplevel Class.new to prevent RDFS::Class.new from being called)
|
|
77
|
+
klass = _module.module_eval("#{klassname} = Object::Class.new(RDFS::Resource)")
|
|
78
|
+
klass.class_uri = resource
|
|
79
|
+
klass
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def self.prefix_to_module(prefix)
|
|
84
|
+
# TODO: remove illegal characters
|
|
85
|
+
prefix.to_s.upcase
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.localname_to_class(localname)
|
|
89
|
+
# replace illegal characters inside the uri
|
|
90
|
+
# and capitalize the classname
|
|
91
|
+
replace_illegal_chars(localname).capitalize
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def self.create_module_name(resource)
|
|
95
|
+
# TODO: write unit test to verify replacement of all illegal characters
|
|
96
|
+
|
|
97
|
+
# extract non-local part (including delimiter)
|
|
98
|
+
uri = resource.uri
|
|
99
|
+
delimiter = uri.rindex(/#|\//)
|
|
100
|
+
nonlocal = uri[0..delimiter]
|
|
101
|
+
|
|
102
|
+
# remove illegal characters appearing at the end of the uri (e.g. trailing
|
|
103
|
+
# slash)
|
|
104
|
+
cleaned_non_local = nonlocal.gsub(/[^a-zA-Z0-9]+$/, '')
|
|
105
|
+
|
|
106
|
+
# replace illegal chars within the uri
|
|
107
|
+
replace_illegal_chars(cleaned_non_local).upcase
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def self.replace_illegal_chars(name)
|
|
111
|
+
name.gsub(/[^a-zA-Z0-9]+/, '_')
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
#declare the class level methods as private with these directives
|
|
115
|
+
private_class_method :prefix_to_module
|
|
116
|
+
private_class_method :localname_to_class
|
|
117
|
+
private_class_method :create_module_name
|
|
118
|
+
private_class_method :replace_illegal_chars
|
|
119
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# require 'active_rdf'
|
|
2
|
+
require 'queryengine/query'
|
|
3
|
+
require 'objectmanager/resource'
|
|
4
|
+
|
|
5
|
+
class OrderedSet
|
|
6
|
+
|
|
7
|
+
# the uri of current resource
|
|
8
|
+
attr_reader :uri
|
|
9
|
+
|
|
10
|
+
# Initialize SeqContainer
|
|
11
|
+
def initialize(uri)
|
|
12
|
+
@uri = RDF::Seq.new uri
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# get all elements of Resource that match with 'rdf:_'
|
|
16
|
+
#
|
|
17
|
+
# return value: Array
|
|
18
|
+
def elements
|
|
19
|
+
# execute query
|
|
20
|
+
query.collect { |predicate, object| object }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# get element at position index
|
|
24
|
+
# *index: int
|
|
25
|
+
#
|
|
26
|
+
# return value: RDFS::Resource
|
|
27
|
+
def at(index)
|
|
28
|
+
# get predicate for next item
|
|
29
|
+
predicate = index_to_predicate(index)
|
|
30
|
+
|
|
31
|
+
# execute query
|
|
32
|
+
result = Query.new.select(:o).where(self.uri, predicate, :o).execute
|
|
33
|
+
|
|
34
|
+
if (!(result.nil?) and (result.size > 0))
|
|
35
|
+
result.first
|
|
36
|
+
else
|
|
37
|
+
nil
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# return size of elements
|
|
42
|
+
#
|
|
43
|
+
# return value: int
|
|
44
|
+
def size
|
|
45
|
+
result = query
|
|
46
|
+
|
|
47
|
+
if result.empty?
|
|
48
|
+
return 0
|
|
49
|
+
else
|
|
50
|
+
index = predicate_to_index result.last[0]
|
|
51
|
+
return index.to_i
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# add a new object
|
|
56
|
+
# * object: RDFS::Resource
|
|
57
|
+
def add(object)
|
|
58
|
+
# get predicate for next item
|
|
59
|
+
predicate = index_to_predicate(size + 1)
|
|
60
|
+
|
|
61
|
+
# add item
|
|
62
|
+
FederationManager.add(self.uri, predicate , object)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# remove an existing object
|
|
66
|
+
# * index: int
|
|
67
|
+
def delete(index)
|
|
68
|
+
# get predicate to delete
|
|
69
|
+
predicate = index_to_predicate(index)
|
|
70
|
+
|
|
71
|
+
# delete item
|
|
72
|
+
FederationManager.delete(self.uri, predicate, nil)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# remove all copy of object to OrderedSet
|
|
76
|
+
def delete_all()
|
|
77
|
+
# call delete method
|
|
78
|
+
(1..size).each do |index|
|
|
79
|
+
self.delete(index)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# replace item
|
|
84
|
+
# * index: int
|
|
85
|
+
# * object: RDFS::Resource
|
|
86
|
+
def replace(index, object)
|
|
87
|
+
# delete item
|
|
88
|
+
self.delete(index)
|
|
89
|
+
|
|
90
|
+
# get predicate for index
|
|
91
|
+
predicate = index_to_predicate(index)
|
|
92
|
+
|
|
93
|
+
# add item
|
|
94
|
+
FederationManager.add(self.uri, predicate , object)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
private
|
|
98
|
+
# execute query and return the result
|
|
99
|
+
def query
|
|
100
|
+
# execute query
|
|
101
|
+
result = Query.new.select(:p, :o).where(self.uri, :p, :o).filter('regex(str(?p), "^' + (RDF::_).uri + '")').execute
|
|
102
|
+
|
|
103
|
+
# order result
|
|
104
|
+
result = result.sort_by { |items| items[0] }
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# return predicate from index
|
|
108
|
+
def index_to_predicate(index)
|
|
109
|
+
RDFS::Resource.new(RDF::_.uri + "#{index}")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# return index of the predicate
|
|
113
|
+
def predicate_to_index(predicate)
|
|
114
|
+
predicate.uri.sub(RDF::_.uri, '')
|
|
115
|
+
end
|
|
116
|
+
end
|