graffiti 2.1

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog.mtn ADDED
@@ -0,0 +1,233 @@
1
+ -----------------------------------------------------------------
2
+ Revision: 5f07d75e7786d56d30659b04ac0091fc8bc37fda
3
+ Ancestor: e13812ed0f84c7e722284750df4ac1a8ef81a501
4
+ Author: angdraug@debian.org
5
+ Date: 2009-10-11T12:23:07
6
+ Branch: graffiti-head
7
+
8
+ Deleted entries:
9
+ doc/diagrams/graffiti_classes.dia
10
+ Added files:
11
+ doc/diagrams/graffiti-classes.svg
12
+ doc/diagrams/graffiti-deployment.svg
13
+ doc/diagrams/graffiti-store-sequence.svg
14
+ doc/diagrams/squish-select-sequence.svg
15
+
16
+ ChangeLog:
17
+
18
+ replaced the old Dia diagram with SVG diagrams produced with BoUML
19
+
20
+ -----------------------------------------------------------------
21
+ Revision: e13812ed0f84c7e722284750df4ac1a8ef81a501
22
+ Ancestor: e364f136ecc00b4559a0f0d07f257886f48ae4ef
23
+ Author: angdraug@debian.org
24
+ Date: 2009-09-06T13:47:40
25
+ Branch: graffiti-head
26
+
27
+ Modified files:
28
+ README.rdoc
29
+
30
+ ChangeLog:
31
+
32
+ relational data adaptation instructions added
33
+
34
+ -----------------------------------------------------------------
35
+ Revision: e364f136ecc00b4559a0f0d07f257886f48ae4ef
36
+ Ancestor: f2ef2d91fb1e29ee91928b5ebf52c22b09def60b
37
+ Author: angdraug@debian.org
38
+ Date: 2009-09-06T13:22:12
39
+ Branch: graffiti-head
40
+
41
+ Modified files:
42
+ README.rdoc
43
+
44
+ ChangeLog:
45
+
46
+ update language description added
47
+
48
+ -----------------------------------------------------------------
49
+ Revision: f2ef2d91fb1e29ee91928b5ebf52c22b09def60b
50
+ Ancestor: c5c5ad50f2f0e1159628804eb141c60977483fb7
51
+ Author: angdraug@debian.org
52
+ Date: 2009-09-06T13:12:45
53
+ Branch: graffiti-head
54
+
55
+ Modified files:
56
+ README.rdoc
57
+
58
+ ChangeLog:
59
+
60
+ query language description added
61
+
62
+ -----------------------------------------------------------------
63
+ Revision: c5c5ad50f2f0e1159628804eb141c60977483fb7
64
+ Ancestor: c6389322361c36538d626257f8dd957864e7b85e
65
+ Author: angdraug@debian.org
66
+ Date: 2009-08-22T12:38:32
67
+ Branch: graffiti-head
68
+
69
+ Modified files:
70
+ TODO lib/graffiti/rdf_config.rb
71
+ lib/graffiti/rdf_property_map.rb lib/graffiti/sql_mapper.rb
72
+
73
+ ChangeLog:
74
+
75
+ move setting of subproperty_of and transitive_closure outside of the RdfPropertyMap constructor; documented some missing pieces
76
+
77
+ -----------------------------------------------------------------
78
+ Revision: c6389322361c36538d626257f8dd957864e7b85e
79
+ Ancestor: 41a4f5d475227a9df9aae268506bcdb2dbf2e6ab
80
+ Author: angdraug@debian.org
81
+ Date: 2009-08-22T12:37:03
82
+ Branch: graffiti-head
83
+
84
+ Modified files:
85
+ lib/graffiti/squish.rb
86
+
87
+ ChangeLog:
88
+
89
+ use @db, db shortcut is no longer available
90
+
91
+ -----------------------------------------------------------------
92
+ Revision: 41a4f5d475227a9df9aae268506bcdb2dbf2e6ab
93
+ Ancestor: bed7201b8512540b0c225add168a66b18cfad5f3
94
+ Author: angdraug@debian.org
95
+ Date: 2009-08-05T13:16:50
96
+ Branch: graffiti-head
97
+
98
+ Modified files:
99
+ lib/graffiti/squish.rb
100
+
101
+ ChangeLog:
102
+
103
+ allow PostgreSQL full text search operators in expressions
104
+
105
+ -----------------------------------------------------------------
106
+ Revision: bed7201b8512540b0c225add168a66b18cfad5f3
107
+ Ancestor: 3538ff90e492811cd2c022cf6502439090241d8e
108
+ Author: angdraug@debian.org
109
+ Date: 2009-08-02T14:34:09
110
+ Branch: graffiti-head
111
+
112
+ Modified files:
113
+ lib/graffiti/sql_mapper.rb
114
+
115
+ ChangeLog:
116
+
117
+ move SqlNodeBinding and SqlExpression out of SqlMapper namespace; move exception raising into check_graph
118
+
119
+ -----------------------------------------------------------------
120
+ Revision: 3538ff90e492811cd2c022cf6502439090241d8e
121
+ Ancestor: ad944a53e855766391fb1840b09cc47eac78f911
122
+ Author: angdraug@debian.org
123
+ Date: 2009-07-30T08:50:54
124
+ Branch: graffiti-head
125
+
126
+ Added files:
127
+ lib/graffiti/exceptions.rb lib/graffiti/rdf_config.rb
128
+ lib/graffiti/rdf_property_map.rb lib/graffiti/sql_mapper.rb
129
+ lib/graffiti/squish.rb lib/graffiti/store.rb
130
+ Added directories:
131
+ lib/graffiti
132
+ Modified files:
133
+ lib/graffiti.rb
134
+
135
+ ChangeLog:
136
+
137
+ split Graffiti classes into their own .rb files
138
+
139
+ -----------------------------------------------------------------
140
+ Revision: ad944a53e855766391fb1840b09cc47eac78f911
141
+ Ancestor: 35e3b7019eda146e755449c86f2b04f035796608
142
+ Author: angdraug@debian.org
143
+ Date: 2009-07-28T12:42:47
144
+ Branch: graffiti-head
145
+
146
+ Modified files:
147
+ README.rdoc
148
+
149
+ ChangeLog:
150
+
151
+ mention SynCache in README.rdoc
152
+
153
+ -----------------------------------------------------------------
154
+ Revision: 35e3b7019eda146e755449c86f2b04f035796608
155
+ Ancestor: 7eeecf40a8f1e0127ecc6d2f818bd6d80e0b1f90
156
+ Author: angdraug@debian.org
157
+ Date: 2009-07-28T10:56:06
158
+ Branch: graffiti-head
159
+
160
+ Modified files:
161
+ README.rdoc lib/graffiti.rb test/ts_graffiti.rb
162
+
163
+ ChangeLog:
164
+
165
+ module initialization fixes
166
+
167
+ -----------------------------------------------------------------
168
+ Revision: 7eeecf40a8f1e0127ecc6d2f818bd6d80e0b1f90
169
+ Ancestor: 35efa8b3fb65bbe7744fc930dc3ceb5a98564a98
170
+ Author: angdraug@debian.org
171
+ Date: 2009-07-28T10:45:31
172
+ Branch: graffiti-head
173
+
174
+ Modified files:
175
+ README.rdoc
176
+
177
+ ChangeLog:
178
+
179
+ minor documentation cleanup
180
+
181
+ -----------------------------------------------------------------
182
+ Revision: 35efa8b3fb65bbe7744fc930dc3ceb5a98564a98
183
+ Ancestor: 60fc13b5ffccadc9990d5303de93e71be30128bb
184
+ Author: angdraug@debian.org
185
+ Date: 2009-07-28T10:38:48
186
+ Branch: graffiti-head
187
+
188
+ Added files:
189
+ doc/diagrams/graffiti_classes.dia
190
+ Added directories:
191
+ doc/diagrams
192
+ Modified files:
193
+ README.rdoc
194
+
195
+ ChangeLog:
196
+
197
+ documentation update
198
+
199
+ -----------------------------------------------------------------
200
+ Revision: 60fc13b5ffccadc9990d5303de93e71be30128bb
201
+ Ancestor: abd14a047ad68bc4e92ca80916e71a39f605b14c
202
+ Author: angdraug@debian.org
203
+ Date: 2009-07-27T19:20:47
204
+ Branch: graffiti-head
205
+
206
+ Renamed entries:
207
+ doc/examples/samizdat-triggers-pgsql-sql to doc/examples/samizdat-triggers-pgsql.sql
208
+
209
+ ChangeLog:
210
+
211
+ fixed .sql extension for triggers example
212
+
213
+ -----------------------------------------------------------------
214
+ Revision: abd14a047ad68bc4e92ca80916e71a39f605b14c
215
+ Ancestor:
216
+ Author: angdraug@debian.org
217
+ Date: 2009-07-27T19:16:55
218
+ Branch: graffiti-head
219
+
220
+ Added files:
221
+ COPYING README.rdoc TODO
222
+ doc/examples/samizdat-rdf-config.yaml
223
+ doc/examples/samizdat-triggers-pgsql-sql
224
+ doc/papers/collreif.tex doc/papers/rel-rdf.tex
225
+ doc/rdf-impl-report.txt lib/graffiti.rb setup.rb
226
+ test/ts_graffiti.rb
227
+ Added directories:
228
+ . doc doc/examples doc/papers lib test
229
+
230
+ ChangeLog:
231
+
232
+ initial checkin: Graffiti is a spin-off of storage.rb from Samizdat project
233
+
data/README.rdoc ADDED
@@ -0,0 +1,129 @@
1
+ = Graffiti - relational RDF store for Ruby
2
+
3
+ == Synopsis
4
+
5
+ require 'sequel'
6
+ require 'yaml'
7
+ require 'graffiti'
8
+
9
+ db = Sequel.connect(:adapter => 'pg', :database = > dbname)
10
+ config = File.open('rdf.yaml') {|f| YAML.load(f.read) }
11
+ store = Graffiti::Store.new(db, config)
12
+
13
+ data = store.fetch(%{
14
+ SELECT ?date, ?title
15
+ WHERE (dc::date ?r ?date FILTER ?date >= :start)
16
+ (dc::title ?r ?title)
17
+ ORDER BY ?date DESC}, 10, 0, :start => Time.now - 24*3600)
18
+
19
+ puts data.first[:title]
20
+
21
+
22
+ == Description
23
+
24
+ Graffiti is an RDF store based on dynamic translation of RDF queries
25
+ into SQL. Graffiti allows to map any relational database schema into RDF
26
+ semantics and vice versa, to store any RDF data in a relational
27
+ database.
28
+
29
+
30
+ == Requirements
31
+
32
+ Graffiti uses Sequel to connect to database backend and provides a
33
+ DBI-like interface to run RDF queries in Squish query language from Ruby
34
+ applications. SynCache object cache is used for in-process cache of
35
+ translated Squish queries.
36
+
37
+
38
+ == Query Language
39
+
40
+ Graffiti implements Squish RDF query language with several extensions. A
41
+ query may include following clauses:
42
+
43
+ * SELECT: comma-separated list of result expressions, which may be
44
+ variables or aggregate functions.
45
+
46
+ * WHERE: main graph pattern, described as a list of triple patterns.
47
+ Each triple is enclosed in parenthesis and includes predicate, subject
48
+ and object. Predicate must be a URL and may use a shorthand notation
49
+ with namespace id separated by double colon. Subject may be a URL,
50
+ internal resource id, or variable. Object may be a URL, internal
51
+ resource id, variable, or literal. Values of variables bound by the
52
+ triple pattern may be bound by an optional FILTER expression.
53
+
54
+ * EXCEPT: negative graph pattern. Solutions that match any part of the
55
+ negative graph pattern are excluded from the result set.
56
+
57
+ * OPTIONAL: optional graph pattern. Variables defined in the optional
58
+ pattern are only included in the result set only for solutions that
59
+ match corresponding parts of the optional graph pattern.
60
+
61
+ * LITERAL: global filter expression. Used for expressions that involve
62
+ variables from different triple patterns.
63
+
64
+ * GROUP BY: result set aggregation criteria.
65
+
66
+ * ORDER BY: result set ordering criteria.
67
+
68
+ * USING: namespaces definitions. Namespaces defined in the RDF store
69
+ configuration do not have to be repeated here.
70
+
71
+ A basic update language is also implemented. A Squish assert statement
72
+ uses the same structure as a query, with SELECT clause replaced by
73
+ either one or both of the following clauses:
74
+
75
+ * INSERT: list of variables representing new resources to be inserted
76
+ into the RDF graph.
77
+
78
+ * UPDATE: list of assignments of literal expressions to variables bound
79
+ by a solution.
80
+
81
+ Assert statement will only update one solution per invocation, if more
82
+ solutions match the graph pattern, only the first will be updated.
83
+
84
+
85
+ == Relational Data
86
+
87
+ Relational data has to be adapted for RDF access using Graffiti. The
88
+ adaptation is non-intrusive and will not break compatibility with
89
+ existing SQL queries.
90
+
91
+ Following schema changes are required for all cases:
92
+
93
+ * Create rdfs:Resource superclass table with auto-generated primary key.
94
+
95
+ * Replace primary keys of mapped subclass tables with foreign keys
96
+ referencing the rdfs:Resource table (existing foreign keys may need to
97
+ be updated to reflect this change.
98
+
99
+ * Register rdfs:subClassOf inference database triggers to update the
100
+ rdfs:Re-source table and maintain foreign keys integrity on all
101
+ changes in mapped subclass tables.
102
+
103
+ Following changes may be necessary to support optional RDF mapping
104
+ features:
105
+
106
+ * Register database triggers for other cases of rdfs:subClassOf
107
+ entailment.
108
+
109
+ * Create triples table (required to represent non-relational RDF data
110
+ and RDF statement reification).
111
+
112
+ * Add sub-property qualifier attributes referencing property URIref
113
+ entry in the rdfs:Resource table for each attribute mapped to a
114
+ super-property.
115
+
116
+ * Create transitive closure tables, register owl:TransitiveProperty
117
+ inference triggers.
118
+
119
+ Example of RDF map and corresponding triggers can be found in
120
+ doc/examples/.
121
+
122
+
123
+ == Copying
124
+
125
+ Copyright (c) 2002-2011 Dmitry Borodaenko <angdraug@debian.org>
126
+
127
+ This program is free software.
128
+ You can distribute/modify this program under the terms of the GNU
129
+ General Public License version 3 or later.
data/TODO ADDED
@@ -0,0 +1,30 @@
1
+ Graffiti ToDo List
2
+ ==================
3
+
4
+ - generalize RDF storage, implement SPARQL
5
+ - unit, functional, and performance test suite (in progress)
6
+ - separate library for RDF storage (done)
7
+ - investigate alternative backends: FramerD, 3store, Redland
8
+ -- depends on separate library for RDF storage
9
+ -- depends on test suite
10
+ - security: Squish literal condition safety (done), limited number of
11
+ query clauses (done), dry-run of user-defined query, approvable
12
+ resource usage
13
+ - query result set representation
14
+ - optional patterns and negation (done)
15
+ - parametrized queries (done)
16
+ -- cache prepared statements
17
+ - support blob literals
18
+ -- depends on parametrized queries
19
+ - vocabulary entailment: RDF, RDFS, OWL
20
+ - RDF aggregates storage internalization (Seq, Bag, Alt)
21
+ - query introspection
22
+ - storage workflow control (triggers)
23
+ - transparent (structured) RDF query storage
24
+ -- depends on RDF aggregates storage
25
+ -- depends on storage workflow control
26
+ - subqueries (query premise)
27
+ -- depends on transparent query storage
28
+ - chain queries
29
+ -- depends on native RDF storage
30
+
@@ -0,0 +1,157 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Bouml (http://bouml.free.fr/) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg width="667" height="486" version="1.1" xmlns="http://www.w3.org/2000/svg">
5
+ <g>
6
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="163" y="22" width="3" height="145" />
7
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="21" y="164" width="145" height="3" />
8
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="17" y="18" width="146" height="146" />
9
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="90" y="31">SquishQuery</text>
10
+ <line stroke="black" stroke-opacity="1" x1="17" y1="40" x2="163" y2="40" />
11
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="21" y="53">ns</text>
12
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="21" y="73">variables</text>
13
+ <line stroke="black" stroke-opacity="1" x1="17" y1="82" x2="163" y2="82" />
14
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="21" y="95">uri_shrink()</text>
15
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="21" y="115">ns_shrink()</text>
16
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="21" y="135">substitute_literals()</text>
17
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="21" y="155">validate_expression()</text>
18
+ </g>
19
+ <g>
20
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="495" y="24" width="3" height="285" />
21
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="271" y="306" width="227" height="3" />
22
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="267" y="20" width="228" height="286" />
23
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="381" y="33">SqlMapper</text>
24
+ <line stroke="black" stroke-opacity="1" x1="267" y1="42" x2="495" y2="42" />
25
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="55">clauses</text>
26
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="75">nodes</text>
27
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="95">from</text>
28
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="115">where</text>
29
+ <line stroke="black" stroke-opacity="1" x1="267" y1="124" x2="495" y2="124" />
30
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="137">bind()</text>
31
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="157">check_graph()</text>
32
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="177">map_predicates()</text>
33
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="197">label_pattern_components()</text>
34
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="217">map_pattern()</text>
35
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="237">refine_ambiguous_properties()</text>
36
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="257">define_relation_aliases()</text>
37
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="277">transform()</text>
38
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="297">generate_tables_and_conditions()</text>
39
+ </g>
40
+ <g>
41
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="141" y="335" width="3" height="51" />
42
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="43" y="383" width="101" height="3" />
43
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="39" y="331" width="102" height="52" />
44
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="90" y="344">SquishSelect</text>
45
+ <line stroke="black" stroke-opacity="1" x1="39" y1="353" x2="141" y2="353" />
46
+ <line stroke="black" stroke-opacity="1" x1="39" y1="361" x2="141" y2="361" />
47
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="43" y="374">to_sql()</text>
48
+ </g>
49
+ <g>
50
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="225" y="247" width="3" height="51" />
51
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="127" y="295" width="101" height="3" />
52
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="123" y="243" width="102" height="52" />
53
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="174" y="256">SquishAssert</text>
54
+ <line stroke="black" stroke-opacity="1" x1="123" y1="265" x2="225" y2="265" />
55
+ <line stroke="black" stroke-opacity="1" x1="123" y1="273" x2="225" y2="273" />
56
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="127" y="286">assert()</text>
57
+ </g>
58
+ <g>
59
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="644" y="24" width="3" height="125" />
60
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="538" y="146" width="109" height="3" />
61
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="534" y="20" width="110" height="126" />
62
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="589" y="33">SqlExpression</text>
63
+ <line stroke="black" stroke-opacity="1" x1="534" y1="42" x2="644" y2="42" />
64
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="538" y="55">parts</text>
65
+ <line stroke="black" stroke-opacity="1" x1="534" y1="64" x2="644" y2="64" />
66
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="538" y="77">to_s()</text>
67
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="538" y="97">traverse()</text>
68
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="538" y="117">rebind()</text>
69
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="538" y="137">eql?()</text>
70
+ </g>
71
+ <g>
72
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="651" y="183" width="3" height="125" />
73
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="531" y="305" width="123" height="3" />
74
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="527" y="179" width="124" height="126" />
75
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="589" y="192">SqlNodeBinding</text>
76
+ <line stroke="black" stroke-opacity="1" x1="527" y1="201" x2="651" y2="201" />
77
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="531" y="214">alias</text>
78
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="531" y="234">field</text>
79
+ <line stroke="black" stroke-opacity="1" x1="527" y1="243" x2="651" y2="243" />
80
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="531" y="256">to_s()</text>
81
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="531" y="276">eql?()</text>
82
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="531" y="296">hash()</text>
83
+ </g>
84
+ <g>
85
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="365" y="342" width="3" height="131" />
86
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="271" y="470" width="97" height="3" />
87
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="267" y="338" width="98" height="132" />
88
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="316" y="351">Store</text>
89
+ <line stroke="black" stroke-opacity="1" x1="267" y1="360" x2="365" y2="360" />
90
+ <line stroke="black" stroke-opacity="1" x1="267" y1="368" x2="365" y2="368" />
91
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="381">get_property()</text>
92
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="401">select_one()</text>
93
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="421">select_all()</text>
94
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="441">assert()</text>
95
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="271" y="461">select()</text>
96
+ </g>
97
+ <g>
98
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="524" y="342" width="3" height="85" />
99
+ <rect fill="#808080" stroke="none" stroke-opacity="1" x="440" y="424" width="87" height="3" />
100
+ <rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="436" y="338" width="88" height="86" />
101
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="480" y="351">RdfConfig</text>
102
+ <line stroke="black" stroke-opacity="1" x1="436" y1="360" x2="524" y2="360" />
103
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="440" y="373">ns</text>
104
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="440" y="393">map</text>
105
+ <line stroke="black" stroke-opacity="1" x1="436" y1="402" x2="524" y2="402" />
106
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="440" y="415">ns_expand()</text>
107
+ </g>
108
+ <g>
109
+ <line stroke="black" stroke-opacity="1" x1="266" y1="31" x2="260" y2="25" />
110
+ <line stroke="black" stroke-opacity="1" x1="266" y1="31" x2="260" y2="37" />
111
+ <line stroke="black" stroke-opacity="1" x1="167" y1="31" x2="266" y2="31" />
112
+ </g>
113
+ <g>
114
+ <line stroke="black" stroke-opacity="1" x1="92" y1="330" x2="92" y2="174" />
115
+ <line stroke="black" stroke-opacity="1" x1="92" y1="168" x2="86" y2="174" />
116
+ <line stroke="black" stroke-opacity="1" x1="92" y1="168" x2="98" y2="174" />
117
+ <line stroke="black" stroke-opacity="1" x1="86" y1="174" x2="98" y2="174" />
118
+ </g>
119
+ <g>
120
+ <line stroke="black" stroke-opacity="1" x1="162" y1="242" x2="129" y2="173" />
121
+ <line stroke="black" stroke-opacity="1" x1="127" y1="168" x2="124" y2="175" />
122
+ <line stroke="black" stroke-opacity="1" x1="127" y1="168" x2="134" y2="170" />
123
+ <line stroke="black" stroke-opacity="1" x1="124" y1="175" x2="134" y2="170" />
124
+ </g>
125
+ <g>
126
+ <line stroke="black" stroke-opacity="1" x1="533" y1="32" x2="527" y2="26" />
127
+ <line stroke="black" stroke-opacity="1" x1="533" y1="32" x2="527" y2="38" />
128
+ <line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="499" y1="32" x2="533" y2="32" />
129
+ </g>
130
+ <g>
131
+ <line stroke="black" stroke-opacity="1" x1="591" y1="178" x2="597" y2="172" />
132
+ <line stroke="black" stroke-opacity="1" x1="591" y1="178" x2="585" y2="172" />
133
+ <line stroke="black" stroke-opacity="1" x1="591" y1="150" x2="591" y2="178" />
134
+ <polygon fill="#ffffff" stroke="black" stroke-opacity="1" points="591,150 597,156 591,162 585,156" />
135
+ </g>
136
+ <g>
137
+ <line stroke="black" stroke-opacity="1" x1="189" y1="299" x2="186" y2="307" />
138
+ <line stroke="black" stroke-opacity="1" x1="189" y1="299" x2="197" y2="301" />
139
+ <line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="266" y1="444" x2="189" y2="299" />
140
+ </g>
141
+ <g>
142
+ <line stroke="black" stroke-opacity="1" x1="142" y1="387" x2="144" y2="395" />
143
+ <line stroke="black" stroke-opacity="1" x1="142" y1="387" x2="150" y2="384" />
144
+ <line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="266" y1="459" x2="142" y2="387" />
145
+ </g>
146
+ <g>
147
+ <line stroke="black" stroke-opacity="1" x1="435" y1="350" x2="429" y2="344" />
148
+ <line stroke="black" stroke-opacity="1" x1="435" y1="350" x2="429" y2="356" />
149
+ <line stroke="black" stroke-opacity="1" x1="369" y1="350" x2="435" y2="350" />
150
+ </g>
151
+ <g>
152
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="179" y="18">sql_mapper</text>
153
+ </g>
154
+ <g>
155
+ <text font-family="Arial" font-size="11" fill="#000000" xml:space="preserve" x="386" y="337">config</text>
156
+ </g>
157
+ </svg>