Class: RdfContext::ActiveRecordStore
- Inherits:
-
AbstractSQLStore
- Object
- AbstractStore
- AbstractSQLStore
- RdfContext::ActiveRecordStore
- Defined in:
- lib/rdf_context/store/active_record_store.rb
Overview
ActiveRecord store context-ware and formula-aware implementation.
Uses an ActiveRecord::Base.connection to run statements
It stores it’s triples in the following partitions:
-
Asserted non rdf:type statements
-
Asserted rdf:type statements (in a table which models Class membership). The motivation for this partition is primarily query speed and scalability as most graphs will always have more rdf:type statements than others
-
All Quoted statements
In addition it persists namespace mappings in a seperate table
Constant Summary collapse
- CREATE_ASSERTED_STATEMENTS_TABLE =
%( CREATE TABLE %s_asserted_statements ( subject text not NULL, predicate text not NULL, object text not NULL, context text not NULL, termComb tinyint unsigned not NULL))
- CREATE_ASSERTED_TYPE_STATEMENTS_TABLE =
%( CREATE TABLE %s_type_statements ( member text not NULL, klass text not NULL, context text not NULL, termComb tinyint unsigned not NULL))
- CREATE_LITERAL_STATEMENTS_TABLE =
%( CREATE TABLE %s_literal_statements ( subject text not NULL, predicate text not NULL, object text, context text not NULL, termComb tinyint unsigned not NULL, objLanguage varchar(3), objDatatype text))
- CREATE_QUOTED_STATEMENTS_TABLE =
%( CREATE TABLE %s_quoted_statements ( subject text not NULL, predicate text not NULL, object text, context text not NULL, termComb tinyint unsigned not NULL, objLanguage varchar(3), objDatatype text))
- CREATE_NS_BINDS_TABLE =
%( CREATE TABLE %s_namespace_binds ( prefix varchar(20) UNIQUE not NULL, uri text, PRIMARY KEY (prefix)))
- DROP_ASSERTED_STATEMENTS_TABLE =
%(DROP TABLE %s_asserted_statements)
- DROP_ASSERTED_TYPE_STATEMENTS_TABLE =
%(DROP TABLE %s_type_statements)
- DROP_LITERAL_STATEMENTS_TABLE =
%(DROP TABLE %s_literal_statements)
- DROP_QUOTED_STATEMENTS_TABLE =
%(DROP TABLE %s_quoted_statements)
- DROP_NS_BINDS_TABLE =
%(DROP TABLE %s_namespace_binds)
Constants inherited from AbstractSQLStore
RdfContext::AbstractSQLStore::ASSERTED_LITERAL_PARTITION, RdfContext::AbstractSQLStore::ASSERTED_NON_TYPE_PARTITION, RdfContext::AbstractSQLStore::ASSERTED_TYPE_PARTITION, RdfContext::AbstractSQLStore::CONTEXT_SELECT, RdfContext::AbstractSQLStore::COUNT_SELECT, RdfContext::AbstractSQLStore::FULL_TRIPLE_PARTITIONS, RdfContext::AbstractSQLStore::INTERNED_PREFIX, RdfContext::AbstractSQLStore::QUOTED_PARTITION, RdfContext::AbstractSQLStore::STRONGLY_TYPED_TERMS, RdfContext::AbstractSQLStore::TRIPLE_SELECT, RdfContext::AbstractSQLStore::TRIPLE_SELECT_NO_ORDER
Constants included from TermUtils
TermUtils::CONTEXT, TermUtils::GRAPH_TERM_DICT, TermUtils::OBJECT, TermUtils::PREDICATE, TermUtils::REVERSE_TERM_COMBINATIONS, TermUtils::SUBJECT, TermUtils::TERM_COMBINATIONS, TermUtils::TERM_INSTANTIATION_DICT
Instance Attribute Summary
Attributes inherited from AbstractStore
#identifier, #nsbinding, #uri_binding
Instance Method Summary collapse
-
#buildContextClause(context, tableName) ⇒ Object
protected
Where clase utility functions.
-
#buildObjClause(object, tableName) ⇒ Object
protected
Where clase utility functions.
- #buildPredClause(predicate, tableName) ⇒ Object protected
-
#buildSubjClause(subject, tableName) ⇒ Object
protected
Where clase utility functions.
-
#buildTypeClassClause(object, tableName) ⇒ Object
protected
Where clase utility functions.
-
#buildTypeMemberClause(subject, tableName) ⇒ Object
protected
Where clase utility functions.
- #close(commit_pending_transactions = false) ⇒ Object
-
#executeSQL(qStr, *params, &block) ⇒ Object
protected
This takes the query string and parameters and (depending on the SQL implementation) either fill in the parameter in-place or pass it on to the DB impl (if it supports this).
-
#initialize(identifier = nil, configuration = {}) ⇒ ActiveRecordStore
constructor
Create a new ActiveRecordStore Store @param configuration Specific to type of storage.
- #open(options) ⇒ Object
-
#setup ⇒ Object
Create necessary tables and indecies for this database.
-
#teardown ⇒ Object
Teardown DB files.
Methods inherited from AbstractSQLStore
#_normalizeSQLCmd, #add, #asserted_table, #asserted_type_table, #bind, #buildClause, #buildLitDTypeClause, #buildLitLanguageClause, #buildLiteralTripleSQLCommand, #buildTripleSQLCommand, #buildTypeSQLCommand, #commit, #contains?, #context_aware?, #contexts, #createTerm, #destroy, #extractTriple, #formula_aware?, #literal_table, #namespace, #namespace_binds, #normalizeTerm, #nsbinding, #prefix, #queryAnalysis, #quoted_table, #remove, #remove_context, #rollback, #size, #transaction_aware?, #triples, #unionSELECT, #uri_binding
Methods included from TermUtils
#constructGraph, #normalizeGraph, #statement2TermCombination, #term2Letter, #type2TermCombination
Methods inherited from AbstractStore
#add, #bind, #bnodes, #commit, #contains?, #context_aware?, #contexts, #destroy, #formula_aware?, #inspect, #item, #namespace, #objects, #predicates, #prefix, #remove, #rollback, #size, #subjects, #transaction_aware?, #triples
Constructor Details
#initialize(identifier = nil, configuration = {}) ⇒ ActiveRecordStore
Create a new ActiveRecordStore Store @param configuration Specific to type of storage
22 23 24 25 |
# File 'lib/rdf_context/store/active_record_store.rb', line 22 def initialize(identifier = nil, configuration = {}) super(identifier, configuration) @autocommit_default = false end |
Instance Method Details
#buildContextClause(context, tableName) ⇒ Object (protected)
Where clase utility functions
164 165 166 167 168 169 170 171 172 173 |
# File 'lib/rdf_context/store/active_record_store.rb', line 164 def buildContextClause(context, tableName) context = normalizeTerm(context) if context # case context # when REGEXTerm # when Array # else ["#{tableName}.context=?", context] if context # end end |
#buildObjClause(object, tableName) ⇒ Object (protected)
Where clase utility functions
152 153 154 155 156 157 158 159 160 161 |
# File 'lib/rdf_context/store/active_record_store.rb', line 152 def buildObjClause(object, tableName) case object # when REGEXTerm # when Array when Graph ["#{tableName}.object=?", self.normalizeTerm(object.identifier)] else ["#{tableName}.object=?", object] if object end end |
#buildPredClause(predicate, tableName) ⇒ Object (protected)
142 143 144 145 146 147 148 149 |
# File 'lib/rdf_context/store/active_record_store.rb', line 142 def buildPredClause(predicate, tableName) # case predicate # when REGEXTerm # when Array # else ["#{tableName}.predicate=?", predicate] if predicate # end end |
#buildSubjClause(subject, tableName) ⇒ Object (protected)
Where clase utility functions
131 132 133 134 135 136 137 138 139 140 |
# File 'lib/rdf_context/store/active_record_store.rb', line 131 def buildSubjClause(subject, tableName) case subject # when REGEXTerm # when Array when Graph ["#{tableName}.subject=?", self.normalizeTerm(subject.identifier)] else ["#{tableName}.subject=?", subject] if subject end end |
#buildTypeClassClause(object, tableName) ⇒ Object (protected)
Where clase utility functions
186 187 188 189 190 191 192 |
# File 'lib/rdf_context/store/active_record_store.rb', line 186 def buildTypeClassClause(object, tableName) # case context # when REGEXTerm # else ["#{tableName}.klass=?", object] if object # end end |
#buildTypeMemberClause(subject, tableName) ⇒ Object (protected)
Where clase utility functions
176 177 178 179 180 181 182 183 |
# File 'lib/rdf_context/store/active_record_store.rb', line 176 def buildTypeMemberClause(subject, tableName) # case context # when REGEXTerm # when Array # else ["#{tableName}.member=?", subject] if subject # end end |
#close(commit_pending_transactions = false) ⇒ Object
30 31 32 |
# File 'lib/rdf_context/store/active_record_store.rb', line 30 def close(commit_pending_transactions = false) ActiveRecord::Base.connection.commit_db_transaction if commit_pending_transactions end |
#executeSQL(qStr, *params, &block) ⇒ Object (protected)
This takes the query string and parameters and (depending on the SQL implementation) either fill in the parameter in-place or pass it on to the DB impl (if it supports this). The default (here) is to fill the parameters in-place surrounding each param with quote characters
Yields each row
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/rdf_context/store/active_record_store.rb', line 199 def executeSQL(qStr, *params, &block) conn = ActiveRecord::Base.connection puts "executeSQL: params=#{params.flatten.inspect}" if ::RdfContext::debug? puts "executeSQL: '#{params.dup.unshift(qStr).join("', '")}'" if ::RdfContext::debug? qStr = ActiveRecord::Base.send(:replace_bind_variables, qStr, params.flatten) puts " => '#{qStr}'" if ::RdfContext::debug? if block_given? conn.select_rows(qStr).each do |row| yield(row) end else puts "executeSQL no block given" if ::RdfContext::debug? conn.select_rows(qStr) end rescue StandardError => e puts "SQL Exception (ignored): #{e.}" if ::RdfContext::debug? end |
#open(options) ⇒ Object
27 28 |
# File 'lib/rdf_context/store/active_record_store.rb', line 27 def open() end |
#setup ⇒ Object
Create necessary tables and indecies for this database
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/rdf_context/store/active_record_store.rb', line 35 def setup executeSQL(CREATE_ASSERTED_STATEMENTS_TABLE % @internedId) executeSQL(CREATE_ASSERTED_TYPE_STATEMENTS_TABLE % @internedId) executeSQL(CREATE_QUOTED_STATEMENTS_TABLE % @internedId) executeSQL(CREATE_NS_BINDS_TABLE % @internedId) executeSQL(CREATE_LITERAL_STATEMENTS_TABLE % @internedId) # Create indicies { asserted_table => { "#{@internedId}_A_termComb_index" => %w(termComb), "#{@internedId}_A_s_index" => %w(subject), "#{@internedId}_A_p_index" => %w(predicate), "#{@internedId}_A_o_index" => %w(object), "#{@internedId}_A_c_index" => %w(context), }, asserted_type_table => { "#{@internedId}_T_termComb_index" => %w(termComb), "#{@internedId}_T_member_index" => %w(member), "#{@internedId}_T_klass_index" => %w(klass), "#{@internedId}_T_c_index" => %w(context), }, literal_table => { "#{@internedId}_L_termComb_index" => %w(termComb), "#{@internedId}_L_s_index" => %w(subject), "#{@internedId}_L_p_index" => %w(predicate), "#{@internedId}_L_c_index" => %w(context), }, quoted_table => { "#{@internedId}_Q_termComb_index" => %w(termComb), "#{@internedId}_Q_s_index" => %w(subject), "#{@internedId}_Q_p_index" => %w(predicate), "#{@internedId}_Q_o_index" => %w(object), "#{@internedId}_Q_c_index" => %w(context), }, namespace_binds => { "#{@internedId}_uri_index" => %w(uri), } }.each_pair do |tablename, indicies| indicies.each_pair do |index, columns| executeSQL("CREATE INDEX #{index} on #{tablename} ('#{columns.join(', ')}')") end end end |
#teardown ⇒ Object
Teardown DB files
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/rdf_context/store/active_record_store.rb', line 81 def teardown # Drop indicies { asserted_table => { "#{@internedId}_A_termComb_index" => %w(termComb), "#{@internedId}_A_s_index" => %w(subject), "#{@internedId}_A_p_index" => %w(predicate), "#{@internedId}_A_o_index" => %w(object), "#{@internedId}_A_c_index" => %w(context), }, asserted_type_table => { "#{@internedId}_T_termComb_index" => %w(termComb), "#{@internedId}_T_member_index" => %w(member), "#{@internedId}_T_klass_index" => %w(klass), "#{@internedId}_T_c_index" => %w(context), }, literal_table => { "#{@internedId}_L_termComb_index" => %w(termComb), "#{@internedId}_L_s_index" => %w(subject), "#{@internedId}_L_p_index" => %w(predicate), "#{@internedId}_L_c_index" => %w(context), }, quoted_table => { "#{@internedId}_Q_termComb_index" => %w(termComb), "#{@internedId}_Q_s_index" => %w(subject), "#{@internedId}_Q_p_index" => %w(predicate), "#{@internedId}_Q_o_index" => %w(object), "#{@internedId}_Q_c_index" => %w(context), }, namespace_binds => { "#{@internedId}_uri_index" => %w(uri), } }.each_pair do |tablename, indicies| tn = "#{@internedId}_#{tablename}" indicies.each_pair do |index, columns| executeSQL("DROP INDEX #{index} ON #{tn}") end end # Drop tables executeSQL("DROP TABLE #{namespace_binds}") executeSQL("DROP TABLE #{quoted_table}") executeSQL("DROP TABLE #{literal_table}") executeSQL("DROP TABLE #{asserted_type_table}") executeSQL("DROP TABLE #{asserted_table}") end |