gkellogg-reddy 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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