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,47 @@
1
+ require File.join(File.dirname(__FILE__), "graph.rb")
2
+
3
+ module RdfContext
4
+ # ConjunctiveGraph - The top level container for all named Graphs sharing a _Store_
5
+ #
6
+ # A ConjuctiveGraph is a graph that can contain other graphs. Graphs are kept distinct
7
+ # by a _context_, which is the identifier of the sub-graph. It is the union of all graphs in a _Store_.
8
+ #
9
+ # For the sake of persistence, Conjunctive Graphs must be distinguished by identifiers (that may not
10
+ # necessarily be RDF identifiers or may be an RDF identifier normalized - SHA1/MD5 perhaps - for database
11
+ # naming purposes ) which could be referenced to indicate conjunctive queries (queries made across the
12
+ # entire conjunctive graph) or appear as nodes in asserted statements. In this latter case, such
13
+ # statements could be interpreted as being made about the entire 'known' universe.
14
+ class ConjunctiveGraph < Graph
15
+ # Store for ConjunctiveGraph must support contexts.
16
+ def initialize(options = {})
17
+ unless options[:store] && options[:store].context_aware?
18
+ raise GraphException.new("Conjuective Graph requires store supporting contexts")
19
+ end
20
+
21
+ super(:identifier => options[:store].identifier, :store => options[:store])
22
+ @context_aware = true
23
+ end
24
+
25
+ # The default_context is a Graph having an _identifier_ the same as the
26
+ # _identifier_ of the _store_.
27
+ def default_context
28
+ @@default_context = Graph.new(:identifier => @store.identifier, :store => @store)
29
+ end
30
+
31
+ # Parse source into a new context.
32
+ #
33
+ # Create a new context (Graph) and parse into that.
34
+ #
35
+ # @param [IO, String] stream:: the RDF IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
36
+ # @param [String] uri:: the URI of the document
37
+ # @param [Hash] options:: Options from
38
+ # <em>options[:debug]</em>:: Array to place debug messages
39
+ # <em>options[:type]</em>:: One of _rdfxml_, _html_, or _n3_
40
+ # <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
41
+ # @return [Graph]:: Returns the graph containing parsed triples
42
+ def parse(stream, uri, options = {}, &block) # :yields: triple
43
+ graph = Graph.new(:identifier => uri, :store => self.store)
44
+ Parser.parse(stream, uri, options.merge(:graph => graph), &block)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ module RdfContext
2
+ class RdfException < RuntimeError; end
3
+ class ParserException < RdfException; end
4
+ class GraphException < RdfException; end
5
+ class StoreException < RdfException; end
6
+ class BNodeException < RdfException; end
7
+ class TypeError < RdfException; end
8
+ class InvalidPredicate < RdfException; end
9
+ class InvalidSubject < RdfException; end
10
+ class InvalidObject < RdfException; end
11
+ end
@@ -0,0 +1,333 @@
1
+ require File.join(File.dirname(__FILE__), 'store', 'list_store')
2
+ require File.join(File.dirname(__FILE__), 'store', 'memory_store')
3
+
4
+ module RdfContext
5
+ # A simple graph to hold triples.
6
+ #
7
+ # Graphs store triples, and the namespaces associated with those triples, where defined
8
+ class Graph
9
+ attr_reader :triples
10
+ attr_reader :nsbinding
11
+ attr_reader :identifier
12
+ attr_reader :store
13
+
14
+ # Create a Graph with the given store and identifier.
15
+ #
16
+ # The constructor accepts a _store_ option,
17
+ # that will be used to store the graph data.
18
+ #
19
+ # Stores can be context-aware or unaware. Unaware stores take up
20
+ # (some) less space but cannot support features that require
21
+ # context, such as true merging/demerging of sub-graphs and
22
+ # provenance.
23
+ #
24
+ # The Graph constructor can take an identifier which identifies the Graph
25
+ # by name. If none is given, the graph is assigned a BNode for it's identifier.
26
+ # For more on named graphs, see: http://en.wikipedia.org/wiki/RDFLib
27
+ #
28
+ # @param [Hash] options:: Options
29
+ # <em>options[:store]</em>:: storage, defaults to a new ListStore instance
30
+ # <em>options[:identifier]</em>:: Identifier for this graph, Literal, BNode or URIRef
31
+ def initialize(options = {})
32
+ @nsbinding = {}
33
+
34
+ # Instantiate triple store
35
+ @store = case options[:store]
36
+ when AbstractStore then options[:store]
37
+ when :list_store then ListStore.new
38
+ when :memory_store then MemoryStore.new
39
+ else ListStore.new
40
+ end
41
+
42
+ @identifier = options[:identifier] || BNode.new
43
+ end
44
+
45
+ def inspect
46
+ "#{self.class}[id=#{identifier},store=#{store.inspect}]"
47
+ end
48
+
49
+ # Hash of graph, based on graph type and identifier
50
+ def hash
51
+ [self.class.to_s, self.identifier].hash
52
+ end
53
+
54
+ def context_aware?; @context_aware; end
55
+
56
+ # Data Store interface
57
+ def nsbinding; @store.nsbinding; end
58
+
59
+ # Destroy the store identified by _configuration_ if supported
60
+ def destroy(configuration = nil)
61
+ @store.destroy(configuration)
62
+ self.freeze
63
+ end
64
+
65
+ # Commit changes to graph
66
+ def commit; @store.commit; end
67
+
68
+ # Rollback active transactions
69
+ def rollback; @store.rollback; end
70
+
71
+ # Open the graph store
72
+ #
73
+ # Might be necessary for stores that require opening a connection to a
74
+ # database or acquiring some resource.
75
+ def open(configuration, create=false)
76
+ @store.open(configuration, create)
77
+ end
78
+
79
+ # Close the graph store
80
+ #
81
+ # Might be necessary for stores that require closing a connection to a
82
+ # database or releasing some resource.
83
+ def close(commit_pending_transaction=false)
84
+ @store.open(commit_pending_transaction)
85
+ end
86
+
87
+ ##
88
+ # Exports the graph to RDF in N-Triples form.
89
+ #
90
+ # ==== Example
91
+ # g = Graph.new; g.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new); g.to_ntriples # => returns a string of the graph in N-Triples form
92
+ #
93
+ # @return [String]:: The graph in N-Triples.
94
+ #
95
+ # @author Tom Morris
96
+ def to_ntriples
97
+ triples.collect do |t|
98
+ t.to_ntriples
99
+ end * "\n" + "\n"
100
+ end
101
+
102
+ # Output graph using to_ntriples
103
+ def to_s; self.to_ntriples; end
104
+
105
+ ##
106
+ # Exports the graph to RDF in RDF/XML form.
107
+ #
108
+ # @return [String]:: The RDF/XML graph
109
+ def to_rdfxml
110
+ replace_text = {}
111
+ rdfxml = ""
112
+ xml = builder = Builder::XmlMarkup.new(:target => rdfxml, :indent => 2)
113
+
114
+ extended_bindings = nsbinding.merge(
115
+ "rdf" => RDF_NS,
116
+ "rdfs" => RDFS_NS,
117
+ "xhv" => XHV_NS,
118
+ "xml" => XML_NS
119
+ )
120
+ rdf_attrs = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.xmlns_attr => ns.uri.to_s)}
121
+ uri_bindings = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.uri.to_s => ns.prefix)}
122
+ xml.instruct!
123
+ xml.rdf(:RDF, rdf_attrs) do
124
+ # Add statements for each subject
125
+ subjects.each do |s|
126
+ xml.rdf(:Description, (s.is_a?(BNode) ? "rdf:nodeID" : "rdf:about") => s) do
127
+ triples(Triple.new(s, nil, nil)) do |triple, context|
128
+ xml_args = triple.object.xml_args
129
+ if triple.object.is_a?(Literal) && triple.object.xmlliteral?
130
+ replace_text["__replace_with_#{triple.object.object_id}__"] = xml_args[0]
131
+ xml_args[0] = "__replace_with_#{triple.object.object_id}__"
132
+ end
133
+ xml.tag!(triple.predicate.to_qname(uri_bindings), *xml_args)
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ # Perform literal substitutions
140
+ replace_text.each_pair do |match, value|
141
+ rdfxml.sub!(match, value)
142
+ end
143
+
144
+ rdfxml
145
+ end
146
+
147
+ ##
148
+ # Bind a namespace to the graph.
149
+ #
150
+ # ==== Example
151
+ # g = Graph.new; g.bind(Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")) # => binds the Foaf namespace to g
152
+ #
153
+ # @param [String] namespace:: the namespace to bind
154
+ # @return [Namespace]:: The newly bound or pre-existing namespace.
155
+ def bind(namespace)
156
+ raise GraphException, "Can't bind #{namespace.inspect} as namespace" unless namespace.is_a?(Namespace)
157
+ @store.bind(namespace)
158
+ end
159
+
160
+ # Namespace for prefix
161
+ def namespace(prefix); @store.namespace(prefix); end
162
+
163
+ # Prefix for namespace
164
+ def prefix(namespace); @store.prefix(namespace); end
165
+
166
+ # Number of Triples in the graph
167
+ def size; @store.size(self); end
168
+
169
+ # List of distinct subjects in graph
170
+ def subjects; @store.subjects(self); end
171
+
172
+ # List of distinct predicates in graph
173
+ def predicates; @store.predicates(self); end
174
+
175
+ # List of distinct objects in graph
176
+ def objects; @store.objects(self); end
177
+
178
+ # Indexed statement in serialized graph triples. Equivalent to graph.triples[item]
179
+ def [] (item); @store.item(item, self); end
180
+
181
+ # Adds a triple to a graph directly from the intended subject, predicate, and object.
182
+ #
183
+ # ==== Example
184
+ # g = Graph.new; g.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new) # => results in the triple being added to g; returns an array of g's triples
185
+ #
186
+ # @param [URIRef, BNode] subject:: the subject of the triple
187
+ # @param [URIRef] predicate:: the predicate of the triple
188
+ # @param [URIRef, BNode, Literal] object:: the object of the triple
189
+ # @return [Graph]:: Returns the graph
190
+ # @raise [Error]:: Checks parameter types and raises if they are incorrect.
191
+ def add_triple(subject, predicate, object)
192
+ self.add(Triple.new(subject, predicate, object))
193
+ self
194
+ end
195
+
196
+ ##
197
+ # Adds an more extant triples to a graph. Delegates to Store.
198
+ #
199
+ # ==== Example
200
+ # g = Graph.new;
201
+ # t = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
202
+ # g << t
203
+ #
204
+ # @param [Triple] t:: the triple to be added to the graph
205
+ # @return [Graph]:: Returns the graph
206
+ def << (triple)
207
+ @store.add(triple, self)
208
+ self
209
+ end
210
+
211
+ ##
212
+ # Adds one or more extant triples to a graph. Delegates to Store.
213
+ #
214
+ # ==== Example
215
+ # g = Graph.new;
216
+ # t1 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
217
+ # t2 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
218
+ # g.add(t1, t2, ...)
219
+ #
220
+ # @param [Triple] triples:: one or more triples. Last element may be a hash for options
221
+ # <em>options[:context]</em>:: Graph context in which to deposit triples, defaults to default_context or self
222
+ # @return [Graph]:: Returns the graph
223
+ def add(*triples)
224
+ options = triples.last.is_a?(Hash) ? triples.pop : {}
225
+ ctx = options[:context] || @default_context || self
226
+ triples.each {|t| @store.add(t, ctx)}
227
+ self
228
+ end
229
+
230
+ # Remove a triple from the graph. Delegates to store.
231
+ # Nil matches all triples and thus empties the graph
232
+ def remove(triple); @store.remove(triple, self); end
233
+
234
+ # Triples from graph, optionally matching subject, predicate, or object.
235
+ # Delegates to Store#triples.
236
+ #
237
+ # @param [Triple, nil] triple:: Triple to match, may be a patern triple or nil
238
+ # @return [Array]:: List of matched triples
239
+ def triples(triple = Triple.new(nil, nil, nil), &block) # :yields: triple, context
240
+ @store.triples(triple, self, &block) || []
241
+ end
242
+ alias_method :find, :triples
243
+
244
+ # Detect the presence of a BNode in the graph, either as a subject or an object
245
+ #
246
+ # @param [BNode] bn:: BNode to find
247
+ #
248
+ def has_bnode_identifier?(bn)
249
+ triples do |triple, context|
250
+ return true if triple.subject.eql?(bn) || triple.object.eql?(bn)
251
+ end
252
+ false
253
+ end
254
+
255
+ # Check to see if this graph contains the specified triple
256
+ def contains?(triple)
257
+ @store.contains?(triple, self)
258
+ end
259
+
260
+ # Get all BNodes with usage count used within graph
261
+ def bnodes
262
+ @store.bnodes(self)
263
+ end
264
+
265
+ # Get list of subjects having rdf:type == object
266
+ #
267
+ # @param [Resource, Regexp, String] object:: Type resource
268
+ def get_by_type(object)
269
+ triples(Triple.new(nil, RDF_TYPE, object)).map {|t, ctx| t.subject}
270
+ end
271
+
272
+ # Merge a graph into this graph
273
+ def merge!(graph)
274
+ raise GraphException.new("merge without a graph") unless graph.is_a?(Graph)
275
+
276
+ # Map BNodes from source Graph to new BNodes
277
+ bn = graph.bnodes
278
+ bn.keys.each {|k| bn[k] = BNode.new}
279
+
280
+ graph.triples do |triple, context|
281
+ # If triple contains bnodes, remap to new values
282
+ if triple.subject.is_a?(BNode) || triple.object.is_a?(BNode)
283
+ triple = triple.clone
284
+ triple.subject = bn[triple.subject] if triple.subject.is_a?(BNode)
285
+ triple.object = bn[triple.object] if triple.object.is_a?(BNode)
286
+ end
287
+ self << triple
288
+ end
289
+ end
290
+
291
+ # Two graphs are equal if each is an instance of the other, considering BNode equivalence.
292
+ # This may be done by creating a new graph an substituting each permutation of BNode identifiers
293
+ # from self to other until every permutation is exhausted, or a textual equivalence is found
294
+ # after sorting each graph.
295
+ #
296
+ # We just follow Python RDFlib's lead and do a simple comparison
297
+ def eql? (other)
298
+ #puts "eql? size #{self.size} vs #{other.size}"
299
+ return false if !other.is_a?(Graph) || self.size != other.size
300
+ return false unless other.identifier.to_s == identifier.to_s
301
+
302
+ bn_self = bnodes.values.sort
303
+ bn_other = other.bnodes.values.sort
304
+ #puts "eql? bnodes '#{bn_self.to_sentence}' vs '#{bn_other.to_sentence}'"
305
+ return false unless bn_self == bn_other
306
+
307
+ # Check each triple to see if it's contained in the other graph
308
+ triples do |t, ctx|
309
+ next if t.subject.is_a?(BNode) || t.object.is_a?(BNode)
310
+ #puts "eql? contains '#{t.to_ntriples}'"
311
+ return false unless other.contains?(t)
312
+ end
313
+ true
314
+ end
315
+
316
+ alias_method :==, :eql?
317
+ end
318
+
319
+ # Parse source into Graph.
320
+ #
321
+ # Merges results into a common Graph
322
+ #
323
+ # @param [IO, String] stream:: the RDF IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
324
+ # @param [String] uri:: the URI of the document
325
+ # @param [Hash] options:: Options from
326
+ # <em>options[:debug]</em>:: Array to place debug messages
327
+ # <em>options[:type]</em>:: One of _rdfxml_, _html_, or _n3_
328
+ # <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
329
+ # @return [Graph]:: Returns the graph containing parsed triples
330
+ def parse(stream, uri, options = {}, &block) # :yields: triple
331
+ Parser.parse(stream, uri, options.merge(:graph => self), &block)
332
+ end
333
+ end
@@ -0,0 +1,340 @@
1
+ module RdfContext
2
+ # An RDF Literal, with value, encoding and language elements.
3
+ class Literal
4
+ class Encoding
5
+ attr_reader :value
6
+
7
+ # New Encoding for a literal, typed, untyped or XMLLiteral
8
+ def initialize(value)
9
+ @value = URIRef.new(value.to_s) if value
10
+ end
11
+
12
+ # Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#int")</tt>
13
+ def self.integer
14
+ @integer ||= coerce "http://www.w3.org/2001/XMLSchema#int"
15
+ end
16
+
17
+ # Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#float")</tt>
18
+ def self.float
19
+ @float ||= coerce "http://www.w3.org/2001/XMLSchema#float"
20
+ end
21
+
22
+ # Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#string")</tt>
23
+ def self.string
24
+ @string ||= coerce "http://www.w3.org/2001/XMLSchema#string"
25
+ end
26
+
27
+ # Create from URI, empty or nil string
28
+ def self.coerce(string_or_nil)
29
+ if string_or_nil.nil? || string_or_nil == ''
30
+ the_null_encoding
31
+ elsif xmlliteral == string_or_nil.to_s
32
+ xmlliteral
33
+ else
34
+ new string_or_nil
35
+ end
36
+ end
37
+
38
+ def inspect
39
+ to_s()
40
+ end
41
+
42
+ def self.the_null_encoding
43
+ @the_null_encoding ||= Null.new(nil)
44
+ end
45
+
46
+ def self.xmlliteral
47
+ @xmlliteral ||= XMLLiteral.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral")
48
+ end
49
+
50
+ # Compare against another encoding, or a URI of a literal type
51
+ def ==(other)
52
+ case other
53
+ when String
54
+ other == @value.to_s
55
+ when self.class
56
+ other.value.to_s == @value.to_s
57
+ else
58
+ false
59
+ end
60
+ end
61
+
62
+ # Generate hash of type to determine uniqueness
63
+ def hash
64
+ @value.hash
65
+ end
66
+
67
+ def to_s
68
+ @value.to_s
69
+ end
70
+
71
+ # Serialize literal, adding datatype and language elements, if present.
72
+ # XMLLiteral and String values are RDF-escaped.
73
+ def format_as_n3(content, lang)
74
+ quoted_content = "\"#{content.to_s.rdf_escape}\"^^<#{value}>"
75
+ end
76
+
77
+ # Serialize literal to TriX
78
+ def format_as_trix(content, lang)
79
+ lang = " xml:lang=\"#{lang}\"" if lang
80
+ "<typedLiteral datatype=\"#{@value}\"#{lang}>#{content}</typedLiteral>"
81
+ end
82
+
83
+ # Return content and hash appropriate for encoding in XML
84
+ #
85
+ # ==== Example
86
+ # Encoding.string.xml_args("foo", "en-US") => ["foo", {"rdf:datatype" => "xs:string"}]
87
+ def xml_args(content, lang)
88
+ hash = {"rdf:datatype" => @value.to_s}
89
+ [content.to_s, hash]
90
+ end
91
+
92
+ # Compare literal contents, ignore language
93
+ def compare_contents(a, b, same_lang)
94
+ a == b
95
+ end
96
+
97
+ # Encode literal contents
98
+ def encode_contents(contents, options)
99
+ contents
100
+ end
101
+ end
102
+
103
+ # The null encoding
104
+ class Null < Encoding
105
+ def to_s
106
+ ''
107
+ end
108
+
109
+ # Format content for n3/N-Triples. Quote an RDF-escape and include language
110
+ def format_as_n3(content, lang)
111
+ "\"#{content.to_s.rdf_escape}\"" + (lang ? "@#{lang}" : "")
112
+ end
113
+
114
+ # Format content for TriX
115
+ def format_as_trix(content, lang)
116
+ if lang
117
+ "<plainLiteral xml:lang=\"#{lang}\"\>#{content}</plainLiteral>"
118
+ else
119
+ "<plainLiteral>#{content}</plainLiteral>"
120
+ end
121
+ end
122
+
123
+ # Return content and hash appropriate for encoding in XML
124
+ #
125
+ # ==== Example
126
+ # Encoding.the_null_encoding.xml_args("foo", "en-US") => ["foo", {"xml:lang" => "en-US"}]
127
+ def xml_args(content, lang)
128
+ hash = {}
129
+ hash["xml:lang"] = lang if lang
130
+ [content, hash]
131
+ end
132
+
133
+ # Compare literal contents, requiring languages to match
134
+ def compare_contents(a, b, same_lang)
135
+ a == b && same_lang
136
+ end
137
+
138
+ def inspect
139
+ "<Literal::Encoding::Null>"
140
+ end
141
+ end
142
+
143
+ class XMLLiteral < Encoding
144
+ # Compare XMLLiterals
145
+ #
146
+ # Nokogiri doesn't do a deep compare of elements
147
+ #
148
+ # Convert node-sets to hash using ActiveSupport::XmlMini and compare hashes.
149
+ def compare_contents(a, b, same_lang)
150
+ begin
151
+ a_hash = ActiveSupport::XmlMini.parse("<foo>#{a}</foo>")
152
+ b_hash = ActiveSupport::XmlMini.parse("<foo>#{b}</foo>")
153
+ a_hash == b_hash
154
+ rescue
155
+ super
156
+ end
157
+ end
158
+
159
+ def format_as_n3(content, lang)
160
+ "\"#{content.to_s.rdf_escape}\"^^<#{value}>"
161
+ end
162
+
163
+ def format_as_trix(content, lang)
164
+ "<typedLiteral datatype=\"#{@value}\">#{content}</typedLiteral>"
165
+ end
166
+
167
+ def xml_args(content, lang)
168
+ hash = {"rdf:parseType" => "Literal"}
169
+ [content, hash]
170
+ end
171
+
172
+ # Map namespaces from context to each top-level element found within node-set
173
+ def encode_contents(contents, options)
174
+ #puts "encode_contents: '#{contents}'"
175
+ if contents.is_a?(String)
176
+ ns_hash = options[:namespaces].values.inject({}) {|h, ns| h.merge(ns.xmlns_hash)}
177
+ ns_strs = []
178
+ ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
179
+
180
+ # Add inherited namespaces to created root element so that they're inherited to sub-elements
181
+ contents = Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{contents}</foo>").root.children
182
+ end
183
+
184
+ # Add already mapped namespaces and language
185
+ @contents = contents.map do |c|
186
+ c = Nokogiri::XML.parse(c.copy(true).to_s) if c.is_a?(LibXML::XML::Node)
187
+ if c.is_a?(Nokogiri::XML::Element)
188
+ # Gather namespaces from self and decendant nodes
189
+ c.traverse do |n|
190
+ ns = n.namespace
191
+ next unless ns
192
+ prefix = ns.prefix ? "xmlns:#{ns.prefix}" : "xmlns"
193
+ c[prefix] = ns.href unless c.namespaces[prefix]
194
+ end
195
+
196
+ # Add lanuage
197
+ if options[:language] && c["lang"].to_s.empty?
198
+ c["xml:lang"] = options[:language]
199
+ end
200
+ end
201
+ c.to_html
202
+ end.join("")
203
+ end
204
+ end
205
+
206
+ class Language
207
+ attr_accessor :value
208
+ def initialize(string)
209
+ @value = string.to_s.downcase
210
+ end
211
+
212
+ def clean(string)
213
+ case string
214
+ when "eng"; "en"
215
+ else string
216
+ end
217
+ end
218
+
219
+ def == (other)
220
+ case other
221
+ when String
222
+ other == @value
223
+ when self.class
224
+ other.value == @value
225
+ end
226
+ end
227
+
228
+ def to_s; @value; end
229
+ end
230
+
231
+ attr_accessor :contents, :encoding, :lang
232
+
233
+ # Create a new Literal. Optinally pass a namespaces hash
234
+ # for use in applying to rdf::XMLLiteral values.
235
+ def initialize(contents, encoding, options = {})
236
+ unless encoding.is_a?(Encoding)
237
+ raise TypeError, "#{encoding.inspect} should be an instance of Encoding"
238
+ end
239
+ @encoding = encoding
240
+ lang = options[:language]
241
+ @lang = Language.new(lang) if lang
242
+ options = {:namespaces => {}}.merge(options)
243
+
244
+ @contents = @encoding.encode_contents(contents, options)
245
+ end
246
+
247
+ # Create literal from a string that is already N3 encoded.
248
+ def self.n3_encoded(contents, language, encoding = nil)
249
+ encoding = encoding.nil? ? Encoding.the_null_encoding : Encoding.coerce(encoding)
250
+ options = {}
251
+ options[:language] = language if language
252
+ #puts "encoded: #{contents.dump}"
253
+ contents = contents.rdf_unescape
254
+ #puts "unencoded: #{contents.dump}"
255
+ new(contents, encoding, options)
256
+ end
257
+
258
+ # Create an un-typed literal with a language
259
+ def self.untyped(contents, language = nil)
260
+ options = {}
261
+ options[:language] = language if language
262
+ new(contents, Encoding.the_null_encoding, options)
263
+ end
264
+
265
+ # Create a typed literal
266
+ # Options include:
267
+ # _namespaces_:: A hash of namespace entries (for XMLLiteral)
268
+ def self.typed(contents, encoding, options = {})
269
+ encoding = Encoding.coerce(encoding)
270
+ new(contents, encoding, options)
271
+ end
272
+
273
+ # Create a literal appropriate for type of object by datatype introspection
274
+ def self.build_from(object)
275
+ new(object.to_s, infer_encoding_for(object))
276
+ end
277
+
278
+ # Infer the proper XML datatype for the given object
279
+ def self.infer_encoding_for(object)
280
+ case object
281
+ when Integer then Encoding.new("http://www.w3.org/2001/XMLSchema#int")
282
+ when Float then Encoding.new("http://www.w3.org/2001/XMLSchema#float")
283
+ when Time then Encoding.new("http://www.w3.org/2001/XMLSchema#time")
284
+ when DateTime then Encoding.new("http://www.w3.org/2001/XMLSchema#dateTime")
285
+ when Date then Encoding.new("http://www.w3.org/2001/XMLSchema#date")
286
+ else Encoding.new("http://www.w3.org/2001/XMLSchema#string")
287
+ end
288
+ end
289
+
290
+ class << self
291
+ protected :new
292
+ end
293
+
294
+ # Compare literal with another literal or a string.
295
+ # If a string is passed, only contents must match.
296
+ # Otherwise, compare encoding types, contents and languages.
297
+ def ==(other)
298
+ case other
299
+ when String then other == self.contents
300
+ when self.class
301
+ other.encoding == @encoding &&
302
+ @encoding.compare_contents(self.contents, other.contents, other.lang == @lang)
303
+ else false
304
+ end
305
+ end
306
+
307
+ def hash
308
+ [@contents, @encoding, @lang].hash
309
+ end
310
+
311
+ # Output literal in N3 format
312
+ def to_n3
313
+ encoding.format_as_n3(self.contents, @lang)
314
+ end
315
+ alias_method :to_ntriples, :to_n3
316
+
317
+ # Output literal in TriX format
318
+ def to_trix
319
+ encoding.format_as_trix(@contents, @lang)
320
+ end
321
+
322
+ # Return content and hash appropriate for encoding in XML
323
+ #
324
+ # ==== Example
325
+ # Encoding.the_null_encoding.xml_args("foo", "en-US") => ["foo", {"xml:lang" => "en-US"}]
326
+ def xml_args
327
+ encoding.xml_args( @contents, @lang)
328
+ end
329
+
330
+ # Is this an XMLLiteral?
331
+ def xmlliteral?
332
+ encoding.is_a?(XMLLiteral)
333
+ end
334
+
335
+ # Output literal contents as a string
336
+ def to_s
337
+ self.contents.to_s
338
+ end
339
+ end
340
+ end
OSZAR »