gkellogg-reddy 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. data/.autotest +2 -0
  2. data/.gitignore +9 -0
  3. data/.gitmodules +3 -0
  4. data/History.txt +66 -0
  5. data/README.rdoc +107 -0
  6. data/Rakefile +96 -0
  7. data/VERSION +1 -0
  8. data/bin/reddy +59 -0
  9. data/lib/reddy.rb +62 -0
  10. data/lib/reddy/bnode.rb +101 -0
  11. data/lib/reddy/conjunctive_graph.rb +47 -0
  12. data/lib/reddy/exceptions.rb +11 -0
  13. data/lib/reddy/graph.rb +327 -0
  14. data/lib/reddy/literal.rb +340 -0
  15. data/lib/reddy/n3_grammar.rb +2171 -0
  16. data/lib/reddy/n3_grammar.treetop +143 -0
  17. data/lib/reddy/n3parser.rb +151 -0
  18. data/lib/reddy/namespace.rb +82 -0
  19. data/lib/reddy/nokogiri_hacks.rb +8 -0
  20. data/lib/reddy/parser.rb +127 -0
  21. data/lib/reddy/rdfaparser.rb +398 -0
  22. data/lib/reddy/rdfxmlparser.rb +529 -0
  23. data/lib/reddy/store/abstract_store.rb +64 -0
  24. data/lib/reddy/store/list_store.rb +61 -0
  25. data/lib/reddy/store/memory_store.rb +349 -0
  26. data/lib/reddy/string_hacks.rb +108 -0
  27. data/lib/reddy/triple.rb +144 -0
  28. data/lib/reddy/uriref.rb +95 -0
  29. data/script/console +10 -0
  30. data/spec/bnode_spec.rb +58 -0
  31. data/spec/conjunctive_graph_spec.rb +59 -0
  32. data/spec/graph_spec.rb +390 -0
  33. data/spec/literal_spec.rb +314 -0
  34. data/spec/matchers.rb +148 -0
  35. data/spec/n3parser_spec.rb +229 -0
  36. data/spec/namespaces_spec.rb +66 -0
  37. data/spec/ntriples/test.nt +78 -0
  38. data/spec/parser_spec.rb +29 -0
  39. data/spec/rdfa-triples/0001.nt +1 -0
  40. data/spec/rdfa-triples/0006.nt +2 -0
  41. data/spec/rdfa-triples/0007.nt +3 -0
  42. data/spec/rdfa-triples/0008.nt +1 -0
  43. data/spec/rdfa-triples/0009.nt +1 -0
  44. data/spec/rdfa-triples/0010.nt +2 -0
  45. data/spec/rdfa-triples/0011.nt +3 -0
  46. data/spec/rdfa-triples/0012.nt +1 -0
  47. data/spec/rdfa-triples/0013.nt +1 -0
  48. data/spec/rdfa-triples/0014.nt +1 -0
  49. data/spec/rdfa-triples/0015.nt +2 -0
  50. data/spec/rdfa-triples/0017.nt +3 -0
  51. data/spec/rdfa-triples/0018.nt +1 -0
  52. data/spec/rdfa-triples/0019.nt +1 -0
  53. data/spec/rdfa-triples/0020.nt +1 -0
  54. data/spec/rdfa-triples/0021.nt +1 -0
  55. data/spec/rdfa-triples/0023.nt +1 -0
  56. data/spec/rdfa-triples/0025.nt +2 -0
  57. data/spec/rdfa-triples/0026.nt +1 -0
  58. data/spec/rdfa-triples/0027.nt +1 -0
  59. data/spec/rdfa-triples/0029.nt +1 -0
  60. data/spec/rdfa-triples/0030.nt +1 -0
  61. data/spec/rdfa-triples/0031.nt +1 -0
  62. data/spec/rdfa-triples/0032.nt +1 -0
  63. data/spec/rdfa-triples/0033.nt +2 -0
  64. data/spec/rdfa-triples/0034.nt +1 -0
  65. data/spec/rdfa-triples/0035.nt +1 -0
  66. data/spec/rdfa-triples/0036.nt +1 -0
  67. data/spec/rdfa-triples/0037.nt +1 -0
  68. data/spec/rdfa-triples/0038.nt +1 -0
  69. data/spec/rdfa-triples/0039.nt +1 -0
  70. data/spec/rdfa-triples/0040.nt +1 -0
  71. data/spec/rdfa-triples/0041.nt +1 -0
  72. data/spec/rdfa-triples/0042.nt +0 -0
  73. data/spec/rdfa-triples/0046.nt +3 -0
  74. data/spec/rdfa-triples/0047.nt +3 -0
  75. data/spec/rdfa-triples/0048.nt +3 -0
  76. data/spec/rdfa-triples/0049.nt +2 -0
  77. data/spec/rdfa-triples/0050.nt +2 -0
  78. data/spec/rdfa-triples/0051.nt +2 -0
  79. data/spec/rdfa-triples/0052.nt +1 -0
  80. data/spec/rdfa-triples/0053.nt +2 -0
  81. data/spec/rdfa-triples/0054.nt +2 -0
  82. data/spec/rdfa-triples/0055.nt +2 -0
  83. data/spec/rdfa-triples/0056.nt +3 -0
  84. data/spec/rdfa-triples/0057.nt +4 -0
  85. data/spec/rdfa-triples/0058.nt +6 -0
  86. data/spec/rdfa-triples/0059.nt +6 -0
  87. data/spec/rdfa-triples/0060.nt +2 -0
  88. data/spec/rdfa-triples/0061.nt +1 -0
  89. data/spec/rdfa-triples/0062.nt +1 -0
  90. data/spec/rdfa-triples/0063.nt +1 -0
  91. data/spec/rdfa-triples/0064.nt +1 -0
  92. data/spec/rdfa-triples/0065.nt +3 -0
  93. data/spec/rdfa-triples/0066.nt +1 -0
  94. data/spec/rdfa-triples/0067.nt +1 -0
  95. data/spec/rdfa-triples/0068.nt +1 -0
  96. data/spec/rdfa-triples/0069.nt +1 -0
  97. data/spec/rdfa-triples/0070.nt +1 -0
  98. data/spec/rdfa-triples/0071.nt +1 -0
  99. data/spec/rdfa-triples/0072.nt +1 -0
  100. data/spec/rdfa-triples/0073.nt +1 -0
  101. data/spec/rdfa-triples/0074.nt +1 -0
  102. data/spec/rdfa-triples/0075.nt +1 -0
  103. data/spec/rdfa-triples/0076.nt +23 -0
  104. data/spec/rdfa-triples/0077.nt +23 -0
  105. data/spec/rdfa-triples/0078.nt +6 -0
  106. data/spec/rdfa-triples/0079.nt +3 -0
  107. data/spec/rdfa-triples/0080.nt +1 -0
  108. data/spec/rdfa-triples/0081.nt +6 -0
  109. data/spec/rdfa-triples/0082.nt +8 -0
  110. data/spec/rdfa-triples/0083.nt +6 -0
  111. data/spec/rdfa-triples/0084.nt +8 -0
  112. data/spec/rdfa-triples/0085.nt +4 -0
  113. data/spec/rdfa-triples/0086.nt +0 -0
  114. data/spec/rdfa-triples/0087.nt +23 -0
  115. data/spec/rdfa-triples/0088.nt +3 -0
  116. data/spec/rdfa-triples/0089.nt +1 -0
  117. data/spec/rdfa-triples/0090.nt +1 -0
  118. data/spec/rdfa-triples/0091.nt +3 -0
  119. data/spec/rdfa-triples/0092.nt +3 -0
  120. data/spec/rdfa-triples/0093.nt +2 -0
  121. data/spec/rdfa-triples/0094.nt +3 -0
  122. data/spec/rdfa-triples/0099.nt +1 -0
  123. data/spec/rdfa-triples/0100.nt +3 -0
  124. data/spec/rdfa-triples/0101.nt +3 -0
  125. data/spec/rdfa-triples/0102.nt +1 -0
  126. data/spec/rdfa-triples/0103.nt +1 -0
  127. data/spec/rdfa-triples/0104.nt +3 -0
  128. data/spec/rdfa-triples/0105.nt +1 -0
  129. data/spec/rdfa-triples/0106.nt +1 -0
  130. data/spec/rdfa-triples/0107.nt +0 -0
  131. data/spec/rdfa-triples/0108.nt +1 -0
  132. data/spec/rdfa-triples/0109.nt +1 -0
  133. data/spec/rdfa-triples/0110.nt +1 -0
  134. data/spec/rdfa-triples/0111.nt +2 -0
  135. data/spec/rdfa-triples/0112.nt +1 -0
  136. data/spec/rdfa-triples/0113.nt +2 -0
  137. data/spec/rdfa-triples/0114.nt +3 -0
  138. data/spec/rdfa-triples/0115.nt +4 -0
  139. data/spec/rdfa-triples/0116.nt +2 -0
  140. data/spec/rdfa-triples/0117.nt +2 -0
  141. data/spec/rdfa-triples/0118.nt +1 -0
  142. data/spec/rdfa-triples/0119.nt +1 -0
  143. data/spec/rdfa-triples/0120.nt +1 -0
  144. data/spec/rdfa-triples/0121.nt +2 -0
  145. data/spec/rdfa-triples/0122.nt +1 -0
  146. data/spec/rdfa-triples/0123.nt +3 -0
  147. data/spec/rdfa-triples/0124.nt +4 -0
  148. data/spec/rdfa-triples/0125.nt +1 -0
  149. data/spec/rdfa-triples/0126.nt +3 -0
  150. data/spec/rdfa-triples/1001.nt +6 -0
  151. data/spec/rdfa_helper.rb +189 -0
  152. data/spec/rdfa_parser_spec.rb +130 -0
  153. data/spec/rdfcore/Manifest.rdf +5395 -0
  154. data/spec/rdfcore/amp-in-url/test001.nt +16 -0
  155. data/spec/rdfcore/amp-in-url/test001.rdf +40 -0
  156. data/spec/rdfcore/datatypes-intensional/test001.nt +18 -0
  157. data/spec/rdfcore/datatypes-intensional/test002.nt +18 -0
  158. data/spec/rdfcore/datatypes/test001.nt +15 -0
  159. data/spec/rdfcore/datatypes/test001.rdf +29 -0
  160. data/spec/rdfcore/datatypes/test002.nt +14 -0
  161. data/spec/rdfcore/datatypes/test002.rdf +27 -0
  162. data/spec/rdfcore/datatypes/test002b.nt +17 -0
  163. data/spec/rdfcore/datatypes/test003a.nt +16 -0
  164. data/spec/rdfcore/datatypes/test003b.nt +16 -0
  165. data/spec/rdfcore/datatypes/test005a.nt +16 -0
  166. data/spec/rdfcore/datatypes/test005b.nt +16 -0
  167. data/spec/rdfcore/datatypes/test006.nt +17 -0
  168. data/spec/rdfcore/datatypes/test008a.nt +15 -0
  169. data/spec/rdfcore/datatypes/test008b.nt +15 -0
  170. data/spec/rdfcore/datatypes/test009a.nt +15 -0
  171. data/spec/rdfcore/datatypes/test009b.nt +15 -0
  172. data/spec/rdfcore/datatypes/test010.nt +17 -0
  173. data/spec/rdfcore/datatypes/test011a.nt +17 -0
  174. data/spec/rdfcore/datatypes/test011b.nt +17 -0
  175. data/spec/rdfcore/horst-01/test001.rdf +38 -0
  176. data/spec/rdfcore/horst-01/test002.rdf +39 -0
  177. data/spec/rdfcore/horst-01/test003.rdf +40 -0
  178. data/spec/rdfcore/horst-01/test004.rdf +42 -0
  179. data/spec/rdfcore/pfps-10/test001a.nt +14 -0
  180. data/spec/rdfcore/pfps-10/test001b.nt +15 -0
  181. data/spec/rdfcore/rdf-charmod-literals/test001.nt +15 -0
  182. data/spec/rdfcore/rdf-charmod-literals/test001.rdf +34 -0
  183. data/spec/rdfcore/rdf-charmod-uris/test001.nt +14 -0
  184. data/spec/rdfcore/rdf-charmod-uris/test001.rdf +34 -0
  185. data/spec/rdfcore/rdf-charmod-uris/test002.nt +15 -0
  186. data/spec/rdfcore/rdf-charmod-uris/test002.rdf +33 -0
  187. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error001.rdf +27 -0
  188. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error002.rdf +34 -0
  189. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.nt +17 -0
  190. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.rdf +27 -0
  191. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.nt +19 -0
  192. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.rdf +37 -0
  193. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.nt +18 -0
  194. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.rdf +29 -0
  195. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.nt +29 -0
  196. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.rdf +33 -0
  197. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.nt +40 -0
  198. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.rdf +28 -0
  199. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.nt +20 -0
  200. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.rdf +32 -0
  201. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.nt +15 -0
  202. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.rdf +28 -0
  203. data/spec/rdfcore/rdf-element-not-mandatory/test001.nt +10 -0
  204. data/spec/rdfcore/rdf-element-not-mandatory/test001.rdf +14 -0
  205. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.nt +14 -0
  206. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.rdf +35 -0
  207. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.nt +14 -0
  208. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.rdf +35 -0
  209. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.nt +14 -0
  210. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.rdf +34 -0
  211. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.nt +15 -0
  212. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.rdf +40 -0
  213. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.nt +14 -0
  214. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.rdf +32 -0
  215. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.nt +14 -0
  216. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.rdf +32 -0
  217. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.nt +14 -0
  218. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.rdf +38 -0
  219. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.nt +15 -0
  220. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.rdf +40 -0
  221. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.nt +15 -0
  222. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.rdf +40 -0
  223. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.nt +15 -0
  224. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.rdf +40 -0
  225. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.nt +15 -0
  226. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.rdf +42 -0
  227. data/spec/rdfcore/rdfms-abouteach/error001.rdf +35 -0
  228. data/spec/rdfcore/rdfms-abouteach/error002.rdf +35 -0
  229. data/spec/rdfcore/rdfms-difference-between-ID-and-about/error1.rdf +25 -0
  230. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.nt +14 -0
  231. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.rdf +22 -0
  232. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.nt +14 -0
  233. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.rdf +22 -0
  234. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.nt +14 -0
  235. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.rdf +22 -0
  236. data/spec/rdfcore/rdfms-duplicate-member-props/test001.nt +17 -0
  237. data/spec/rdfcore/rdfms-duplicate-member-props/test001.rdf +30 -0
  238. data/spec/rdfcore/rdfms-empty-property-elements/error001.rdf +33 -0
  239. data/spec/rdfcore/rdfms-empty-property-elements/error002.rdf +33 -0
  240. data/spec/rdfcore/rdfms-empty-property-elements/error003.rdf +39 -0
  241. data/spec/rdfcore/rdfms-empty-property-elements/test001.nt +14 -0
  242. data/spec/rdfcore/rdfms-empty-property-elements/test001.rdf +33 -0
  243. data/spec/rdfcore/rdfms-empty-property-elements/test002.nt +14 -0
  244. data/spec/rdfcore/rdfms-empty-property-elements/test002.rdf +31 -0
  245. data/spec/rdfcore/rdfms-empty-property-elements/test003.nt +14 -0
  246. data/spec/rdfcore/rdfms-empty-property-elements/test003.rdf +32 -0
  247. data/spec/rdfcore/rdfms-empty-property-elements/test004.nt +14 -0
  248. data/spec/rdfcore/rdfms-empty-property-elements/test004.rdf +32 -0
  249. data/spec/rdfcore/rdfms-empty-property-elements/test005.nt +18 -0
  250. data/spec/rdfcore/rdfms-empty-property-elements/test005.rdf +32 -0
  251. data/spec/rdfcore/rdfms-empty-property-elements/test006.nt +18 -0
  252. data/spec/rdfcore/rdfms-empty-property-elements/test006.rdf +32 -0
  253. data/spec/rdfcore/rdfms-empty-property-elements/test007.nt +14 -0
  254. data/spec/rdfcore/rdfms-empty-property-elements/test007.rdf +32 -0
  255. data/spec/rdfcore/rdfms-empty-property-elements/test008.nt +14 -0
  256. data/spec/rdfcore/rdfms-empty-property-elements/test008.rdf +31 -0
  257. data/spec/rdfcore/rdfms-empty-property-elements/test009.nt +14 -0
  258. data/spec/rdfcore/rdfms-empty-property-elements/test009.rdf +32 -0
  259. data/spec/rdfcore/rdfms-empty-property-elements/test010.nt +14 -0
  260. data/spec/rdfcore/rdfms-empty-property-elements/test010.rdf +31 -0
  261. data/spec/rdfcore/rdfms-empty-property-elements/test011.nt +18 -0
  262. data/spec/rdfcore/rdfms-empty-property-elements/test011.rdf +30 -0
  263. data/spec/rdfcore/rdfms-empty-property-elements/test012.nt +18 -0
  264. data/spec/rdfcore/rdfms-empty-property-elements/test012.rdf +30 -0
  265. data/spec/rdfcore/rdfms-empty-property-elements/test013.nt +15 -0
  266. data/spec/rdfcore/rdfms-empty-property-elements/test013.rdf +35 -0
  267. data/spec/rdfcore/rdfms-empty-property-elements/test014.nt +15 -0
  268. data/spec/rdfcore/rdfms-empty-property-elements/test014.rdf +34 -0
  269. data/spec/rdfcore/rdfms-empty-property-elements/test015.nt +15 -0
  270. data/spec/rdfcore/rdfms-empty-property-elements/test015.rdf +38 -0
  271. data/spec/rdfcore/rdfms-empty-property-elements/test016.nt +14 -0
  272. data/spec/rdfcore/rdfms-empty-property-elements/test016.rdf +31 -0
  273. data/spec/rdfcore/rdfms-empty-property-elements/test017.nt +14 -0
  274. data/spec/rdfcore/rdfms-empty-property-elements/test017.rdf +38 -0
  275. data/spec/rdfcore/rdfms-identity-anon-resources/test001.nt +14 -0
  276. data/spec/rdfcore/rdfms-identity-anon-resources/test001.rdf +33 -0
  277. data/spec/rdfcore/rdfms-identity-anon-resources/test002.nt +15 -0
  278. data/spec/rdfcore/rdfms-identity-anon-resources/test002.rdf +33 -0
  279. data/spec/rdfcore/rdfms-identity-anon-resources/test003.nt +14 -0
  280. data/spec/rdfcore/rdfms-identity-anon-resources/test003.rdf +31 -0
  281. data/spec/rdfcore/rdfms-identity-anon-resources/test004.nt +15 -0
  282. data/spec/rdfcore/rdfms-identity-anon-resources/test004.rdf +33 -0
  283. data/spec/rdfcore/rdfms-identity-anon-resources/test005.nt +14 -0
  284. data/spec/rdfcore/rdfms-identity-anon-resources/test005.rdf +31 -0
  285. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.nt +19 -0
  286. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.rdf +29 -0
  287. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.nt +15 -0
  288. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.rdf +29 -0
  289. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.nt +18 -0
  290. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.rdf +29 -0
  291. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.nt +19 -0
  292. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.rdf +29 -0
  293. data/spec/rdfcore/rdfms-para196/test001.nt +17 -0
  294. data/spec/rdfcore/rdfms-para196/test001.rdf +35 -0
  295. data/spec/rdfcore/rdfms-rdf-id/error001.rdf +26 -0
  296. data/spec/rdfcore/rdfms-rdf-id/error002.rdf +26 -0
  297. data/spec/rdfcore/rdfms-rdf-id/error003.rdf +29 -0
  298. data/spec/rdfcore/rdfms-rdf-id/error004.rdf +27 -0
  299. data/spec/rdfcore/rdfms-rdf-id/error005.rdf +31 -0
  300. data/spec/rdfcore/rdfms-rdf-id/error006.rdf +26 -0
  301. data/spec/rdfcore/rdfms-rdf-id/error007.rdf +29 -0
  302. data/spec/rdfcore/rdfms-rdf-names-use/error-001.rdf +23 -0
  303. data/spec/rdfcore/rdfms-rdf-names-use/error-002.rdf +23 -0
  304. data/spec/rdfcore/rdfms-rdf-names-use/error-003.rdf +23 -0
  305. data/spec/rdfcore/rdfms-rdf-names-use/error-004.rdf +23 -0
  306. data/spec/rdfcore/rdfms-rdf-names-use/error-005.rdf +23 -0
  307. data/spec/rdfcore/rdfms-rdf-names-use/error-006.rdf +23 -0
  308. data/spec/rdfcore/rdfms-rdf-names-use/error-007.rdf +23 -0
  309. data/spec/rdfcore/rdfms-rdf-names-use/error-008.rdf +23 -0
  310. data/spec/rdfcore/rdfms-rdf-names-use/error-009.rdf +23 -0
  311. data/spec/rdfcore/rdfms-rdf-names-use/error-010.rdf +23 -0
  312. data/spec/rdfcore/rdfms-rdf-names-use/error-011.rdf +25 -0
  313. data/spec/rdfcore/rdfms-rdf-names-use/error-012.rdf +25 -0
  314. data/spec/rdfcore/rdfms-rdf-names-use/error-013.rdf +25 -0
  315. data/spec/rdfcore/rdfms-rdf-names-use/error-014.rdf +25 -0
  316. data/spec/rdfcore/rdfms-rdf-names-use/error-015.rdf +25 -0
  317. data/spec/rdfcore/rdfms-rdf-names-use/error-016.rdf +25 -0
  318. data/spec/rdfcore/rdfms-rdf-names-use/error-017.rdf +25 -0
  319. data/spec/rdfcore/rdfms-rdf-names-use/error-018.rdf +25 -0
  320. data/spec/rdfcore/rdfms-rdf-names-use/error-019.rdf +25 -0
  321. data/spec/rdfcore/rdfms-rdf-names-use/error-020.rdf +25 -0
  322. data/spec/rdfcore/rdfms-rdf-names-use/test-001.nt +1 -0
  323. data/spec/rdfcore/rdfms-rdf-names-use/test-001.rdf +23 -0
  324. data/spec/rdfcore/rdfms-rdf-names-use/test-002.nt +1 -0
  325. data/spec/rdfcore/rdfms-rdf-names-use/test-002.rdf +23 -0
  326. data/spec/rdfcore/rdfms-rdf-names-use/test-003.nt +1 -0
  327. data/spec/rdfcore/rdfms-rdf-names-use/test-003.rdf +23 -0
  328. data/spec/rdfcore/rdfms-rdf-names-use/test-004.nt +1 -0
  329. data/spec/rdfcore/rdfms-rdf-names-use/test-004.rdf +23 -0
  330. data/spec/rdfcore/rdfms-rdf-names-use/test-005.nt +1 -0
  331. data/spec/rdfcore/rdfms-rdf-names-use/test-005.rdf +23 -0
  332. data/spec/rdfcore/rdfms-rdf-names-use/test-006.nt +1 -0
  333. data/spec/rdfcore/rdfms-rdf-names-use/test-006.rdf +23 -0
  334. data/spec/rdfcore/rdfms-rdf-names-use/test-007.nt +1 -0
  335. data/spec/rdfcore/rdfms-rdf-names-use/test-007.rdf +23 -0
  336. data/spec/rdfcore/rdfms-rdf-names-use/test-008.nt +1 -0
  337. data/spec/rdfcore/rdfms-rdf-names-use/test-008.rdf +23 -0
  338. data/spec/rdfcore/rdfms-rdf-names-use/test-009.nt +1 -0
  339. data/spec/rdfcore/rdfms-rdf-names-use/test-009.rdf +23 -0
  340. data/spec/rdfcore/rdfms-rdf-names-use/test-010.nt +1 -0
  341. data/spec/rdfcore/rdfms-rdf-names-use/test-010.rdf +23 -0
  342. data/spec/rdfcore/rdfms-rdf-names-use/test-011.nt +1 -0
  343. data/spec/rdfcore/rdfms-rdf-names-use/test-011.rdf +23 -0
  344. data/spec/rdfcore/rdfms-rdf-names-use/test-012.nt +1 -0
  345. data/spec/rdfcore/rdfms-rdf-names-use/test-012.rdf +23 -0
  346. data/spec/rdfcore/rdfms-rdf-names-use/test-013.nt +1 -0
  347. data/spec/rdfcore/rdfms-rdf-names-use/test-013.rdf +23 -0
  348. data/spec/rdfcore/rdfms-rdf-names-use/test-014.nt +1 -0
  349. data/spec/rdfcore/rdfms-rdf-names-use/test-014.rdf +23 -0
  350. data/spec/rdfcore/rdfms-rdf-names-use/test-015.nt +1 -0
  351. data/spec/rdfcore/rdfms-rdf-names-use/test-015.rdf +23 -0
  352. data/spec/rdfcore/rdfms-rdf-names-use/test-016.nt +1 -0
  353. data/spec/rdfcore/rdfms-rdf-names-use/test-016.rdf +23 -0
  354. data/spec/rdfcore/rdfms-rdf-names-use/test-017.nt +1 -0
  355. data/spec/rdfcore/rdfms-rdf-names-use/test-017.rdf +25 -0
  356. data/spec/rdfcore/rdfms-rdf-names-use/test-018.nt +1 -0
  357. data/spec/rdfcore/rdfms-rdf-names-use/test-018.rdf +25 -0
  358. data/spec/rdfcore/rdfms-rdf-names-use/test-019.nt +1 -0
  359. data/spec/rdfcore/rdfms-rdf-names-use/test-019.rdf +25 -0
  360. data/spec/rdfcore/rdfms-rdf-names-use/test-020.nt +1 -0
  361. data/spec/rdfcore/rdfms-rdf-names-use/test-020.rdf +25 -0
  362. data/spec/rdfcore/rdfms-rdf-names-use/test-021.nt +1 -0
  363. data/spec/rdfcore/rdfms-rdf-names-use/test-021.rdf +25 -0
  364. data/spec/rdfcore/rdfms-rdf-names-use/test-022.nt +1 -0
  365. data/spec/rdfcore/rdfms-rdf-names-use/test-022.rdf +25 -0
  366. data/spec/rdfcore/rdfms-rdf-names-use/test-023.nt +1 -0
  367. data/spec/rdfcore/rdfms-rdf-names-use/test-023.rdf +25 -0
  368. data/spec/rdfcore/rdfms-rdf-names-use/test-024.nt +1 -0
  369. data/spec/rdfcore/rdfms-rdf-names-use/test-024.rdf +25 -0
  370. data/spec/rdfcore/rdfms-rdf-names-use/test-025.nt +1 -0
  371. data/spec/rdfcore/rdfms-rdf-names-use/test-025.rdf +25 -0
  372. data/spec/rdfcore/rdfms-rdf-names-use/test-026.nt +1 -0
  373. data/spec/rdfcore/rdfms-rdf-names-use/test-026.rdf +25 -0
  374. data/spec/rdfcore/rdfms-rdf-names-use/test-027.nt +1 -0
  375. data/spec/rdfcore/rdfms-rdf-names-use/test-027.rdf +25 -0
  376. data/spec/rdfcore/rdfms-rdf-names-use/test-028.nt +1 -0
  377. data/spec/rdfcore/rdfms-rdf-names-use/test-028.rdf +25 -0
  378. data/spec/rdfcore/rdfms-rdf-names-use/test-029.nt +1 -0
  379. data/spec/rdfcore/rdfms-rdf-names-use/test-029.rdf +25 -0
  380. data/spec/rdfcore/rdfms-rdf-names-use/test-030.nt +1 -0
  381. data/spec/rdfcore/rdfms-rdf-names-use/test-030.rdf +25 -0
  382. data/spec/rdfcore/rdfms-rdf-names-use/test-031.nt +1 -0
  383. data/spec/rdfcore/rdfms-rdf-names-use/test-031.rdf +25 -0
  384. data/spec/rdfcore/rdfms-rdf-names-use/test-032.nt +1 -0
  385. data/spec/rdfcore/rdfms-rdf-names-use/test-032.rdf +24 -0
  386. data/spec/rdfcore/rdfms-rdf-names-use/test-033.nt +1 -0
  387. data/spec/rdfcore/rdfms-rdf-names-use/test-033.rdf +24 -0
  388. data/spec/rdfcore/rdfms-rdf-names-use/test-034.nt +1 -0
  389. data/spec/rdfcore/rdfms-rdf-names-use/test-034.rdf +24 -0
  390. data/spec/rdfcore/rdfms-rdf-names-use/test-035.nt +1 -0
  391. data/spec/rdfcore/rdfms-rdf-names-use/test-035.rdf +24 -0
  392. data/spec/rdfcore/rdfms-rdf-names-use/test-036.nt +1 -0
  393. data/spec/rdfcore/rdfms-rdf-names-use/test-036.rdf +24 -0
  394. data/spec/rdfcore/rdfms-rdf-names-use/test-037.nt +1 -0
  395. data/spec/rdfcore/rdfms-rdf-names-use/test-037.rdf +24 -0
  396. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.nt +1 -0
  397. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.rdf +23 -0
  398. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.nt +1 -0
  399. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.rdf +25 -0
  400. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.nt +1 -0
  401. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.rdf +24 -0
  402. data/spec/rdfcore/rdfms-reification-required/test001.nt +15 -0
  403. data/spec/rdfcore/rdfms-reification-required/test001.rdf +29 -0
  404. data/spec/rdfcore/rdfms-seq-representation/empty.nt +13 -0
  405. data/spec/rdfcore/rdfms-seq-representation/test001.nt +19 -0
  406. data/spec/rdfcore/rdfms-seq-representation/test001.rdf +33 -0
  407. data/spec/rdfcore/rdfms-seq-representation/test002.nt +14 -0
  408. data/spec/rdfcore/rdfms-seq-representation/test003a.nt +14 -0
  409. data/spec/rdfcore/rdfms-seq-representation/test003b.nt +14 -0
  410. data/spec/rdfcore/rdfms-seq-representation/test004.nt +14 -0
  411. data/spec/rdfcore/rdfms-syntax-incomplete/error001.rdf +26 -0
  412. data/spec/rdfcore/rdfms-syntax-incomplete/error002.rdf +26 -0
  413. data/spec/rdfcore/rdfms-syntax-incomplete/error003.rdf +29 -0
  414. data/spec/rdfcore/rdfms-syntax-incomplete/error004.rdf +25 -0
  415. data/spec/rdfcore/rdfms-syntax-incomplete/error005.rdf +25 -0
  416. data/spec/rdfcore/rdfms-syntax-incomplete/error006.rdf +28 -0
  417. data/spec/rdfcore/rdfms-syntax-incomplete/test001.nt +14 -0
  418. data/spec/rdfcore/rdfms-syntax-incomplete/test001.rdf +28 -0
  419. data/spec/rdfcore/rdfms-syntax-incomplete/test002.nt +19 -0
  420. data/spec/rdfcore/rdfms-syntax-incomplete/test002.rdf +38 -0
  421. data/spec/rdfcore/rdfms-syntax-incomplete/test003.nt +17 -0
  422. data/spec/rdfcore/rdfms-syntax-incomplete/test003.rdf +28 -0
  423. data/spec/rdfcore/rdfms-syntax-incomplete/test004.nt +21 -0
  424. data/spec/rdfcore/rdfms-syntax-incomplete/test004.rdf +36 -0
  425. data/spec/rdfcore/rdfms-uri-substructure/error001.nt +18 -0
  426. data/spec/rdfcore/rdfms-uri-substructure/test001.nt +17 -0
  427. data/spec/rdfcore/rdfms-uri-substructure/test001.rdf +29 -0
  428. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.nt +13 -0
  429. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.rdf +33 -0
  430. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.nt +14 -0
  431. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.rdf +47 -0
  432. data/spec/rdfcore/rdfms-xmllang/test001.nt +14 -0
  433. data/spec/rdfcore/rdfms-xmllang/test001.rdf +30 -0
  434. data/spec/rdfcore/rdfms-xmllang/test002.nt +14 -0
  435. data/spec/rdfcore/rdfms-xmllang/test002.rdf +29 -0
  436. data/spec/rdfcore/rdfms-xmllang/test003.nt +14 -0
  437. data/spec/rdfcore/rdfms-xmllang/test003.rdf +28 -0
  438. data/spec/rdfcore/rdfms-xmllang/test004.nt +14 -0
  439. data/spec/rdfcore/rdfms-xmllang/test004.rdf +28 -0
  440. data/spec/rdfcore/rdfms-xmllang/test005.nt +14 -0
  441. data/spec/rdfcore/rdfms-xmllang/test005.rdf +28 -0
  442. data/spec/rdfcore/rdfms-xmllang/test006.nt +14 -0
  443. data/spec/rdfcore/rdfms-xmllang/test006.rdf +29 -0
  444. data/spec/rdfcore/rdfms-xmllang/test007a.nt +14 -0
  445. data/spec/rdfcore/rdfms-xmllang/test007b.nt +14 -0
  446. data/spec/rdfcore/rdfms-xmllang/test007c.nt +14 -0
  447. data/spec/rdfcore/rdfs-container-membership-superProperty/not1C.rdf +13 -0
  448. data/spec/rdfcore/rdfs-container-membership-superProperty/not1P.rdf +14 -0
  449. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions005.rdf +28 -0
  450. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions006.rdf +28 -0
  451. data/spec/rdfcore/rdfs-domain-and-range/premises005.rdf +32 -0
  452. data/spec/rdfcore/rdfs-domain-and-range/premises006.rdf +32 -0
  453. data/spec/rdfcore/rdfs-domain-and-range/test001.nt +16 -0
  454. data/spec/rdfcore/rdfs-domain-and-range/test001.rdf +29 -0
  455. data/spec/rdfcore/rdfs-domain-and-range/test002.nt +16 -0
  456. data/spec/rdfcore/rdfs-domain-and-range/test002.rdf +29 -0
  457. data/spec/rdfcore/rdfs-entailment/test001.nt +16 -0
  458. data/spec/rdfcore/rdfs-entailment/test002.nt +15 -0
  459. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.nt +18 -0
  460. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.rdf +37 -0
  461. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.nt +18 -0
  462. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.rdf +40 -0
  463. data/spec/rdfcore/rdfs-subClassOf-a-Property/test001.nt +15 -0
  464. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test001.nt +24 -0
  465. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test002.nt +21 -0
  466. data/spec/rdfcore/statement-entailment/test001a.nt +12 -0
  467. data/spec/rdfcore/statement-entailment/test001b.nt +2 -0
  468. data/spec/rdfcore/statement-entailment/test002a.nt +2 -0
  469. data/spec/rdfcore/statement-entailment/test002b.nt +5 -0
  470. data/spec/rdfcore/tex-01/test001.rdf +34 -0
  471. data/spec/rdfcore/tex-01/test002.rdf +33 -0
  472. data/spec/rdfcore/unrecognised-xml-attributes/test001.nt +15 -0
  473. data/spec/rdfcore/unrecognised-xml-attributes/test001.rdf +31 -0
  474. data/spec/rdfcore/unrecognised-xml-attributes/test002.nt +14 -0
  475. data/spec/rdfcore/unrecognised-xml-attributes/test002.rdf +32 -0
  476. data/spec/rdfcore/xml-canon/test001.nt +16 -0
  477. data/spec/rdfcore/xml-canon/test001.rdf +28 -0
  478. data/spec/rdfcore/xmlbase/test001.nt +14 -0
  479. data/spec/rdfcore/xmlbase/test001.rdf +27 -0
  480. data/spec/rdfcore/xmlbase/test002.nt +14 -0
  481. data/spec/rdfcore/xmlbase/test002.rdf +28 -0
  482. data/spec/rdfcore/xmlbase/test003.nt +14 -0
  483. data/spec/rdfcore/xmlbase/test003.rdf +25 -0
  484. data/spec/rdfcore/xmlbase/test004.nt +18 -0
  485. data/spec/rdfcore/xmlbase/test004.rdf +27 -0
  486. data/spec/rdfcore/xmlbase/test006.nt +15 -0
  487. data/spec/rdfcore/xmlbase/test006.rdf +26 -0
  488. data/spec/rdfcore/xmlbase/test007.nt +14 -0
  489. data/spec/rdfcore/xmlbase/test007.rdf +25 -0
  490. data/spec/rdfcore/xmlbase/test008.nt +14 -0
  491. data/spec/rdfcore/xmlbase/test008.rdf +25 -0
  492. data/spec/rdfcore/xmlbase/test009.nt +14 -0
  493. data/spec/rdfcore/xmlbase/test009.rdf +26 -0
  494. data/spec/rdfcore/xmlbase/test010.nt +14 -0
  495. data/spec/rdfcore/xmlbase/test010.rdf +26 -0
  496. data/spec/rdfcore/xmlbase/test011.nt +14 -0
  497. data/spec/rdfcore/xmlbase/test011.rdf +27 -0
  498. data/spec/rdfcore/xmlbase/test013.nt +15 -0
  499. data/spec/rdfcore/xmlbase/test013.rdf +28 -0
  500. data/spec/rdfcore/xmlbase/test014.nt +15 -0
  501. data/spec/rdfcore/xmlbase/test014.rdf +28 -0
  502. data/spec/rdfcore/xmlsch-02/test001.rdf +34 -0
  503. data/spec/rdfcore/xmlsch-02/test002.rdf +34 -0
  504. data/spec/rdfcore/xmlsch-02/test003.rdf +37 -0
  505. data/spec/rdfcore_helper.rb +137 -0
  506. data/spec/rdfxml_spec.rb +349 -0
  507. data/spec/spec.opts +1 -0
  508. data/spec/spec_helper.rb +23 -0
  509. data/spec/store_spec.rb +205 -0
  510. data/spec/string_hacks_spec.rb +21 -0
  511. data/spec/triple_spec.rb +172 -0
  512. data/spec/uriref_spec.rb +117 -0
  513. data/test/longtests_spec.rb +25 -0
  514. data/test/n3_tests/lcsh/sh85062913.n3 +41 -0
  515. data/test/n3_tests/lcsh/sh85062913.nt +21 -0
  516. data/test/n3_tests/lcsh/sh85082139.n3 +157 -0
  517. data/test/n3_tests/lcsh/sh85082139.nt +79 -0
  518. data/test/n3_tests/lcsh/sh85118553.n3 +123 -0
  519. data/test/n3_tests/lcsh/sh85118553.nt +63 -0
  520. data/test/n3_tests/misc/on_now-01.n3 +30 -0
  521. data/test/n3_tests/misc/on_now-01.nt +15 -0
  522. data/test/n3_tests/n3p/simple-01.n3 +1 -0
  523. data/test/n3_tests/n3p/simple-01.nt +0 -0
  524. data/test/n3_tests/n3p/simple-02.n3 +4 -0
  525. data/test/n3_tests/n3p/simple-02.nt +0 -0
  526. data/test/n3_tests/n3p/simple-03.n3 +5 -0
  527. data/test/n3_tests/n3p/simple-03.nt +1 -0
  528. data/test/n3_tests/n3p/simple-04.n3 +6 -0
  529. data/test/n3_tests/n3p/simple-04.nt +3 -0
  530. data/test/n3_tests/n3p/simple-05.n3 +7 -0
  531. data/test/n3_tests/n3p/simple-05.nt +2 -0
  532. data/test/n3_tests/n3p/simple-06.n3 +6 -0
  533. data/test/n3_tests/n3p/simple-06.nt +4 -0
  534. data/test/n3_tests/n3p/simple-07.n3 +7 -0
  535. data/test/n3_tests/n3p/simple-07.nt +6 -0
  536. data/test/perf_test/test.rb +11 -0
  537. data/test/perf_test/tommorris.rdf +2267 -0
  538. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.nt +24 -0
  539. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.rdf +46 -0
  540. data/test/rdf_tests/tm_001.nt +1 -0
  541. data/test/rdf_tests/tm_001.rdf +7 -0
  542. data/test/rdf_tests/xml-literal-mixed.nt +7 -0
  543. data/test/rdf_tests/xml-literal-mixed.rdf +15 -0
  544. data/test/xml.rdf +6 -0
  545. metadata +698 -0
@@ -0,0 +1,47 @@
1
+ require File.join(File.dirname(__FILE__), "graph.rb")
2
+
3
+ module Reddy
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 Reddy
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,327 @@
1
+ module Reddy
2
+ # A simple graph to hold triples.
3
+ #
4
+ # Graphs store triples, and the namespaces associated with those triples, where defined
5
+ class Graph
6
+ attr_reader :triples
7
+ attr_reader :nsbinding
8
+ attr_reader :identifier
9
+ attr_reader :store
10
+
11
+ # Create a Graph with the given store and identifier.
12
+ #
13
+ # The constructor accepts a _store_ option,
14
+ # that will be used to store the graph data.
15
+ #
16
+ # Stores can be context-aware or unaware. Unaware stores take up
17
+ # (some) less space but cannot support features that require
18
+ # context, such as true merging/demerging of sub-graphs and
19
+ # provenance.
20
+ #
21
+ # The Graph constructor can take an identifier which identifies the Graph
22
+ # by name. If none is given, the graph is assigned a BNode for it's identifier.
23
+ # For more on named graphs, see: http://en.wikipedia.org/wiki/RDFLib
24
+ #
25
+ # @param [Hash] options:: Options
26
+ # <em>options[:store]</em>:: storage, defaults to a new ListStore instance
27
+ # <em>options[:identifier]</em>:: Identifier for this graph, Literal, BNode or URIRef
28
+ #
29
+ # @author Gregg Kellogg
30
+ def initialize(options = {})
31
+ @nsbinding = {}
32
+
33
+ # Instantiate triple store
34
+ @store = case options[:store]
35
+ when AbstractStore then options[:store]
36
+ when :list_store then ListStore.new
37
+ when :memory_store then MemoryStore.new
38
+ else MemoryStore.new
39
+ end
40
+
41
+ @identifier = options[:identifier] || BNode.new
42
+ end
43
+
44
+ def inspect
45
+ "Graph[id=#{identifier},store=#{store.inspect}]"
46
+ end
47
+
48
+ def context_aware?; @context_aware; end
49
+
50
+ # Data Store interface
51
+ def nsbinding; @store.nsbinding; end
52
+
53
+ # Destroy the store identified by _configuration_ if supported
54
+ def destroy(configuration = nil)
55
+ @store.destroy(configuration)
56
+ self.freeze
57
+ end
58
+
59
+ # Commit changes to graph
60
+ def commit; @store.commit; end
61
+
62
+ # Rollback active transactions
63
+ def rollback; @store.rollback; end
64
+
65
+ # Open the graph store
66
+ #
67
+ # Might be necessary for stores that require opening a connection to a
68
+ # database or acquiring some resource.
69
+ def open(configuration, create=false)
70
+ @store.open(configuration, create)
71
+ end
72
+
73
+ # Close the graph store
74
+ #
75
+ # Might be necessary for stores that require closing a connection to a
76
+ # database or releasing some resource.
77
+ def close(commit_pending_transaction=false)
78
+ @store.open(commit_pending_transaction)
79
+ end
80
+
81
+ ##
82
+ # Exports the graph to RDF in N-Triples form.
83
+ #
84
+ # ==== Example
85
+ # 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
86
+ #
87
+ # @return [String]:: The graph in N-Triples.
88
+ #
89
+ # @author Tom Morris
90
+ def to_ntriples
91
+ triples.collect do |t|
92
+ t.to_ntriples
93
+ end * "\n" + "\n"
94
+ end
95
+
96
+ # Output graph using to_ntriples
97
+ def to_s; self.to_ntriples; end
98
+
99
+ ##
100
+ # Exports the graph to RDF in RDF/XML form.
101
+ #
102
+ # @return [String]:: The RDF/XML graph
103
+ #
104
+ # @author Gregg Kellogg
105
+ def to_rdfxml
106
+ replace_text = {}
107
+ rdfxml = ""
108
+ xml = builder = Builder::XmlMarkup.new(:target => rdfxml, :indent => 2)
109
+
110
+ extended_bindings = nsbinding.merge(
111
+ "rdf" => RDF_NS,
112
+ "rdfs" => RDFS_NS,
113
+ "xhv" => XHV_NS,
114
+ "xml" => XML_NS
115
+ )
116
+ rdf_attrs = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.xmlns_attr => ns.uri.to_s)}
117
+ uri_bindings = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.uri.to_s => ns.prefix)}
118
+ xml.instruct!
119
+ xml.rdf(:RDF, rdf_attrs) do
120
+ # Add statements for each subject
121
+ subjects.each do |s|
122
+ xml.rdf(:Description, (s.is_a?(BNode) ? "rdf:nodeID" : "rdf:about") => s) do
123
+ triples(Triple.new(s, nil, nil)) do |triple, context|
124
+ xml_args = triple.object.xml_args
125
+ if triple.object.is_a?(Literal) && triple.object.xmlliteral?
126
+ replace_text["__replace_with_#{triple.object.object_id}__"] = xml_args[0]
127
+ xml_args[0] = "__replace_with_#{triple.object.object_id}__"
128
+ end
129
+ xml.tag!(triple.predicate.to_qname(uri_bindings), *xml_args)
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ # Perform literal substitutions
136
+ replace_text.each_pair do |match, value|
137
+ rdfxml.sub!(match, value)
138
+ end
139
+
140
+ rdfxml
141
+ end
142
+
143
+ ##
144
+ # Bind a namespace to the graph.
145
+ #
146
+ # ==== Example
147
+ # g = Graph.new; g.bind(Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")) # => binds the Foaf namespace to g
148
+ #
149
+ # @param [String] namespace:: the namespace to bind
150
+ # @return [Namespace]:: The newly bound or pre-existing namespace.
151
+ def bind(namespace)
152
+ raise GraphException, "Can't bind #{namespace.inspect} as namespace" unless namespace.is_a?(Namespace)
153
+ @store.bind(namespace)
154
+ end
155
+
156
+ # Namespace for prefix
157
+ def namespace(prefix); @store.namespace(prefix); end
158
+
159
+ # Prefix for namespace
160
+ def prefix(namespace); @store.prefix(namespace); end
161
+
162
+ # Number of Triples in the graph
163
+ def size; @store.size(self); end
164
+
165
+ # List of distinct subjects in graph
166
+ def subjects; @store.subjects(self); end
167
+
168
+ # List of distinct predicates in graph
169
+ def predicates; @store.predicates(self); end
170
+
171
+ # List of distinct objects in graph
172
+ def objects; @store.objects(self); end
173
+
174
+ # Indexed statement in serialized graph triples. Equivalent to graph.triples[item]
175
+ def [] (item); @store.item(item, self); end
176
+
177
+ # Adds a triple to a graph directly from the intended subject, predicate, and object.
178
+ #
179
+ # ==== Example
180
+ # 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
181
+ #
182
+ # @param [URIRef, BNode] subject:: the subject of the triple
183
+ # @param [URIRef] predicate:: the predicate of the triple
184
+ # @param [URIRef, BNode, Literal] object:: the object of the triple
185
+ # @return [Graph]:: Returns the graph
186
+ # @raise [Error]:: Checks parameter types and raises if they are incorrect.
187
+ def add_triple(subject, predicate, object)
188
+ self.add(Triple.new(subject, predicate, object))
189
+ self
190
+ end
191
+
192
+ ##
193
+ # Adds an more extant triples to a graph. Delegates to Store.
194
+ #
195
+ # ==== Example
196
+ # g = Graph.new;
197
+ # t = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
198
+ # g << t
199
+ #
200
+ # @param [Triple] t:: the triple to be added to the graph
201
+ # @return [Graph]:: Returns the graph
202
+ def << (triple)
203
+ @store.add(triple, self)
204
+ self
205
+ end
206
+
207
+ ##
208
+ # Adds one or more extant triples to a graph. Delegates to Store.
209
+ #
210
+ # ==== Example
211
+ # g = Graph.new;
212
+ # t1 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
213
+ # t2 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
214
+ # g.add(t1, t2, ...)
215
+ #
216
+ # @param [Triple] triples:: one or more triples. Last element may be a hash for options
217
+ # <em>options[:context]</em>:: Graph context in which to deposit triples, defaults to default_context or self
218
+ # @return [Graph]:: Returns the graph
219
+ def add(*triples)
220
+ options = triples.last.is_a?(Hash) ? triples.pop : {}
221
+ ctx = options[:context] || @default_context || self
222
+ triples.each {|t| @store.add(t, ctx)}
223
+ self
224
+ end
225
+
226
+ # Remove a triple from the graph. Delegates to store.
227
+ # Nil matches all triples and thus empties the graph
228
+ def remove(triple); @store.remove(triple, self); end
229
+
230
+ # Triples from graph, optionally matching subject, predicate, or object.
231
+ # Delegates to Store#triples.
232
+ #
233
+ # @param [Triple, nil] triple:: Triple to match, may be a patern triple or nil
234
+ # @return [Array]:: List of matched triples
235
+ def triples(triple = Triple.new(nil, nil, nil), &block) # :yields: triple, context
236
+ @store.triples(triple, self, &block) || []
237
+ end
238
+ alias_method :find, :triples
239
+
240
+ # Detect the presence of a BNode in the graph, either as a subject or an object
241
+ #
242
+ # @param [BNode] bn:: BNode to find
243
+ #
244
+ def has_bnode_identifier?(bn)
245
+ triples do |triple, context|
246
+ return true if triple.subject.eql?(bn) || triple.object.eql?(bn)
247
+ end
248
+ false
249
+ end
250
+
251
+ # Check to see if this graph contains the specified triple
252
+ def contains?(triple)
253
+ @store.contains?(triple, self)
254
+ end
255
+
256
+ # Get all BNodes with usage count used within graph
257
+ def bnodes
258
+ @store.bnodes(self)
259
+ end
260
+
261
+ # Get list of subjects having rdf:type == object
262
+ #
263
+ # @param [Resource, Regexp, String] object:: Type resource
264
+ def get_by_type(object)
265
+ triples(Triple.new(nil, RDF_TYPE, object)).map {|t, ctx| t.subject}
266
+ end
267
+
268
+ # Merge a graph into this graph
269
+ def merge!(graph)
270
+ raise GraphException.new("merge without a graph") unless graph.is_a?(Graph)
271
+
272
+ # Map BNodes from source Graph to new BNodes
273
+ bn = graph.bnodes
274
+ bn.keys.each {|k| bn[k] = BNode.new}
275
+
276
+ graph.triples do |triple, context|
277
+ # If triple contains bnodes, remap to new values
278
+ if triple.subject.is_a?(BNode) || triple.object.is_a?(BNode)
279
+ triple = triple.clone
280
+ triple.subject = bn[triple.subject] if triple.subject.is_a?(BNode)
281
+ triple.object = bn[triple.object] if triple.object.is_a?(BNode)
282
+ end
283
+ self << triple
284
+ end
285
+ end
286
+
287
+ # Two graphs are equal if each is an instance of the other, considering BNode equivalence.
288
+ # This may be done by creating a new graph an substituting each permutation of BNode identifiers
289
+ # from self to other until every permutation is exhausted, or a textual equivalence is found
290
+ # after sorting each graph.
291
+ #
292
+ # We just follow Python RDFlib's lead and do a simple comparison
293
+ def eql? (other)
294
+ #puts "eql? size #{self.size} vs #{other.size}"
295
+ return false if !other.is_a?(Graph) || self.size != other.size
296
+ bn_self = bnodes.values.sort
297
+ bn_other = other.bnodes.values.sort
298
+ #puts "eql? bnodes '#{bn_self.to_sentence}' vs '#{bn_other.to_sentence}'"
299
+ return false unless bn_self == bn_other
300
+
301
+ # Check each triple to see if it's contained in the other graph
302
+ triples do |t, ctx|
303
+ next if t.subject.is_a?(BNode) || t.object.is_a?(BNode)
304
+ #puts "eql? contains '#{t.to_ntriples}'"
305
+ return false unless other.contains?(t)
306
+ end
307
+ true
308
+ end
309
+
310
+ alias_method :==, :eql?
311
+ end
312
+
313
+ # Parse source into Graph.
314
+ #
315
+ # Merges results into a common Graph
316
+ #
317
+ # @param [IO, String] stream:: the RDF IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
318
+ # @param [String] uri:: the URI of the document
319
+ # @param [Hash] options:: Options from
320
+ # <em>options[:debug]</em>:: Array to place debug messages
321
+ # <em>options[:type]</em>:: One of _rdfxml_, _html_, or _n3_
322
+ # <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
323
+ # @return [Graph]:: Returns the graph containing parsed triples
324
+ def parse(stream, uri, options = {}, &block) # :yields: triple
325
+ Parser.parse(stream, uri, options.merge(:graph => self), &block)
326
+ end
327
+ end
@@ -0,0 +1,340 @@
1
+ module Reddy
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