graffiti 2.1

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.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>