rdf_context 0.4.2

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.
Files changed (551) hide show
  1. data/.autotest +2 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +3 -0
  4. data/History.txt +73 -0
  5. data/README.rdoc +145 -0
  6. data/Rakefile +77 -0
  7. data/VERSION +1 -0
  8. data/bin/reddy +59 -0
  9. data/lib/rdf_context.rb +60 -0
  10. data/lib/rdf_context/bnode.rb +99 -0
  11. data/lib/rdf_context/conjunctive_graph.rb +47 -0
  12. data/lib/rdf_context/exceptions.rb +11 -0
  13. data/lib/rdf_context/graph.rb +333 -0
  14. data/lib/rdf_context/literal.rb +340 -0
  15. data/lib/rdf_context/n3_grammar.rb +2171 -0
  16. data/lib/rdf_context/n3_grammar.treetop +143 -0
  17. data/lib/rdf_context/n3parser.rb +152 -0
  18. data/lib/rdf_context/namespace.rb +82 -0
  19. data/lib/rdf_context/nokogiri_hacks.rb +8 -0
  20. data/lib/rdf_context/parser.rb +119 -0
  21. data/lib/rdf_context/rdfaparser.rb +398 -0
  22. data/lib/rdf_context/rdfxmlparser.rb +525 -0
  23. data/lib/rdf_context/store/abstract_sql_store.rb +843 -0
  24. data/lib/rdf_context/store/abstract_store.rb +64 -0
  25. data/lib/rdf_context/store/list_store.rb +63 -0
  26. data/lib/rdf_context/store/memory_store.rb +323 -0
  27. data/lib/rdf_context/store/sqlite3_store.rb +223 -0
  28. data/lib/rdf_context/string_hacks.rb +108 -0
  29. data/lib/rdf_context/term_utils.rb +196 -0
  30. data/lib/rdf_context/triple.rb +144 -0
  31. data/lib/rdf_context/uriref.rb +95 -0
  32. data/script/console +10 -0
  33. data/spec/bnode_spec.rb +58 -0
  34. data/spec/conjunctive_graph_spec.rb +60 -0
  35. data/spec/graph_spec.rb +390 -0
  36. data/spec/list_store_spec.rb +12 -0
  37. data/spec/literal_spec.rb +314 -0
  38. data/spec/matchers.rb +150 -0
  39. data/spec/memory_store_spec.rb +23 -0
  40. data/spec/n3parser_spec.rb +229 -0
  41. data/spec/namespaces_spec.rb +66 -0
  42. data/spec/ntriples/test.nt +78 -0
  43. data/spec/parser_spec.rb +29 -0
  44. data/spec/rdfa-triples/0001.nt +1 -0
  45. data/spec/rdfa-triples/0006.nt +2 -0
  46. data/spec/rdfa-triples/0007.nt +3 -0
  47. data/spec/rdfa-triples/0008.nt +1 -0
  48. data/spec/rdfa-triples/0009.nt +1 -0
  49. data/spec/rdfa-triples/0010.nt +2 -0
  50. data/spec/rdfa-triples/0011.nt +3 -0
  51. data/spec/rdfa-triples/0012.nt +1 -0
  52. data/spec/rdfa-triples/0013.nt +1 -0
  53. data/spec/rdfa-triples/0014.nt +1 -0
  54. data/spec/rdfa-triples/0015.nt +2 -0
  55. data/spec/rdfa-triples/0017.nt +3 -0
  56. data/spec/rdfa-triples/0018.nt +1 -0
  57. data/spec/rdfa-triples/0019.nt +1 -0
  58. data/spec/rdfa-triples/0020.nt +1 -0
  59. data/spec/rdfa-triples/0021.nt +1 -0
  60. data/spec/rdfa-triples/0023.nt +1 -0
  61. data/spec/rdfa-triples/0025.nt +2 -0
  62. data/spec/rdfa-triples/0026.nt +1 -0
  63. data/spec/rdfa-triples/0027.nt +1 -0
  64. data/spec/rdfa-triples/0029.nt +1 -0
  65. data/spec/rdfa-triples/0030.nt +1 -0
  66. data/spec/rdfa-triples/0031.nt +1 -0
  67. data/spec/rdfa-triples/0032.nt +1 -0
  68. data/spec/rdfa-triples/0033.nt +2 -0
  69. data/spec/rdfa-triples/0034.nt +1 -0
  70. data/spec/rdfa-triples/0035.nt +1 -0
  71. data/spec/rdfa-triples/0036.nt +1 -0
  72. data/spec/rdfa-triples/0037.nt +1 -0
  73. data/spec/rdfa-triples/0038.nt +1 -0
  74. data/spec/rdfa-triples/0039.nt +1 -0
  75. data/spec/rdfa-triples/0040.nt +1 -0
  76. data/spec/rdfa-triples/0041.nt +1 -0
  77. data/spec/rdfa-triples/0042.nt +0 -0
  78. data/spec/rdfa-triples/0046.nt +3 -0
  79. data/spec/rdfa-triples/0047.nt +3 -0
  80. data/spec/rdfa-triples/0048.nt +3 -0
  81. data/spec/rdfa-triples/0049.nt +2 -0
  82. data/spec/rdfa-triples/0050.nt +2 -0
  83. data/spec/rdfa-triples/0051.nt +2 -0
  84. data/spec/rdfa-triples/0052.nt +1 -0
  85. data/spec/rdfa-triples/0053.nt +2 -0
  86. data/spec/rdfa-triples/0054.nt +2 -0
  87. data/spec/rdfa-triples/0055.nt +2 -0
  88. data/spec/rdfa-triples/0056.nt +3 -0
  89. data/spec/rdfa-triples/0057.nt +4 -0
  90. data/spec/rdfa-triples/0058.nt +6 -0
  91. data/spec/rdfa-triples/0059.nt +6 -0
  92. data/spec/rdfa-triples/0060.nt +2 -0
  93. data/spec/rdfa-triples/0061.nt +1 -0
  94. data/spec/rdfa-triples/0062.nt +1 -0
  95. data/spec/rdfa-triples/0063.nt +1 -0
  96. data/spec/rdfa-triples/0064.nt +1 -0
  97. data/spec/rdfa-triples/0065.nt +3 -0
  98. data/spec/rdfa-triples/0066.nt +1 -0
  99. data/spec/rdfa-triples/0067.nt +1 -0
  100. data/spec/rdfa-triples/0068.nt +1 -0
  101. data/spec/rdfa-triples/0069.nt +1 -0
  102. data/spec/rdfa-triples/0070.nt +1 -0
  103. data/spec/rdfa-triples/0071.nt +1 -0
  104. data/spec/rdfa-triples/0072.nt +1 -0
  105. data/spec/rdfa-triples/0073.nt +1 -0
  106. data/spec/rdfa-triples/0074.nt +1 -0
  107. data/spec/rdfa-triples/0075.nt +1 -0
  108. data/spec/rdfa-triples/0076.nt +23 -0
  109. data/spec/rdfa-triples/0077.nt +23 -0
  110. data/spec/rdfa-triples/0078.nt +6 -0
  111. data/spec/rdfa-triples/0079.nt +3 -0
  112. data/spec/rdfa-triples/0080.nt +1 -0
  113. data/spec/rdfa-triples/0081.nt +6 -0
  114. data/spec/rdfa-triples/0082.nt +8 -0
  115. data/spec/rdfa-triples/0083.nt +6 -0
  116. data/spec/rdfa-triples/0084.nt +8 -0
  117. data/spec/rdfa-triples/0085.nt +4 -0
  118. data/spec/rdfa-triples/0086.nt +0 -0
  119. data/spec/rdfa-triples/0087.nt +23 -0
  120. data/spec/rdfa-triples/0088.nt +3 -0
  121. data/spec/rdfa-triples/0089.nt +1 -0
  122. data/spec/rdfa-triples/0090.nt +1 -0
  123. data/spec/rdfa-triples/0091.nt +3 -0
  124. data/spec/rdfa-triples/0092.nt +3 -0
  125. data/spec/rdfa-triples/0093.nt +2 -0
  126. data/spec/rdfa-triples/0094.nt +3 -0
  127. data/spec/rdfa-triples/0099.nt +1 -0
  128. data/spec/rdfa-triples/0100.nt +3 -0
  129. data/spec/rdfa-triples/0101.nt +3 -0
  130. data/spec/rdfa-triples/0102.nt +1 -0
  131. data/spec/rdfa-triples/0103.nt +1 -0
  132. data/spec/rdfa-triples/0104.nt +3 -0
  133. data/spec/rdfa-triples/0105.nt +1 -0
  134. data/spec/rdfa-triples/0106.nt +1 -0
  135. data/spec/rdfa-triples/0107.nt +0 -0
  136. data/spec/rdfa-triples/0108.nt +1 -0
  137. data/spec/rdfa-triples/0109.nt +1 -0
  138. data/spec/rdfa-triples/0110.nt +1 -0
  139. data/spec/rdfa-triples/0111.nt +2 -0
  140. data/spec/rdfa-triples/0112.nt +1 -0
  141. data/spec/rdfa-triples/0113.nt +2 -0
  142. data/spec/rdfa-triples/0114.nt +3 -0
  143. data/spec/rdfa-triples/0115.nt +4 -0
  144. data/spec/rdfa-triples/0116.nt +2 -0
  145. data/spec/rdfa-triples/0117.nt +2 -0
  146. data/spec/rdfa-triples/0118.nt +1 -0
  147. data/spec/rdfa-triples/0119.nt +1 -0
  148. data/spec/rdfa-triples/0120.nt +1 -0
  149. data/spec/rdfa-triples/0121.nt +2 -0
  150. data/spec/rdfa-triples/0122.nt +1 -0
  151. data/spec/rdfa-triples/0123.nt +3 -0
  152. data/spec/rdfa-triples/0124.nt +4 -0
  153. data/spec/rdfa-triples/0125.nt +1 -0
  154. data/spec/rdfa-triples/0126.nt +3 -0
  155. data/spec/rdfa-triples/1001.nt +6 -0
  156. data/spec/rdfa_helper.rb +189 -0
  157. data/spec/rdfa_parser_spec.rb +148 -0
  158. data/spec/rdfcore/Manifest.rdf +5395 -0
  159. data/spec/rdfcore/amp-in-url/test001.nt +16 -0
  160. data/spec/rdfcore/amp-in-url/test001.rdf +40 -0
  161. data/spec/rdfcore/datatypes-intensional/test001.nt +18 -0
  162. data/spec/rdfcore/datatypes-intensional/test002.nt +18 -0
  163. data/spec/rdfcore/datatypes/test001.nt +15 -0
  164. data/spec/rdfcore/datatypes/test001.rdf +29 -0
  165. data/spec/rdfcore/datatypes/test002.nt +14 -0
  166. data/spec/rdfcore/datatypes/test002.rdf +27 -0
  167. data/spec/rdfcore/datatypes/test002b.nt +17 -0
  168. data/spec/rdfcore/datatypes/test003a.nt +16 -0
  169. data/spec/rdfcore/datatypes/test003b.nt +16 -0
  170. data/spec/rdfcore/datatypes/test005a.nt +16 -0
  171. data/spec/rdfcore/datatypes/test005b.nt +16 -0
  172. data/spec/rdfcore/datatypes/test006.nt +17 -0
  173. data/spec/rdfcore/datatypes/test008a.nt +15 -0
  174. data/spec/rdfcore/datatypes/test008b.nt +15 -0
  175. data/spec/rdfcore/datatypes/test009a.nt +15 -0
  176. data/spec/rdfcore/datatypes/test009b.nt +15 -0
  177. data/spec/rdfcore/datatypes/test010.nt +17 -0
  178. data/spec/rdfcore/datatypes/test011a.nt +17 -0
  179. data/spec/rdfcore/datatypes/test011b.nt +17 -0
  180. data/spec/rdfcore/horst-01/test001.rdf +38 -0
  181. data/spec/rdfcore/horst-01/test002.rdf +39 -0
  182. data/spec/rdfcore/horst-01/test003.rdf +40 -0
  183. data/spec/rdfcore/horst-01/test004.rdf +42 -0
  184. data/spec/rdfcore/pfps-10/test001a.nt +14 -0
  185. data/spec/rdfcore/pfps-10/test001b.nt +15 -0
  186. data/spec/rdfcore/rdf-charmod-literals/test001.nt +15 -0
  187. data/spec/rdfcore/rdf-charmod-literals/test001.rdf +34 -0
  188. data/spec/rdfcore/rdf-charmod-uris/test001.nt +14 -0
  189. data/spec/rdfcore/rdf-charmod-uris/test001.rdf +34 -0
  190. data/spec/rdfcore/rdf-charmod-uris/test002.nt +15 -0
  191. data/spec/rdfcore/rdf-charmod-uris/test002.rdf +33 -0
  192. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error001.rdf +27 -0
  193. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error002.rdf +34 -0
  194. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.nt +17 -0
  195. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.rdf +27 -0
  196. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.nt +19 -0
  197. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.rdf +37 -0
  198. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.nt +18 -0
  199. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.rdf +29 -0
  200. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.nt +29 -0
  201. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.rdf +33 -0
  202. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.nt +40 -0
  203. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.rdf +28 -0
  204. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.nt +20 -0
  205. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.rdf +32 -0
  206. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.nt +15 -0
  207. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.rdf +28 -0
  208. data/spec/rdfcore/rdf-element-not-mandatory/test001.nt +10 -0
  209. data/spec/rdfcore/rdf-element-not-mandatory/test001.rdf +14 -0
  210. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.nt +14 -0
  211. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.rdf +35 -0
  212. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.nt +14 -0
  213. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.rdf +35 -0
  214. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.nt +14 -0
  215. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.rdf +34 -0
  216. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.nt +15 -0
  217. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.rdf +40 -0
  218. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.nt +14 -0
  219. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.rdf +32 -0
  220. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.nt +14 -0
  221. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.rdf +32 -0
  222. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.nt +14 -0
  223. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.rdf +38 -0
  224. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.nt +15 -0
  225. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.rdf +40 -0
  226. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.nt +15 -0
  227. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.rdf +40 -0
  228. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.nt +15 -0
  229. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.rdf +40 -0
  230. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.nt +15 -0
  231. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.rdf +42 -0
  232. data/spec/rdfcore/rdfms-abouteach/error001.rdf +35 -0
  233. data/spec/rdfcore/rdfms-abouteach/error002.rdf +35 -0
  234. data/spec/rdfcore/rdfms-difference-between-ID-and-about/error1.rdf +25 -0
  235. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.nt +14 -0
  236. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.rdf +22 -0
  237. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.nt +14 -0
  238. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.rdf +22 -0
  239. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.nt +14 -0
  240. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.rdf +22 -0
  241. data/spec/rdfcore/rdfms-duplicate-member-props/test001.nt +17 -0
  242. data/spec/rdfcore/rdfms-duplicate-member-props/test001.rdf +30 -0
  243. data/spec/rdfcore/rdfms-empty-property-elements/error001.rdf +33 -0
  244. data/spec/rdfcore/rdfms-empty-property-elements/error002.rdf +33 -0
  245. data/spec/rdfcore/rdfms-empty-property-elements/error003.rdf +39 -0
  246. data/spec/rdfcore/rdfms-empty-property-elements/test001.nt +14 -0
  247. data/spec/rdfcore/rdfms-empty-property-elements/test001.rdf +33 -0
  248. data/spec/rdfcore/rdfms-empty-property-elements/test002.nt +14 -0
  249. data/spec/rdfcore/rdfms-empty-property-elements/test002.rdf +31 -0
  250. data/spec/rdfcore/rdfms-empty-property-elements/test003.nt +14 -0
  251. data/spec/rdfcore/rdfms-empty-property-elements/test003.rdf +32 -0
  252. data/spec/rdfcore/rdfms-empty-property-elements/test004.nt +14 -0
  253. data/spec/rdfcore/rdfms-empty-property-elements/test004.rdf +32 -0
  254. data/spec/rdfcore/rdfms-empty-property-elements/test005.nt +18 -0
  255. data/spec/rdfcore/rdfms-empty-property-elements/test005.rdf +32 -0
  256. data/spec/rdfcore/rdfms-empty-property-elements/test006.nt +18 -0
  257. data/spec/rdfcore/rdfms-empty-property-elements/test006.rdf +32 -0
  258. data/spec/rdfcore/rdfms-empty-property-elements/test007.nt +14 -0
  259. data/spec/rdfcore/rdfms-empty-property-elements/test007.rdf +32 -0
  260. data/spec/rdfcore/rdfms-empty-property-elements/test008.nt +14 -0
  261. data/spec/rdfcore/rdfms-empty-property-elements/test008.rdf +31 -0
  262. data/spec/rdfcore/rdfms-empty-property-elements/test009.nt +14 -0
  263. data/spec/rdfcore/rdfms-empty-property-elements/test009.rdf +32 -0
  264. data/spec/rdfcore/rdfms-empty-property-elements/test010.nt +14 -0
  265. data/spec/rdfcore/rdfms-empty-property-elements/test010.rdf +31 -0
  266. data/spec/rdfcore/rdfms-empty-property-elements/test011.nt +18 -0
  267. data/spec/rdfcore/rdfms-empty-property-elements/test011.rdf +30 -0
  268. data/spec/rdfcore/rdfms-empty-property-elements/test012.nt +18 -0
  269. data/spec/rdfcore/rdfms-empty-property-elements/test012.rdf +30 -0
  270. data/spec/rdfcore/rdfms-empty-property-elements/test013.nt +15 -0
  271. data/spec/rdfcore/rdfms-empty-property-elements/test013.rdf +35 -0
  272. data/spec/rdfcore/rdfms-empty-property-elements/test014.nt +15 -0
  273. data/spec/rdfcore/rdfms-empty-property-elements/test014.rdf +34 -0
  274. data/spec/rdfcore/rdfms-empty-property-elements/test015.nt +15 -0
  275. data/spec/rdfcore/rdfms-empty-property-elements/test015.rdf +38 -0
  276. data/spec/rdfcore/rdfms-empty-property-elements/test016.nt +14 -0
  277. data/spec/rdfcore/rdfms-empty-property-elements/test016.rdf +31 -0
  278. data/spec/rdfcore/rdfms-empty-property-elements/test017.nt +14 -0
  279. data/spec/rdfcore/rdfms-empty-property-elements/test017.rdf +38 -0
  280. data/spec/rdfcore/rdfms-identity-anon-resources/test001.nt +14 -0
  281. data/spec/rdfcore/rdfms-identity-anon-resources/test001.rdf +33 -0
  282. data/spec/rdfcore/rdfms-identity-anon-resources/test002.nt +15 -0
  283. data/spec/rdfcore/rdfms-identity-anon-resources/test002.rdf +33 -0
  284. data/spec/rdfcore/rdfms-identity-anon-resources/test003.nt +14 -0
  285. data/spec/rdfcore/rdfms-identity-anon-resources/test003.rdf +31 -0
  286. data/spec/rdfcore/rdfms-identity-anon-resources/test004.nt +15 -0
  287. data/spec/rdfcore/rdfms-identity-anon-resources/test004.rdf +33 -0
  288. data/spec/rdfcore/rdfms-identity-anon-resources/test005.nt +14 -0
  289. data/spec/rdfcore/rdfms-identity-anon-resources/test005.rdf +31 -0
  290. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.nt +19 -0
  291. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.rdf +29 -0
  292. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.nt +15 -0
  293. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.rdf +29 -0
  294. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.nt +18 -0
  295. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.rdf +29 -0
  296. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.nt +19 -0
  297. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.rdf +29 -0
  298. data/spec/rdfcore/rdfms-para196/test001.nt +17 -0
  299. data/spec/rdfcore/rdfms-para196/test001.rdf +35 -0
  300. data/spec/rdfcore/rdfms-rdf-id/error001.rdf +26 -0
  301. data/spec/rdfcore/rdfms-rdf-id/error002.rdf +26 -0
  302. data/spec/rdfcore/rdfms-rdf-id/error003.rdf +29 -0
  303. data/spec/rdfcore/rdfms-rdf-id/error004.rdf +27 -0
  304. data/spec/rdfcore/rdfms-rdf-id/error005.rdf +31 -0
  305. data/spec/rdfcore/rdfms-rdf-id/error006.rdf +26 -0
  306. data/spec/rdfcore/rdfms-rdf-id/error007.rdf +29 -0
  307. data/spec/rdfcore/rdfms-rdf-names-use/error-001.rdf +23 -0
  308. data/spec/rdfcore/rdfms-rdf-names-use/error-002.rdf +23 -0
  309. data/spec/rdfcore/rdfms-rdf-names-use/error-003.rdf +23 -0
  310. data/spec/rdfcore/rdfms-rdf-names-use/error-004.rdf +23 -0
  311. data/spec/rdfcore/rdfms-rdf-names-use/error-005.rdf +23 -0
  312. data/spec/rdfcore/rdfms-rdf-names-use/error-006.rdf +23 -0
  313. data/spec/rdfcore/rdfms-rdf-names-use/error-007.rdf +23 -0
  314. data/spec/rdfcore/rdfms-rdf-names-use/error-008.rdf +23 -0
  315. data/spec/rdfcore/rdfms-rdf-names-use/error-009.rdf +23 -0
  316. data/spec/rdfcore/rdfms-rdf-names-use/error-010.rdf +23 -0
  317. data/spec/rdfcore/rdfms-rdf-names-use/error-011.rdf +25 -0
  318. data/spec/rdfcore/rdfms-rdf-names-use/error-012.rdf +25 -0
  319. data/spec/rdfcore/rdfms-rdf-names-use/error-013.rdf +25 -0
  320. data/spec/rdfcore/rdfms-rdf-names-use/error-014.rdf +25 -0
  321. data/spec/rdfcore/rdfms-rdf-names-use/error-015.rdf +25 -0
  322. data/spec/rdfcore/rdfms-rdf-names-use/error-016.rdf +25 -0
  323. data/spec/rdfcore/rdfms-rdf-names-use/error-017.rdf +25 -0
  324. data/spec/rdfcore/rdfms-rdf-names-use/error-018.rdf +25 -0
  325. data/spec/rdfcore/rdfms-rdf-names-use/error-019.rdf +25 -0
  326. data/spec/rdfcore/rdfms-rdf-names-use/error-020.rdf +25 -0
  327. data/spec/rdfcore/rdfms-rdf-names-use/test-001.nt +1 -0
  328. data/spec/rdfcore/rdfms-rdf-names-use/test-001.rdf +23 -0
  329. data/spec/rdfcore/rdfms-rdf-names-use/test-002.nt +1 -0
  330. data/spec/rdfcore/rdfms-rdf-names-use/test-002.rdf +23 -0
  331. data/spec/rdfcore/rdfms-rdf-names-use/test-003.nt +1 -0
  332. data/spec/rdfcore/rdfms-rdf-names-use/test-003.rdf +23 -0
  333. data/spec/rdfcore/rdfms-rdf-names-use/test-004.nt +1 -0
  334. data/spec/rdfcore/rdfms-rdf-names-use/test-004.rdf +23 -0
  335. data/spec/rdfcore/rdfms-rdf-names-use/test-005.nt +1 -0
  336. data/spec/rdfcore/rdfms-rdf-names-use/test-005.rdf +23 -0
  337. data/spec/rdfcore/rdfms-rdf-names-use/test-006.nt +1 -0
  338. data/spec/rdfcore/rdfms-rdf-names-use/test-006.rdf +23 -0
  339. data/spec/rdfcore/rdfms-rdf-names-use/test-007.nt +1 -0
  340. data/spec/rdfcore/rdfms-rdf-names-use/test-007.rdf +23 -0
  341. data/spec/rdfcore/rdfms-rdf-names-use/test-008.nt +1 -0
  342. data/spec/rdfcore/rdfms-rdf-names-use/test-008.rdf +23 -0
  343. data/spec/rdfcore/rdfms-rdf-names-use/test-009.nt +1 -0
  344. data/spec/rdfcore/rdfms-rdf-names-use/test-009.rdf +23 -0
  345. data/spec/rdfcore/rdfms-rdf-names-use/test-010.nt +1 -0
  346. data/spec/rdfcore/rdfms-rdf-names-use/test-010.rdf +23 -0
  347. data/spec/rdfcore/rdfms-rdf-names-use/test-011.nt +1 -0
  348. data/spec/rdfcore/rdfms-rdf-names-use/test-011.rdf +23 -0
  349. data/spec/rdfcore/rdfms-rdf-names-use/test-012.nt +1 -0
  350. data/spec/rdfcore/rdfms-rdf-names-use/test-012.rdf +23 -0
  351. data/spec/rdfcore/rdfms-rdf-names-use/test-013.nt +1 -0
  352. data/spec/rdfcore/rdfms-rdf-names-use/test-013.rdf +23 -0
  353. data/spec/rdfcore/rdfms-rdf-names-use/test-014.nt +1 -0
  354. data/spec/rdfcore/rdfms-rdf-names-use/test-014.rdf +23 -0
  355. data/spec/rdfcore/rdfms-rdf-names-use/test-015.nt +1 -0
  356. data/spec/rdfcore/rdfms-rdf-names-use/test-015.rdf +23 -0
  357. data/spec/rdfcore/rdfms-rdf-names-use/test-016.nt +1 -0
  358. data/spec/rdfcore/rdfms-rdf-names-use/test-016.rdf +23 -0
  359. data/spec/rdfcore/rdfms-rdf-names-use/test-017.nt +1 -0
  360. data/spec/rdfcore/rdfms-rdf-names-use/test-017.rdf +25 -0
  361. data/spec/rdfcore/rdfms-rdf-names-use/test-018.nt +1 -0
  362. data/spec/rdfcore/rdfms-rdf-names-use/test-018.rdf +25 -0
  363. data/spec/rdfcore/rdfms-rdf-names-use/test-019.nt +1 -0
  364. data/spec/rdfcore/rdfms-rdf-names-use/test-019.rdf +25 -0
  365. data/spec/rdfcore/rdfms-rdf-names-use/test-020.nt +1 -0
  366. data/spec/rdfcore/rdfms-rdf-names-use/test-020.rdf +25 -0
  367. data/spec/rdfcore/rdfms-rdf-names-use/test-021.nt +1 -0
  368. data/spec/rdfcore/rdfms-rdf-names-use/test-021.rdf +25 -0
  369. data/spec/rdfcore/rdfms-rdf-names-use/test-022.nt +1 -0
  370. data/spec/rdfcore/rdfms-rdf-names-use/test-022.rdf +25 -0
  371. data/spec/rdfcore/rdfms-rdf-names-use/test-023.nt +1 -0
  372. data/spec/rdfcore/rdfms-rdf-names-use/test-023.rdf +25 -0
  373. data/spec/rdfcore/rdfms-rdf-names-use/test-024.nt +1 -0
  374. data/spec/rdfcore/rdfms-rdf-names-use/test-024.rdf +25 -0
  375. data/spec/rdfcore/rdfms-rdf-names-use/test-025.nt +1 -0
  376. data/spec/rdfcore/rdfms-rdf-names-use/test-025.rdf +25 -0
  377. data/spec/rdfcore/rdfms-rdf-names-use/test-026.nt +1 -0
  378. data/spec/rdfcore/rdfms-rdf-names-use/test-026.rdf +25 -0
  379. data/spec/rdfcore/rdfms-rdf-names-use/test-027.nt +1 -0
  380. data/spec/rdfcore/rdfms-rdf-names-use/test-027.rdf +25 -0
  381. data/spec/rdfcore/rdfms-rdf-names-use/test-028.nt +1 -0
  382. data/spec/rdfcore/rdfms-rdf-names-use/test-028.rdf +25 -0
  383. data/spec/rdfcore/rdfms-rdf-names-use/test-029.nt +1 -0
  384. data/spec/rdfcore/rdfms-rdf-names-use/test-029.rdf +25 -0
  385. data/spec/rdfcore/rdfms-rdf-names-use/test-030.nt +1 -0
  386. data/spec/rdfcore/rdfms-rdf-names-use/test-030.rdf +25 -0
  387. data/spec/rdfcore/rdfms-rdf-names-use/test-031.nt +1 -0
  388. data/spec/rdfcore/rdfms-rdf-names-use/test-031.rdf +25 -0
  389. data/spec/rdfcore/rdfms-rdf-names-use/test-032.nt +1 -0
  390. data/spec/rdfcore/rdfms-rdf-names-use/test-032.rdf +24 -0
  391. data/spec/rdfcore/rdfms-rdf-names-use/test-033.nt +1 -0
  392. data/spec/rdfcore/rdfms-rdf-names-use/test-033.rdf +24 -0
  393. data/spec/rdfcore/rdfms-rdf-names-use/test-034.nt +1 -0
  394. data/spec/rdfcore/rdfms-rdf-names-use/test-034.rdf +24 -0
  395. data/spec/rdfcore/rdfms-rdf-names-use/test-035.nt +1 -0
  396. data/spec/rdfcore/rdfms-rdf-names-use/test-035.rdf +24 -0
  397. data/spec/rdfcore/rdfms-rdf-names-use/test-036.nt +1 -0
  398. data/spec/rdfcore/rdfms-rdf-names-use/test-036.rdf +24 -0
  399. data/spec/rdfcore/rdfms-rdf-names-use/test-037.nt +1 -0
  400. data/spec/rdfcore/rdfms-rdf-names-use/test-037.rdf +24 -0
  401. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.nt +1 -0
  402. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.rdf +23 -0
  403. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.nt +1 -0
  404. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.rdf +25 -0
  405. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.nt +1 -0
  406. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.rdf +24 -0
  407. data/spec/rdfcore/rdfms-reification-required/test001.nt +15 -0
  408. data/spec/rdfcore/rdfms-reification-required/test001.rdf +29 -0
  409. data/spec/rdfcore/rdfms-seq-representation/empty.nt +13 -0
  410. data/spec/rdfcore/rdfms-seq-representation/test001.nt +19 -0
  411. data/spec/rdfcore/rdfms-seq-representation/test001.rdf +33 -0
  412. data/spec/rdfcore/rdfms-seq-representation/test002.nt +14 -0
  413. data/spec/rdfcore/rdfms-seq-representation/test003a.nt +14 -0
  414. data/spec/rdfcore/rdfms-seq-representation/test003b.nt +14 -0
  415. data/spec/rdfcore/rdfms-seq-representation/test004.nt +14 -0
  416. data/spec/rdfcore/rdfms-syntax-incomplete/error001.rdf +26 -0
  417. data/spec/rdfcore/rdfms-syntax-incomplete/error002.rdf +26 -0
  418. data/spec/rdfcore/rdfms-syntax-incomplete/error003.rdf +29 -0
  419. data/spec/rdfcore/rdfms-syntax-incomplete/error004.rdf +25 -0
  420. data/spec/rdfcore/rdfms-syntax-incomplete/error005.rdf +25 -0
  421. data/spec/rdfcore/rdfms-syntax-incomplete/error006.rdf +28 -0
  422. data/spec/rdfcore/rdfms-syntax-incomplete/test001.nt +14 -0
  423. data/spec/rdfcore/rdfms-syntax-incomplete/test001.rdf +28 -0
  424. data/spec/rdfcore/rdfms-syntax-incomplete/test002.nt +19 -0
  425. data/spec/rdfcore/rdfms-syntax-incomplete/test002.rdf +38 -0
  426. data/spec/rdfcore/rdfms-syntax-incomplete/test003.nt +17 -0
  427. data/spec/rdfcore/rdfms-syntax-incomplete/test003.rdf +28 -0
  428. data/spec/rdfcore/rdfms-syntax-incomplete/test004.nt +21 -0
  429. data/spec/rdfcore/rdfms-syntax-incomplete/test004.rdf +36 -0
  430. data/spec/rdfcore/rdfms-uri-substructure/error001.nt +18 -0
  431. data/spec/rdfcore/rdfms-uri-substructure/test001.nt +17 -0
  432. data/spec/rdfcore/rdfms-uri-substructure/test001.rdf +29 -0
  433. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.nt +13 -0
  434. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.rdf +33 -0
  435. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.nt +14 -0
  436. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.rdf +47 -0
  437. data/spec/rdfcore/rdfms-xmllang/test001.nt +14 -0
  438. data/spec/rdfcore/rdfms-xmllang/test001.rdf +30 -0
  439. data/spec/rdfcore/rdfms-xmllang/test002.nt +14 -0
  440. data/spec/rdfcore/rdfms-xmllang/test002.rdf +29 -0
  441. data/spec/rdfcore/rdfms-xmllang/test003.nt +14 -0
  442. data/spec/rdfcore/rdfms-xmllang/test003.rdf +28 -0
  443. data/spec/rdfcore/rdfms-xmllang/test004.nt +14 -0
  444. data/spec/rdfcore/rdfms-xmllang/test004.rdf +28 -0
  445. data/spec/rdfcore/rdfms-xmllang/test005.nt +14 -0
  446. data/spec/rdfcore/rdfms-xmllang/test005.rdf +28 -0
  447. data/spec/rdfcore/rdfms-xmllang/test006.nt +14 -0
  448. data/spec/rdfcore/rdfms-xmllang/test006.rdf +29 -0
  449. data/spec/rdfcore/rdfms-xmllang/test007a.nt +14 -0
  450. data/spec/rdfcore/rdfms-xmllang/test007b.nt +14 -0
  451. data/spec/rdfcore/rdfms-xmllang/test007c.nt +14 -0
  452. data/spec/rdfcore/rdfs-container-membership-superProperty/not1C.rdf +13 -0
  453. data/spec/rdfcore/rdfs-container-membership-superProperty/not1P.rdf +14 -0
  454. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions005.rdf +28 -0
  455. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions006.rdf +28 -0
  456. data/spec/rdfcore/rdfs-domain-and-range/premises005.rdf +32 -0
  457. data/spec/rdfcore/rdfs-domain-and-range/premises006.rdf +32 -0
  458. data/spec/rdfcore/rdfs-domain-and-range/test001.nt +16 -0
  459. data/spec/rdfcore/rdfs-domain-and-range/test001.rdf +29 -0
  460. data/spec/rdfcore/rdfs-domain-and-range/test002.nt +16 -0
  461. data/spec/rdfcore/rdfs-domain-and-range/test002.rdf +29 -0
  462. data/spec/rdfcore/rdfs-entailment/test001.nt +16 -0
  463. data/spec/rdfcore/rdfs-entailment/test002.nt +15 -0
  464. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.nt +18 -0
  465. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.rdf +37 -0
  466. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.nt +18 -0
  467. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.rdf +40 -0
  468. data/spec/rdfcore/rdfs-subClassOf-a-Property/test001.nt +15 -0
  469. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test001.nt +24 -0
  470. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test002.nt +21 -0
  471. data/spec/rdfcore/statement-entailment/test001a.nt +12 -0
  472. data/spec/rdfcore/statement-entailment/test001b.nt +2 -0
  473. data/spec/rdfcore/statement-entailment/test002a.nt +2 -0
  474. data/spec/rdfcore/statement-entailment/test002b.nt +5 -0
  475. data/spec/rdfcore/tex-01/test001.rdf +34 -0
  476. data/spec/rdfcore/tex-01/test002.rdf +33 -0
  477. data/spec/rdfcore/unrecognised-xml-attributes/test001.nt +15 -0
  478. data/spec/rdfcore/unrecognised-xml-attributes/test001.rdf +31 -0
  479. data/spec/rdfcore/unrecognised-xml-attributes/test002.nt +14 -0
  480. data/spec/rdfcore/unrecognised-xml-attributes/test002.rdf +32 -0
  481. data/spec/rdfcore/xml-canon/test001.nt +16 -0
  482. data/spec/rdfcore/xml-canon/test001.rdf +28 -0
  483. data/spec/rdfcore/xmlbase/test001.nt +14 -0
  484. data/spec/rdfcore/xmlbase/test001.rdf +27 -0
  485. data/spec/rdfcore/xmlbase/test002.nt +14 -0
  486. data/spec/rdfcore/xmlbase/test002.rdf +28 -0
  487. data/spec/rdfcore/xmlbase/test003.nt +14 -0
  488. data/spec/rdfcore/xmlbase/test003.rdf +25 -0
  489. data/spec/rdfcore/xmlbase/test004.nt +18 -0
  490. data/spec/rdfcore/xmlbase/test004.rdf +27 -0
  491. data/spec/rdfcore/xmlbase/test006.nt +15 -0
  492. data/spec/rdfcore/xmlbase/test006.rdf +26 -0
  493. data/spec/rdfcore/xmlbase/test007.nt +14 -0
  494. data/spec/rdfcore/xmlbase/test007.rdf +25 -0
  495. data/spec/rdfcore/xmlbase/test008.nt +14 -0
  496. data/spec/rdfcore/xmlbase/test008.rdf +25 -0
  497. data/spec/rdfcore/xmlbase/test009.nt +14 -0
  498. data/spec/rdfcore/xmlbase/test009.rdf +26 -0
  499. data/spec/rdfcore/xmlbase/test010.nt +14 -0
  500. data/spec/rdfcore/xmlbase/test010.rdf +26 -0
  501. data/spec/rdfcore/xmlbase/test011.nt +14 -0
  502. data/spec/rdfcore/xmlbase/test011.rdf +27 -0
  503. data/spec/rdfcore/xmlbase/test013.nt +15 -0
  504. data/spec/rdfcore/xmlbase/test013.rdf +28 -0
  505. data/spec/rdfcore/xmlbase/test014.nt +15 -0
  506. data/spec/rdfcore/xmlbase/test014.rdf +28 -0
  507. data/spec/rdfcore/xmlsch-02/test001.rdf +34 -0
  508. data/spec/rdfcore/xmlsch-02/test002.rdf +34 -0
  509. data/spec/rdfcore/xmlsch-02/test003.rdf +37 -0
  510. data/spec/rdfxml_helper.rb +137 -0
  511. data/spec/rdfxml_spec.rb +362 -0
  512. data/spec/spec.opts +1 -0
  513. data/spec/spec_helper.rb +23 -0
  514. data/spec/sqlite3_store_spec.rb +41 -0
  515. data/spec/store_helper.rb +231 -0
  516. data/spec/string_hacks_spec.rb +21 -0
  517. data/spec/triple_spec.rb +172 -0
  518. data/spec/uriref_spec.rb +117 -0
  519. data/test/longtests_spec.rb +25 -0
  520. data/test/n3_tests/lcsh/sh85062913.n3 +41 -0
  521. data/test/n3_tests/lcsh/sh85062913.nt +21 -0
  522. data/test/n3_tests/lcsh/sh85082139.n3 +157 -0
  523. data/test/n3_tests/lcsh/sh85082139.nt +79 -0
  524. data/test/n3_tests/lcsh/sh85118553.n3 +123 -0
  525. data/test/n3_tests/lcsh/sh85118553.nt +63 -0
  526. data/test/n3_tests/misc/on_now-01.n3 +30 -0
  527. data/test/n3_tests/misc/on_now-01.nt +15 -0
  528. data/test/n3_tests/n3p/simple-01.n3 +1 -0
  529. data/test/n3_tests/n3p/simple-01.nt +0 -0
  530. data/test/n3_tests/n3p/simple-02.n3 +4 -0
  531. data/test/n3_tests/n3p/simple-02.nt +0 -0
  532. data/test/n3_tests/n3p/simple-03.n3 +5 -0
  533. data/test/n3_tests/n3p/simple-03.nt +1 -0
  534. data/test/n3_tests/n3p/simple-04.n3 +6 -0
  535. data/test/n3_tests/n3p/simple-04.nt +3 -0
  536. data/test/n3_tests/n3p/simple-05.n3 +7 -0
  537. data/test/n3_tests/n3p/simple-05.nt +2 -0
  538. data/test/n3_tests/n3p/simple-06.n3 +6 -0
  539. data/test/n3_tests/n3p/simple-06.nt +4 -0
  540. data/test/n3_tests/n3p/simple-07.n3 +7 -0
  541. data/test/n3_tests/n3p/simple-07.nt +6 -0
  542. data/test/perf_test/test.rb +11 -0
  543. data/test/perf_test/tommorris.rdf +2267 -0
  544. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.nt +24 -0
  545. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.rdf +46 -0
  546. data/test/rdf_tests/tm_001.nt +1 -0
  547. data/test/rdf_tests/tm_001.rdf +7 -0
  548. data/test/rdf_tests/xml-literal-mixed.nt +7 -0
  549. data/test/rdf_tests/xml-literal-mixed.rdf +15 -0
  550. data/test/xml.rdf +6 -0
  551. metadata +696 -0
@@ -0,0 +1,843 @@
1
+ require File.join(File.dirname(__FILE__), 'abstract_store')
2
+ require 'digest/sha1'
3
+
4
+ module RdfContext
5
+ # SQL-92 formula-aware implementation of an RDF Store.
6
+ # It stores it's triples in the following partitions:
7
+ # - Asserted non rdf:type statements
8
+ # - Asserted literal statements
9
+ # - 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
10
+ # - All Quoted statements
11
+ #
12
+ # In addition it persists namespace mappings in a seperate table
13
+ #
14
+ # Based on Python RdfLib AbstractSQLStore
15
+ class AbstractSQLStore < AbstractStore
16
+ include TermUtils
17
+
18
+ COUNT_SELECT = 0
19
+ CONTEXT_SELECT = 1
20
+ TRIPLE_SELECT = 2
21
+ TRIPLE_SELECT_NO_ORDER = 3
22
+
23
+ ASSERTED_NON_TYPE_PARTITION = 3
24
+ ASSERTED_TYPE_PARTITION = 4
25
+ QUOTED_PARTITION = 5
26
+ ASSERTED_LITERAL_PARTITION = 6
27
+
28
+ FULL_TRIPLE_PARTITIONS = [QUOTED_PARTITION,ASSERTED_LITERAL_PARTITION]
29
+
30
+ INTERNED_PREFIX = 'kb_'
31
+
32
+ STRONGLY_TYPED_TERMS = false
33
+
34
+ # @param[URIRef] identifier:: URIRef of the Store. Defaults to CWD
35
+ # @param[Hash] configuration:: Hash containing infomation open can use to connect to datastore.
36
+ def initialize(identifier = nil, configuration = {})
37
+ @literalCache = {}
38
+ @otherCache = {}
39
+ @bnodeCache = {}
40
+ @uriCache = {}
41
+
42
+ @context_aware = true
43
+ @formula_aware = true
44
+ @transaction_aware = true
45
+ @autocommit_default = true
46
+
47
+ raise StoreException.new("Identifier must be nil or a URIRef") if identifier && !identifier.is_a?(URIRef)
48
+ @identifier = identifier || URIRef.new("file:/#{Dir.getwd}")
49
+
50
+ @internedId = INTERNED_PREFIX + Digest::SHA1.hexdigest(@identifier.to_s)[0..9] # Only first 10 bytes of digeset
51
+
52
+ @db = configuration.empty? ? nil : open(configuration)
53
+ end
54
+
55
+ def close(commit_pending_transactions = false)
56
+ @db.commit if commit_pending_transactions && @db.transaction_active?
57
+ @db.close
58
+ end
59
+
60
+ # Add a triple to the store
61
+ # Add to default context, if context is nil
62
+ def add(triple, context = nil, quoted = false)
63
+ context ||= @identifier
64
+ executeSQL("SET AUTOCOMMIT=0") if @autocommit_default
65
+
66
+ if quoted || triple.predicate != RDF_TYPE
67
+ # Quoted statement or non rdf:type predicate
68
+ # Check if object is a literal
69
+ if triple.object.is_a?(Literal)
70
+ addCmd, *params = self.buildLiteralTripleSQLCommand(triple, context)
71
+ else
72
+ addCmd, *params = self.buildTripleSQLCommand(triple, context, quoted)
73
+ end
74
+ elsif triple.predicate == RDF_TYPE
75
+ addCmd, *params = self.buildTypeSQLCommand(triple.subject, triple.object, context)
76
+ end
77
+
78
+ executeSQL(addCmd, params)
79
+ end
80
+
81
+ # Remove a triple from the context and store
82
+ #
83
+ # if subject, predicate and object are nil and context is not nil, the context is removed
84
+ def remove(triple, context = nil)
85
+ if context
86
+ if triple.subject == nil && triple.predicate.nil? && triple.object.nil?
87
+ return remove_context(context)
88
+ end
89
+ end
90
+
91
+ if triple.predicate.nil? || triple.predicate != RDF_TYPE
92
+ # Remove predicates other than rdf:type
93
+ if !STRONGLY_TYPED_TERMS || triple.object.is_a?(Literal)
94
+ clauseString, *params = self.buildClause(literal_table,triple,context)
95
+ if !clauseString.empty?
96
+ cmd = "DELETE FROM #{literal_table} #{clauseString}"
97
+ else
98
+ cmd = "DELETE FROM #{literal_table}"
99
+ end
100
+ executeSQL(_normalizeSQLCmd(cmd), params)
101
+ end
102
+
103
+ [quoted_table, asserted_table].each do |table|
104
+ # If asserted non rdf:type table and obj is Literal, don't do anything (already taken care of)
105
+ next if table == asserted_table && triple.object.is_a?(Literal)
106
+
107
+ clauseString, *params = self.buildClause(table, triple, context)
108
+ if !clauseString.empty?
109
+ cmd = "DELETE FROM #{table} #{clauseString}"
110
+ else
111
+ cmd = "DELETE FROM #{table}"
112
+ end
113
+ executeSQL(_normalizeSQLCmd(cmd), params)
114
+ end
115
+ elsif triple.predicate == RDF_TYPE || triple.predicate.nil?
116
+ # Need to check rdf:type and quoted partitions (in addition perhaps)
117
+ clauseString, *params = self.buildClause(asserted_type_table,triple,context, true)
118
+ if !clauseString.empty?
119
+ cmd = "DELETE FROM #{asserted_type_table} #{clauseString}"
120
+ else
121
+ cmd = "DELETE FROM #{asserted_type_table}"
122
+ end
123
+ executeSQL(_normalizeSQLCmd(cmd), params)
124
+
125
+ clauseString, *params = self.buildClause(quoted_table,triple,context)
126
+ if !clauseString.empty?
127
+ cmd = "DELETE FROM #{quoted_table} #{clauseString}"
128
+ else
129
+ cmd = "DELETE FROM #{quoted_table}"
130
+ end
131
+ executeSQL(_normalizeSQLCmd(cmd), params)
132
+ end
133
+ end
134
+
135
+ # A generator over all the triples matching pattern.
136
+ #
137
+ # quoted table:: <id>_quoted_statements
138
+ # asserted rdf:type table:: <id>_type_statements
139
+ # asserted non rdf:type table:: <id>_asserted_statements
140
+ #
141
+ # triple columns: subject,predicate,object,context,termComb,objLanguage,objDatatype
142
+ # class membership columns: member,klass,context termComb
143
+ #
144
+ # FIXME: These union all selects *may* be further optimized by joins
145
+ def triples(triple, context = nil) # :yields: triple, context
146
+ parameters = []
147
+
148
+ if triple.predicate == RDF_TYPE
149
+ # select from asserted rdf:type partition and quoted table (if a context is specified)
150
+ clauseString, *params = self.buildClause('typeTable',triple,context, true)
151
+ parameters += params
152
+ selects = [
153
+ [
154
+ asserted_type_table,
155
+ 'typeTable',
156
+ clauseString,
157
+ ASSERTED_TYPE_PARTITION
158
+ ],
159
+ ]
160
+ # elsif triple.predicate.is_a?(REGEXTerm) && triple.predicate.compiledExpr.match(RDF_TYPE) || triple.predicate.nil?
161
+ elsif triple.predicate.nil?
162
+ # Select from quoted partition (if context is specified), literal partition if (obj is Literal or None) and asserted non rdf:type partition (if obj is URIRef or None)
163
+ selects = []
164
+ if !STRONGLY_TYPED_TERMS || triple.object.is_a?(Literal) || triple.object.nil?
165
+ clauseString, *params = self.buildClause('literal',triple,context)
166
+ parameters += params
167
+ selects += [
168
+ [
169
+ literal_table,
170
+ 'literal',
171
+ clauseString,
172
+ ASSERTED_LITERAL_PARTITION
173
+ ]
174
+ ]
175
+ end
176
+
177
+ if !triple.object.is_a?(Literal) || triple.object.nil?
178
+ clauseString, *params = self.buildClause('asserted',triple,context)
179
+ parameters += params
180
+ selects += [
181
+ [
182
+ asserted_table,
183
+ 'asserted',
184
+ clauseString,
185
+ ASSERTED_NON_TYPE_PARTITION
186
+ ]
187
+ ]
188
+ end
189
+
190
+ clauseString, *params = self.buildClause('typeTable',Triple.new(triple.subject, RDF_TYPE, triple.object),context, true)
191
+ parameters += params
192
+ selects += [
193
+ [
194
+ asserted_type_table,
195
+ 'typeTable',
196
+ clauseString,
197
+ ASSERTED_TYPE_PARTITION
198
+ ]
199
+ ]
200
+ elsif triple.predicate
201
+ # select from asserted non rdf:type partition (optionally), quoted partition (if context is speciied), and literal partition (optionally)
202
+ selects = []
203
+ if !STRONGLY_TYPED_TERMS || triple.object.is_a?(Literal) || triple.object.nil?
204
+ clauseString, *params = self.buildClause('literal',triple,context)
205
+ parameters += params
206
+ selects += [
207
+ [
208
+ literal_table,
209
+ 'literal',
210
+ clauseString,
211
+ ASSERTED_LITERAL_PARTITION
212
+ ]
213
+ ]
214
+ end
215
+
216
+ if !triple.object.is_a?(Literal) || triple.object.nil?
217
+ clauseString, *params = self.buildClause('asserted',triple,context)
218
+ parameters += params
219
+ selects += [
220
+ [
221
+ asserted_table,
222
+ 'asserted',
223
+ clauseString,
224
+ ASSERTED_NON_TYPE_PARTITION
225
+ ]
226
+ ]
227
+ end
228
+ end
229
+
230
+ if context
231
+ clauseString, *params = self.buildClause('quoted',triple,context)
232
+ parameters += params
233
+ selects += [
234
+ [
235
+ quoted_table,
236
+ 'quoted',
237
+ clauseString,
238
+ QUOTED_PARTITION
239
+ ]
240
+ ]
241
+ end
242
+
243
+ q = _normalizeSQLCmd(unionSELECT(selects))
244
+ results = []
245
+ executeSQL(q, parameters) do |row|
246
+ triple, graphKlass, idKlass, graphId = extractTriple(row, context)
247
+ currentContext = graphKlass.new(:store => self, :identifier => idKlass.new(graphId))
248
+ if block_given?
249
+ yield(triple, currentContext)
250
+ else
251
+ results << triple
252
+ end
253
+ end
254
+
255
+ results.uniq
256
+ end
257
+
258
+ def contains?(triple, context = nil)
259
+ #puts "contains? #{triple}"
260
+ object = triple.object
261
+ if object.is_a?(Literal)
262
+ triple = Triple.new(triple.subject, triple.predicate, nil)
263
+ triples(triple, context) do |t, cg|
264
+ return true if t.object == object
265
+ end
266
+ false
267
+ else
268
+ !triples(triple, context).empty?
269
+ end
270
+ end
271
+
272
+ # Number of statements in the store.
273
+ def size(context = nil)
274
+ parameters = []
275
+ quotedContext = assertedContext = typeContext = literalContext = nil
276
+
277
+ clauseParts = self.buildContextClause(context,quoted_table)
278
+ if clauseParts
279
+ quotedContext = clauseParts.shift
280
+ parameters += clauseParts
281
+ end
282
+
283
+ clauseParts = self.buildContextClause(context,asserted_table)
284
+ if clauseParts
285
+ assertedContext = clauseParts.shift
286
+ parameters += clauseParts
287
+ end
288
+
289
+ clauseParts = self.buildContextClause(context,asserted_type_table)
290
+ if clauseParts
291
+ typeContext = clauseParts.shift
292
+ parameters += clauseParts
293
+ end
294
+
295
+ clauseParts = self.buildContextClause(context,literal_table)
296
+ if clauseParts
297
+ literalContext = clauseParts.shift
298
+ parameters += clauseParts
299
+ end
300
+
301
+ if context
302
+ selects = [
303
+ [
304
+ asserted_type_table,
305
+ 'typeTable',
306
+ typeContext ? 'where ' + typeContext : '',
307
+ ASSERTED_TYPE_PARTITION
308
+ ],
309
+ [
310
+ quoted_table,
311
+ 'quoted',
312
+ quotedContext ? 'where ' + quotedContext : '',
313
+ QUOTED_PARTITION
314
+ ],
315
+ [
316
+ asserted_table,
317
+ 'asserted',
318
+ assertedContext ? 'where ' + assertedContext : '',
319
+ ASSERTED_NON_TYPE_PARTITION
320
+ ],
321
+ [
322
+ literal_table,
323
+ 'literal',
324
+ literalContext ? 'where ' + literalContext : '',
325
+ ASSERTED_LITERAL_PARTITION
326
+ ],
327
+ ]
328
+ q=unionSELECT(selects, :distinct => true, :select_type => COUNT_SELECT)
329
+ else
330
+ selects = [
331
+ [
332
+ asserted_type_table,
333
+ 'typeTable',
334
+ typeContext ? 'where ' + typeContext : '',
335
+ ASSERTED_TYPE_PARTITION
336
+ ],
337
+ [
338
+ asserted_table,
339
+ 'asserted',
340
+ assertedContext ? 'where ' + assertedContext : '',
341
+ ASSERTED_NON_TYPE_PARTITION
342
+ ],
343
+ [
344
+ literal_table,
345
+ 'literal',
346
+ literalContext ? 'where ' + literalContext : '',
347
+ ASSERTED_LITERAL_PARTITION
348
+ ],
349
+ ]
350
+ q=unionSELECT(selects, :select_type => COUNT_SELECT)
351
+ end
352
+
353
+ count = 0
354
+ executeSQL(self._normalizeSQLCmd(q), parameters) do |row|
355
+ count += row[0].to_i
356
+ end
357
+ count
358
+ end
359
+
360
+ # Contexts containing the triple (no matching), or total number of contexts in store
361
+ def contexts(triple = nil)
362
+ parameters = []
363
+
364
+ if triple
365
+ subject, predicate, object = triple.subject, triple.predicate, triple.object
366
+ if predicate == RDF_TYPE
367
+ # select from asserted rdf:type partition and quoted table (if a context is specified)
368
+ clauseString, *params = self.buildClause('typeTable',triple,nil, true)
369
+ parameters += params
370
+ selects = [
371
+ [
372
+ asserted_type_table,
373
+ 'typeTable',
374
+ clauseString,
375
+ ASSERTED_TYPE_PARTITION
376
+ ],
377
+ ]
378
+ #elsif predicate.is_a?(REGEXTerm) && predicate.compiledExpr.match(RDF_TYPE) || predicate.nil?
379
+ elsif predicate.nil?
380
+ # Select from quoted partition (if context is specified), literal partition if (obj is Literal or None) and asserted non rdf:type partition (if obj is URIRef or None)
381
+ clauseString, *params = self.buildClause('typeTable',Triple.new(subject, RDF_TYPE, object),nil, true)
382
+ parameters += params
383
+ selects = [
384
+ [
385
+ asserted_type_table,
386
+ 'typeTable',
387
+ clauseString,
388
+ ASSERTED_TYPE_PARTITION
389
+ ],
390
+ ]
391
+
392
+ if !STRONGLY_TYPED_TERMS || triple.object.is_a?(Literal) || triple.object.nil?
393
+ clauseString, *params = self.buildClause('literal',triple)
394
+ parameters += params
395
+ selects += [
396
+ [
397
+ literal_table,
398
+ 'literal',
399
+ clauseString,
400
+ ASSERTED_LITERAL_PARTITION
401
+ ]
402
+ ]
403
+ end
404
+ if !object.is_a?(Literal) || object.nil?
405
+ clauseString, *params = self.buildClause('asserted',triple)
406
+ parameters += params
407
+ selects += [
408
+ [
409
+ asserted_table,
410
+ 'asserted',
411
+ clauseString,
412
+ ASSERTED_NON_TYPE_PARTITION
413
+ ]
414
+ ]
415
+ end
416
+ elsif predicate
417
+ # select from asserted non rdf:type partition (optionally), quoted partition (if context is speciied), and literal partition (optionally)
418
+ selects = []
419
+ if !STRONGLY_TYPED_TERMS || object.is_a?(Literal) || object.nil?
420
+ clauseString, *params = self.buildClause('literal',triple)
421
+ parameters += params
422
+ selects += [
423
+ [
424
+ literal_table,
425
+ 'literal',
426
+ clauseString,
427
+ ASSERTED_LITERAL_PARTITION
428
+ ]
429
+ ]
430
+ end
431
+ if !object.is_a?(Literal) || object.nil?
432
+ clauseString, *params = self.buildClause('asserted',triple)
433
+ parameters += params
434
+ selects += [
435
+ [
436
+ asserted_table,
437
+ 'asserted',
438
+ clauseString,
439
+ ASSERTED_NON_TYPE_PARTITION
440
+ ]
441
+ ]
442
+ end
443
+ end
444
+
445
+ clauseString, *params = self.buildClause('quoted',triple)
446
+ parameters += params
447
+ selects += [
448
+ [
449
+ quoted_table,
450
+ 'quoted',
451
+ clauseString,
452
+ QUOTED_PARTITION
453
+ ]
454
+ ]
455
+ q=unionSELECT(selects, :distinct => true, :select_type => CONTEXT_SELECT)
456
+ else
457
+ selects = [
458
+ [
459
+ asserted_type_table,
460
+ 'typeTable',
461
+ '',
462
+ ASSERTED_TYPE_PARTITION
463
+ ],
464
+ [
465
+ quoted_table,
466
+ 'quoted',
467
+ '',
468
+ QUOTED_PARTITION
469
+ ],
470
+ [
471
+ asserted_table,
472
+ 'asserted',
473
+ '',
474
+ ASSERTED_NON_TYPE_PARTITION
475
+ ],
476
+ [
477
+ literal_table,
478
+ 'literal',
479
+ '',
480
+ ASSERTED_LITERAL_PARTITION
481
+ ],
482
+ ]
483
+ end
484
+
485
+ results = []
486
+ q=unionSELECT(selects, :distinct => true, :select_type => CONTEXT_SELECT)
487
+ executeSQL(_normalizeSQLCmd(q), parameters) do |row|
488
+ id, termComb = row
489
+
490
+ termCombString = REVERSE_TERM_COMBINATIONS[termComb.to_i]
491
+ subjTerm, predTerm, objTerm, ctxTerm = termCombString.chars.to_a
492
+
493
+ graphKlass, idKlass = constructGraph(ctxTerm)
494
+ results << graphKlass.new(:store => self, :identifier => idKlass.new(id))
495
+ end
496
+ results
497
+ end
498
+
499
+ # Namespace persistence interface implementation
500
+ #
501
+ # Bind namespace to store, returns bound namespace
502
+ def bind(namespace)
503
+ executeSQL("INSERT INTO #{namespace_binds} VALUES (?, ?)", namespace.prefix, namespace.uri)
504
+ # May throw exception, should be handled in driver-specific class
505
+
506
+ namespace
507
+ end
508
+
509
+ # Namespace for prefix
510
+ def namespace(prefix)
511
+ executeSQL("SELECT uri FROM #{namespace_binds} WHERE prefix=?", prefix) do |row|
512
+ return Namespace.new(row[0], prefix)
513
+ end
514
+ nil
515
+ end
516
+
517
+ # Prefix for namespace
518
+ def prefix(namespace)
519
+ uri = namespace.is_a?(Namespace) ? namespace.uri.to_s : namespace
520
+ executeSQL("SELECT prefix FROM #{namespace_binds} WHERE uri=?", uri) do |row|
521
+ return row[0]
522
+ end
523
+ nil
524
+ end
525
+
526
+ # List of namespace bindings, as a hash
527
+ def nsbinding
528
+ namespaces = []
529
+ executeSQL("SELECT prefix, uri FROM #{namespace_binds}") do |row|
530
+ namespaces << Namespace.new(row[1], row[0])
531
+ end
532
+ namespaces
533
+ end
534
+
535
+ # Transactional interfaces
536
+ def commit; @db.commit; end
537
+
538
+ def rollback; @db.rollback; end
539
+
540
+ protected
541
+ def quoted_table; "#{@internedId}_quoted_statements"; end
542
+ def asserted_table; "#{@internedId}_asserted_statements"; end
543
+ def asserted_type_table; "#{@internedId}_type_statements"; end
544
+ def literal_table; "#{@internedId}_literal_statements"; end
545
+ def namespace_binds; "#{@internedId}_namespace_binds"; end
546
+
547
+ def remove_context(identifier)
548
+ executeSQL("SET AUTOCOMMIT=0") if @autocommit_default
549
+
550
+ %w(quoted asserted type literal)
551
+ [quoted_table,asserted_table,asserted_type_table,literal_table].each do |table|
552
+ clauseString, *params = self.buildContextClause(identifier,table)
553
+ executeSQL(
554
+ _normalizeSQLCmd("DELETE from #{table} where #{clauseString}"),
555
+ params
556
+ )
557
+ end
558
+ end
559
+
560
+ # This takes the query string and parameters and (depending on the SQL implementation) either fill in
561
+ # the parameter in-place or pass it on to the DB impl (if it supports this).
562
+ # The default (here) is to fill the parameters in-place surrounding each param with quote characters
563
+ #
564
+ # Yields each row
565
+ def executeSQL(qStr, *params, &block)
566
+ @db.execute(qStr, *params, &block)
567
+ end
568
+
569
+ # Escape backslashes and single quotes
570
+ def escapeQuotes(qstr)
571
+ qstr.nil? ? "" : qstr.gsub("\\","\\\\").gsub("'", "\\'")
572
+ end
573
+
574
+ # Normalize a SQL command before executing it. Commence unicode black magic
575
+ def _normalizeSQLCmd(cmd)
576
+ cmd # XXX
577
+ end
578
+
579
+ #T akes a term and 'normalizes' it.
580
+ # Literals are escaped, Graphs are replaced with just their identifiers
581
+ def normalizeTerm(term)
582
+ case term
583
+ when Graph then normalizeTerm(term.identifier)
584
+ when Literal then escapeQuotes(term.to_n3)
585
+ when URIRef then term.to_s.rdf_escape
586
+ when BNode then term.to_s
587
+ else term
588
+ end
589
+ end
590
+
591
+ # Builds an insert command for a type table
592
+ # Returns string and list of parameters
593
+ def buildTypeSQLCommand(member,klass,context)
594
+ [
595
+ "INSERT INTO #{asserted_type_table} VALUES (?, ?, ?, ?)",
596
+ normalizeTerm(member),
597
+ normalizeTerm(klass),
598
+ normalizeTerm(context),
599
+ type2TermCombination(member, klass, context)
600
+ ]
601
+ end
602
+
603
+ # Builds an insert command for literal triples (statements where the object is a Literal)
604
+ # Returns string and list of parameters
605
+ def buildLiteralTripleSQLCommand(triple,context)
606
+ triplePattern = statement2TermCombination(triple,context)
607
+ [
608
+ "INSERT INTO #{literal_table} VALUES (?, ?, ?, ?, ?,?,?)",
609
+ normalizeTerm(triple.subject),
610
+ normalizeTerm(triple.predicate),
611
+ normalizeTerm(triple.object),
612
+ normalizeTerm(context),
613
+ triplePattern,
614
+ (triple.object.is_a?(Literal) ? triple.object.lang : NULL),
615
+ (triple.object.is_a?(Literal) ? triple.object.encoding.value.to_s : NULL),
616
+ ]
617
+ end
618
+
619
+ # Builds an insert command for regular triple table
620
+ def buildTripleSQLCommand(triple,context,quoted)
621
+ stmt_table = quoted ? quoted_table : asserted_table
622
+ triplePattern = statement2TermCombination(triple,context)
623
+
624
+ if quoted
625
+ [
626
+ "INSERT INTO #{stmt_table} VALUES (?, ?, ?, ?, ?,?,?)",
627
+ normalizeTerm(triple.subject),
628
+ normalizeTerm(triple.predicate),
629
+ normalizeTerm(triple.object),
630
+ normalizeTerm(context),
631
+ triplePattern,
632
+ (triple.object.is_a?(Literal) ? triple.object.lang : NULL),
633
+ (triple.object.is_a?(Literal) ? triple.object.encoding.value.to_s : NULL),
634
+ ]
635
+ else
636
+ [
637
+ "INSERT INTO #{stmt_table} VALUES (?, ?, ?, ?, ?)",
638
+ normalizeTerm(triple.subject),
639
+ normalizeTerm(triple.predicate),
640
+ normalizeTerm(triple.object),
641
+ normalizeTerm(context),
642
+ triplePattern
643
+ ]
644
+ end
645
+ end
646
+
647
+ # Builds WHERE clauses for the supplied terms and, context
648
+ def buildClause(tableName,triple,context=nil,typeTable=false)
649
+ parameters=[]
650
+ if typeTable
651
+ rdf_type_memberClause = rdf_type_klassClause = rdf_type_contextClause = nil
652
+
653
+ # Subject clause
654
+ clauseParts = self.buildTypeMemberClause(self.normalizeTerm(triple.subject),tableName)
655
+ if clauseParts
656
+ rdf_type_memberClause = clauseParts.shift
657
+ parameters += clauseParts
658
+ end
659
+
660
+ # Object clause
661
+ clauseParts = self.buildTypeClassClause(self.normalizeTerm(triple.object),tableName)
662
+ if clauseParts
663
+ rdf_type_klassClause = clauseParts.shift
664
+ parameters += clauseParts
665
+ end
666
+
667
+ # Context clause
668
+ clauseParts = self.buildContextClause(context,tableName)
669
+ if clauseParts
670
+ rdf_type_contextClause = clauseParts.shift
671
+ parameters += clauseParts
672
+ end
673
+
674
+ clauses = [rdf_type_memberClause,rdf_type_klassClause,rdf_type_contextClause].compact
675
+ else
676
+ subjClause = predClause = objClause = contextClause = litDTypeClause = litLanguageClause = nil
677
+
678
+ # Subject clause
679
+ clauseParts = self.buildSubjClause(self.normalizeTerm(triple.subject),tableName)
680
+ if clauseParts
681
+ subjClause = clauseParts.shift
682
+ parameters += clauseParts
683
+ end
684
+
685
+ # Predicate clause
686
+ clauseParts = self.buildPredClause(self.normalizeTerm(triple.predicate),tableName)
687
+ if clauseParts
688
+ predClause = clauseParts.shift
689
+ parameters += clauseParts
690
+ end
691
+
692
+ # Object clause
693
+ clauseParts = self.buildObjClause(self.normalizeTerm(triple.object),tableName)
694
+ if clauseParts
695
+ objClause = clauseParts.shift
696
+ parameters += clauseParts
697
+ end
698
+
699
+ # Context clause
700
+ clauseParts = self.buildContextClause(context,tableName)
701
+ if clauseParts
702
+ contextClause = clauseParts.shift
703
+ parameters += clauseParts
704
+ end
705
+
706
+ # Datatype clause
707
+ clauseParts = self.buildLitDTypeClause(triple.object,tableName)
708
+ if clauseParts
709
+ litDTypeClause = clauseParts.shift
710
+ parameters += clauseParts
711
+ end
712
+
713
+ # Language clause
714
+ clauseParts = self.buildLitLanguageClause(triple.object,tableName)
715
+ if clauseParts
716
+ litLanguageClause = clauseParts.shift
717
+ parameters += clauseParts
718
+ end
719
+
720
+ clauses = [subjClause,predClause,objClause,contextClause,litDTypeClause,litLanguageClause].compact
721
+ end
722
+
723
+ clauseString = clauses.join(' and ')
724
+ clauseString = "WHERE #{clauseString}" unless clauseString.empty?
725
+
726
+ [clauseString] + parameters
727
+ end
728
+
729
+ def buildLitDTypeClause(obj,tableName)
730
+ "#{tableName}.objDatatype='#{obj.encoding.value}'" if obj.is_a?(Literal) && obj.encoding
731
+ end
732
+
733
+ def buildLitLanguageClause(obj,tableName)
734
+ "#{tableName}.objDatatype='#{obj.lang}'" if obj.is_a?(Literal) && obj.lang
735
+ end
736
+
737
+ # Stubs for Clause Functions that are overridden by specific implementations (MySQL vs SQLite for instance)
738
+ def buildSubjClause(subject,tableName); end
739
+ def buildPredClause(predicate,tableName); end
740
+ def buildObjClause(obj,tableName); end
741
+ def buildContextClause(context,tableName); end
742
+ def buildTypeMemberClause(subject,tableName); end
743
+ def buildTypeClassClause(obj,tableName); end
744
+
745
+ # Helper function for executing EXPLAIN on all dispatched SQL statements - for the pupose of analyzing
746
+ # index usage
747
+ def queryAnalysis(query)
748
+ end
749
+
750
+ # Helper function for building union all select statement
751
+ # @param [Array] select_components:: list of [table_name, table_alias, table_type, where_clause]
752
+ # @param [Hash] options:: Options
753
+ # <em>options[:distinct]</em>:: true or false
754
+ # <em>options[:select_type]</em>:: Defaults to TRIPLE_SELECT
755
+ def unionSELECT(selectComponents, options = {})
756
+ selectType = options[:select_type] || TRIPLE_SELECT
757
+ selects = []
758
+
759
+ selectComponents.each do |sc|
760
+ tableName, tableAlias, whereClause, tableType = sc
761
+
762
+ case
763
+ when selectType == COUNT_SELECT
764
+ selectString = "select count(*)"
765
+ tableSource = " from #{tableName} "
766
+ when selectType == CONTEXT_SELECT
767
+ selectString = "select #{tableAlias}.context, " +
768
+ "#{tableAlias}.termComb as termComb "
769
+ tableSource = " from #{tableName} as #{tableAlias} "
770
+ when FULL_TRIPLE_PARTITIONS.include?(tableType)
771
+ selectString = "select *"
772
+ tableSource = " from #{tableName} as #{tableAlias} "
773
+ when tableType == ASSERTED_TYPE_PARTITION
774
+ selectString = "select #{tableAlias}.member as subject, " +
775
+ "\"#{RDF_TYPE}\" as predicate, " +
776
+ "#{tableAlias}.klass as object, " +
777
+ "#{tableAlias}.context as context, " +
778
+ "#{tableAlias}.termComb as termComb, " +
779
+ "NULL as objLanguage, " +
780
+ "NULL as objDatatype"
781
+ tableSource = " from #{tableName} as #{tableAlias} "
782
+ when tableType == ASSERTED_NON_TYPE_PARTITION
783
+ selectString = "select *, NULL as objLanguage, NULL as objDatatype"
784
+ tableSource = " from #{tableName} as #{tableAlias} "
785
+ else
786
+ raise StoreException, "unionSELECT failed to find template: selectType = #{selectType}, tableType = #{tableType}"
787
+ end
788
+
789
+ selects << "#{selectString}#{tableSource}#{whereClause}"
790
+ end
791
+
792
+ orderStmt = selectType == TRIPLE_SELECT ? " order by subject, predicate, object" : ""
793
+
794
+ selects.join(options[:distinct] ? " union all ": " union ") + orderStmt
795
+ end
796
+
797
+ # Takes a tuple which represents an entry in a result set and
798
+ # converts it to a tuple of terms using the termComb integer
799
+ # to interpret how to instanciate each term
800
+ # tupleRt is an array containing one or more of:
801
+ # - subject
802
+ # - predicate
803
+ # - obj
804
+ # - rtContext
805
+ # - termComb
806
+ # - objLanguage
807
+ # - objDatatype
808
+ def extractTriple(tupleRt, hardCodedContext = nil)
809
+ subject, predicate, obj, rtContext, termComb, objLanguage, objDatatype = tupleRt
810
+
811
+ raise StoreException, "extractTriple: unknow termComb: '#{termComb}'" unless REVERSE_TERM_COMBINATIONS.has_key?(termComb.to_i)
812
+
813
+ context = rtContext || hardCodedContext
814
+ termCombString = REVERSE_TERM_COMBINATIONS[termComb.to_i]
815
+ subjTerm, predTerm, objTerm, ctxTerm = termCombString.chars.to_a
816
+
817
+ s = createTerm(subject, subjTerm)
818
+ p = createTerm(predicate, predTerm)
819
+ o = createTerm(obj, objTerm, objLanguage, objDatatype)
820
+
821
+ graphKlass, idKlass = constructGraph(ctxTerm)
822
+ return [Triple.new(s, p, o), graphKlass, idKlass, context]
823
+ end
824
+
825
+ # Takes a term value, and term type
826
+ # and Creates a term object. QuotedGraphs are instantiated differently
827
+ def createTerm(termString,termType,objLanguage=nil,objDatatype=nil)
828
+ case termType
829
+ when "L"
830
+ @literalCache[[termString, objLanguage, objDatatype]] ||= Literal.n3_encoded(termString, objLanguage, objDatatype)
831
+ # when "F"
832
+ # @otherCache[[termType, termString]] ||= QuotedGraph(:identifier => URIRef(termString), :store => self)
833
+ when "B"
834
+ @bnodeCache[termString] ||= BNode.new(termString)
835
+ when "U"
836
+ @uriCache[termString] || URIRef.new(termString)
837
+ # when "V"
838
+ else
839
+ raise StoreException.new("Unknown termType: #{termType}")
840
+ end
841
+ end
842
+ end
843
+ end