rdf_context 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (551) hide show
  1. data/.autotest +2 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +3 -0
  4. data/History.txt +73 -0
  5. data/README.rdoc +145 -0
  6. data/Rakefile +77 -0
  7. data/VERSION +1 -0
  8. data/bin/reddy +59 -0
  9. data/lib/rdf_context.rb +60 -0
  10. data/lib/rdf_context/bnode.rb +99 -0
  11. data/lib/rdf_context/conjunctive_graph.rb +47 -0
  12. data/lib/rdf_context/exceptions.rb +11 -0
  13. data/lib/rdf_context/graph.rb +333 -0
  14. data/lib/rdf_context/literal.rb +340 -0
  15. data/lib/rdf_context/n3_grammar.rb +2171 -0
  16. data/lib/rdf_context/n3_grammar.treetop +143 -0
  17. data/lib/rdf_context/n3parser.rb +152 -0
  18. data/lib/rdf_context/namespace.rb +82 -0
  19. data/lib/rdf_context/nokogiri_hacks.rb +8 -0
  20. data/lib/rdf_context/parser.rb +119 -0
  21. data/lib/rdf_context/rdfaparser.rb +398 -0
  22. data/lib/rdf_context/rdfxmlparser.rb +525 -0
  23. data/lib/rdf_context/store/abstract_sql_store.rb +843 -0
  24. data/lib/rdf_context/store/abstract_store.rb +64 -0
  25. data/lib/rdf_context/store/list_store.rb +63 -0
  26. data/lib/rdf_context/store/memory_store.rb +323 -0
  27. data/lib/rdf_context/store/sqlite3_store.rb +223 -0
  28. data/lib/rdf_context/string_hacks.rb +108 -0
  29. data/lib/rdf_context/term_utils.rb +196 -0
  30. data/lib/rdf_context/triple.rb +144 -0
  31. data/lib/rdf_context/uriref.rb +95 -0
  32. data/script/console +10 -0
  33. data/spec/bnode_spec.rb +58 -0
  34. data/spec/conjunctive_graph_spec.rb +60 -0
  35. data/spec/graph_spec.rb +390 -0
  36. data/spec/list_store_spec.rb +12 -0
  37. data/spec/literal_spec.rb +314 -0
  38. data/spec/matchers.rb +150 -0
  39. data/spec/memory_store_spec.rb +23 -0
  40. data/spec/n3parser_spec.rb +229 -0
  41. data/spec/namespaces_spec.rb +66 -0
  42. data/spec/ntriples/test.nt +78 -0
  43. data/spec/parser_spec.rb +29 -0
  44. data/spec/rdfa-triples/0001.nt +1 -0
  45. data/spec/rdfa-triples/0006.nt +2 -0
  46. data/spec/rdfa-triples/0007.nt +3 -0
  47. data/spec/rdfa-triples/0008.nt +1 -0
  48. data/spec/rdfa-triples/0009.nt +1 -0
  49. data/spec/rdfa-triples/0010.nt +2 -0
  50. data/spec/rdfa-triples/0011.nt +3 -0
  51. data/spec/rdfa-triples/0012.nt +1 -0
  52. data/spec/rdfa-triples/0013.nt +1 -0
  53. data/spec/rdfa-triples/0014.nt +1 -0
  54. data/spec/rdfa-triples/0015.nt +2 -0
  55. data/spec/rdfa-triples/0017.nt +3 -0
  56. data/spec/rdfa-triples/0018.nt +1 -0
  57. data/spec/rdfa-triples/0019.nt +1 -0
  58. data/spec/rdfa-triples/0020.nt +1 -0
  59. data/spec/rdfa-triples/0021.nt +1 -0
  60. data/spec/rdfa-triples/0023.nt +1 -0
  61. data/spec/rdfa-triples/0025.nt +2 -0
  62. data/spec/rdfa-triples/0026.nt +1 -0
  63. data/spec/rdfa-triples/0027.nt +1 -0
  64. data/spec/rdfa-triples/0029.nt +1 -0
  65. data/spec/rdfa-triples/0030.nt +1 -0
  66. data/spec/rdfa-triples/0031.nt +1 -0
  67. data/spec/rdfa-triples/0032.nt +1 -0
  68. data/spec/rdfa-triples/0033.nt +2 -0
  69. data/spec/rdfa-triples/0034.nt +1 -0
  70. data/spec/rdfa-triples/0035.nt +1 -0
  71. data/spec/rdfa-triples/0036.nt +1 -0
  72. data/spec/rdfa-triples/0037.nt +1 -0
  73. data/spec/rdfa-triples/0038.nt +1 -0
  74. data/spec/rdfa-triples/0039.nt +1 -0
  75. data/spec/rdfa-triples/0040.nt +1 -0
  76. data/spec/rdfa-triples/0041.nt +1 -0
  77. data/spec/rdfa-triples/0042.nt +0 -0
  78. data/spec/rdfa-triples/0046.nt +3 -0
  79. data/spec/rdfa-triples/0047.nt +3 -0
  80. data/spec/rdfa-triples/0048.nt +3 -0
  81. data/spec/rdfa-triples/0049.nt +2 -0
  82. data/spec/rdfa-triples/0050.nt +2 -0
  83. data/spec/rdfa-triples/0051.nt +2 -0
  84. data/spec/rdfa-triples/0052.nt +1 -0
  85. data/spec/rdfa-triples/0053.nt +2 -0
  86. data/spec/rdfa-triples/0054.nt +2 -0
  87. data/spec/rdfa-triples/0055.nt +2 -0
  88. data/spec/rdfa-triples/0056.nt +3 -0
  89. data/spec/rdfa-triples/0057.nt +4 -0
  90. data/spec/rdfa-triples/0058.nt +6 -0
  91. data/spec/rdfa-triples/0059.nt +6 -0
  92. data/spec/rdfa-triples/0060.nt +2 -0
  93. data/spec/rdfa-triples/0061.nt +1 -0
  94. data/spec/rdfa-triples/0062.nt +1 -0
  95. data/spec/rdfa-triples/0063.nt +1 -0
  96. data/spec/rdfa-triples/0064.nt +1 -0
  97. data/spec/rdfa-triples/0065.nt +3 -0
  98. data/spec/rdfa-triples/0066.nt +1 -0
  99. data/spec/rdfa-triples/0067.nt +1 -0
  100. data/spec/rdfa-triples/0068.nt +1 -0
  101. data/spec/rdfa-triples/0069.nt +1 -0
  102. data/spec/rdfa-triples/0070.nt +1 -0
  103. data/spec/rdfa-triples/0071.nt +1 -0
  104. data/spec/rdfa-triples/0072.nt +1 -0
  105. data/spec/rdfa-triples/0073.nt +1 -0
  106. data/spec/rdfa-triples/0074.nt +1 -0
  107. data/spec/rdfa-triples/0075.nt +1 -0
  108. data/spec/rdfa-triples/0076.nt +23 -0
  109. data/spec/rdfa-triples/0077.nt +23 -0
  110. data/spec/rdfa-triples/0078.nt +6 -0
  111. data/spec/rdfa-triples/0079.nt +3 -0
  112. data/spec/rdfa-triples/0080.nt +1 -0
  113. data/spec/rdfa-triples/0081.nt +6 -0
  114. data/spec/rdfa-triples/0082.nt +8 -0
  115. data/spec/rdfa-triples/0083.nt +6 -0
  116. data/spec/rdfa-triples/0084.nt +8 -0
  117. data/spec/rdfa-triples/0085.nt +4 -0
  118. data/spec/rdfa-triples/0086.nt +0 -0
  119. data/spec/rdfa-triples/0087.nt +23 -0
  120. data/spec/rdfa-triples/0088.nt +3 -0
  121. data/spec/rdfa-triples/0089.nt +1 -0
  122. data/spec/rdfa-triples/0090.nt +1 -0
  123. data/spec/rdfa-triples/0091.nt +3 -0
  124. data/spec/rdfa-triples/0092.nt +3 -0
  125. data/spec/rdfa-triples/0093.nt +2 -0
  126. data/spec/rdfa-triples/0094.nt +3 -0
  127. data/spec/rdfa-triples/0099.nt +1 -0
  128. data/spec/rdfa-triples/0100.nt +3 -0
  129. data/spec/rdfa-triples/0101.nt +3 -0
  130. data/spec/rdfa-triples/0102.nt +1 -0
  131. data/spec/rdfa-triples/0103.nt +1 -0
  132. data/spec/rdfa-triples/0104.nt +3 -0
  133. data/spec/rdfa-triples/0105.nt +1 -0
  134. data/spec/rdfa-triples/0106.nt +1 -0
  135. data/spec/rdfa-triples/0107.nt +0 -0
  136. data/spec/rdfa-triples/0108.nt +1 -0
  137. data/spec/rdfa-triples/0109.nt +1 -0
  138. data/spec/rdfa-triples/0110.nt +1 -0
  139. data/spec/rdfa-triples/0111.nt +2 -0
  140. data/spec/rdfa-triples/0112.nt +1 -0
  141. data/spec/rdfa-triples/0113.nt +2 -0
  142. data/spec/rdfa-triples/0114.nt +3 -0
  143. data/spec/rdfa-triples/0115.nt +4 -0
  144. data/spec/rdfa-triples/0116.nt +2 -0
  145. data/spec/rdfa-triples/0117.nt +2 -0
  146. data/spec/rdfa-triples/0118.nt +1 -0
  147. data/spec/rdfa-triples/0119.nt +1 -0
  148. data/spec/rdfa-triples/0120.nt +1 -0
  149. data/spec/rdfa-triples/0121.nt +2 -0
  150. data/spec/rdfa-triples/0122.nt +1 -0
  151. data/spec/rdfa-triples/0123.nt +3 -0
  152. data/spec/rdfa-triples/0124.nt +4 -0
  153. data/spec/rdfa-triples/0125.nt +1 -0
  154. data/spec/rdfa-triples/0126.nt +3 -0
  155. data/spec/rdfa-triples/1001.nt +6 -0
  156. data/spec/rdfa_helper.rb +189 -0
  157. data/spec/rdfa_parser_spec.rb +148 -0
  158. data/spec/rdfcore/Manifest.rdf +5395 -0
  159. data/spec/rdfcore/amp-in-url/test001.nt +16 -0
  160. data/spec/rdfcore/amp-in-url/test001.rdf +40 -0
  161. data/spec/rdfcore/datatypes-intensional/test001.nt +18 -0
  162. data/spec/rdfcore/datatypes-intensional/test002.nt +18 -0
  163. data/spec/rdfcore/datatypes/test001.nt +15 -0
  164. data/spec/rdfcore/datatypes/test001.rdf +29 -0
  165. data/spec/rdfcore/datatypes/test002.nt +14 -0
  166. data/spec/rdfcore/datatypes/test002.rdf +27 -0
  167. data/spec/rdfcore/datatypes/test002b.nt +17 -0
  168. data/spec/rdfcore/datatypes/test003a.nt +16 -0
  169. data/spec/rdfcore/datatypes/test003b.nt +16 -0
  170. data/spec/rdfcore/datatypes/test005a.nt +16 -0
  171. data/spec/rdfcore/datatypes/test005b.nt +16 -0
  172. data/spec/rdfcore/datatypes/test006.nt +17 -0
  173. data/spec/rdfcore/datatypes/test008a.nt +15 -0
  174. data/spec/rdfcore/datatypes/test008b.nt +15 -0
  175. data/spec/rdfcore/datatypes/test009a.nt +15 -0
  176. data/spec/rdfcore/datatypes/test009b.nt +15 -0
  177. data/spec/rdfcore/datatypes/test010.nt +17 -0
  178. data/spec/rdfcore/datatypes/test011a.nt +17 -0
  179. data/spec/rdfcore/datatypes/test011b.nt +17 -0
  180. data/spec/rdfcore/horst-01/test001.rdf +38 -0
  181. data/spec/rdfcore/horst-01/test002.rdf +39 -0
  182. data/spec/rdfcore/horst-01/test003.rdf +40 -0
  183. data/spec/rdfcore/horst-01/test004.rdf +42 -0
  184. data/spec/rdfcore/pfps-10/test001a.nt +14 -0
  185. data/spec/rdfcore/pfps-10/test001b.nt +15 -0
  186. data/spec/rdfcore/rdf-charmod-literals/test001.nt +15 -0
  187. data/spec/rdfcore/rdf-charmod-literals/test001.rdf +34 -0
  188. data/spec/rdfcore/rdf-charmod-uris/test001.nt +14 -0
  189. data/spec/rdfcore/rdf-charmod-uris/test001.rdf +34 -0
  190. data/spec/rdfcore/rdf-charmod-uris/test002.nt +15 -0
  191. data/spec/rdfcore/rdf-charmod-uris/test002.rdf +33 -0
  192. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error001.rdf +27 -0
  193. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error002.rdf +34 -0
  194. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.nt +17 -0
  195. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.rdf +27 -0
  196. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.nt +19 -0
  197. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.rdf +37 -0
  198. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.nt +18 -0
  199. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.rdf +29 -0
  200. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.nt +29 -0
  201. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.rdf +33 -0
  202. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.nt +40 -0
  203. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.rdf +28 -0
  204. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.nt +20 -0
  205. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.rdf +32 -0
  206. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.nt +15 -0
  207. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.rdf +28 -0
  208. data/spec/rdfcore/rdf-element-not-mandatory/test001.nt +10 -0
  209. data/spec/rdfcore/rdf-element-not-mandatory/test001.rdf +14 -0
  210. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.nt +14 -0
  211. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.rdf +35 -0
  212. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.nt +14 -0
  213. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.rdf +35 -0
  214. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.nt +14 -0
  215. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.rdf +34 -0
  216. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.nt +15 -0
  217. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.rdf +40 -0
  218. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.nt +14 -0
  219. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.rdf +32 -0
  220. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.nt +14 -0
  221. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.rdf +32 -0
  222. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.nt +14 -0
  223. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.rdf +38 -0
  224. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.nt +15 -0
  225. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.rdf +40 -0
  226. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.nt +15 -0
  227. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.rdf +40 -0
  228. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.nt +15 -0
  229. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.rdf +40 -0
  230. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.nt +15 -0
  231. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.rdf +42 -0
  232. data/spec/rdfcore/rdfms-abouteach/error001.rdf +35 -0
  233. data/spec/rdfcore/rdfms-abouteach/error002.rdf +35 -0
  234. data/spec/rdfcore/rdfms-difference-between-ID-and-about/error1.rdf +25 -0
  235. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.nt +14 -0
  236. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.rdf +22 -0
  237. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.nt +14 -0
  238. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.rdf +22 -0
  239. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.nt +14 -0
  240. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.rdf +22 -0
  241. data/spec/rdfcore/rdfms-duplicate-member-props/test001.nt +17 -0
  242. data/spec/rdfcore/rdfms-duplicate-member-props/test001.rdf +30 -0
  243. data/spec/rdfcore/rdfms-empty-property-elements/error001.rdf +33 -0
  244. data/spec/rdfcore/rdfms-empty-property-elements/error002.rdf +33 -0
  245. data/spec/rdfcore/rdfms-empty-property-elements/error003.rdf +39 -0
  246. data/spec/rdfcore/rdfms-empty-property-elements/test001.nt +14 -0
  247. data/spec/rdfcore/rdfms-empty-property-elements/test001.rdf +33 -0
  248. data/spec/rdfcore/rdfms-empty-property-elements/test002.nt +14 -0
  249. data/spec/rdfcore/rdfms-empty-property-elements/test002.rdf +31 -0
  250. data/spec/rdfcore/rdfms-empty-property-elements/test003.nt +14 -0
  251. data/spec/rdfcore/rdfms-empty-property-elements/test003.rdf +32 -0
  252. data/spec/rdfcore/rdfms-empty-property-elements/test004.nt +14 -0
  253. data/spec/rdfcore/rdfms-empty-property-elements/test004.rdf +32 -0
  254. data/spec/rdfcore/rdfms-empty-property-elements/test005.nt +18 -0
  255. data/spec/rdfcore/rdfms-empty-property-elements/test005.rdf +32 -0
  256. data/spec/rdfcore/rdfms-empty-property-elements/test006.nt +18 -0
  257. data/spec/rdfcore/rdfms-empty-property-elements/test006.rdf +32 -0
  258. data/spec/rdfcore/rdfms-empty-property-elements/test007.nt +14 -0
  259. data/spec/rdfcore/rdfms-empty-property-elements/test007.rdf +32 -0
  260. data/spec/rdfcore/rdfms-empty-property-elements/test008.nt +14 -0
  261. data/spec/rdfcore/rdfms-empty-property-elements/test008.rdf +31 -0
  262. data/spec/rdfcore/rdfms-empty-property-elements/test009.nt +14 -0
  263. data/spec/rdfcore/rdfms-empty-property-elements/test009.rdf +32 -0
  264. data/spec/rdfcore/rdfms-empty-property-elements/test010.nt +14 -0
  265. data/spec/rdfcore/rdfms-empty-property-elements/test010.rdf +31 -0
  266. data/spec/rdfcore/rdfms-empty-property-elements/test011.nt +18 -0
  267. data/spec/rdfcore/rdfms-empty-property-elements/test011.rdf +30 -0
  268. data/spec/rdfcore/rdfms-empty-property-elements/test012.nt +18 -0
  269. data/spec/rdfcore/rdfms-empty-property-elements/test012.rdf +30 -0
  270. data/spec/rdfcore/rdfms-empty-property-elements/test013.nt +15 -0
  271. data/spec/rdfcore/rdfms-empty-property-elements/test013.rdf +35 -0
  272. data/spec/rdfcore/rdfms-empty-property-elements/test014.nt +15 -0
  273. data/spec/rdfcore/rdfms-empty-property-elements/test014.rdf +34 -0
  274. data/spec/rdfcore/rdfms-empty-property-elements/test015.nt +15 -0
  275. data/spec/rdfcore/rdfms-empty-property-elements/test015.rdf +38 -0
  276. data/spec/rdfcore/rdfms-empty-property-elements/test016.nt +14 -0
  277. data/spec/rdfcore/rdfms-empty-property-elements/test016.rdf +31 -0
  278. data/spec/rdfcore/rdfms-empty-property-elements/test017.nt +14 -0
  279. data/spec/rdfcore/rdfms-empty-property-elements/test017.rdf +38 -0
  280. data/spec/rdfcore/rdfms-identity-anon-resources/test001.nt +14 -0
  281. data/spec/rdfcore/rdfms-identity-anon-resources/test001.rdf +33 -0
  282. data/spec/rdfcore/rdfms-identity-anon-resources/test002.nt +15 -0
  283. data/spec/rdfcore/rdfms-identity-anon-resources/test002.rdf +33 -0
  284. data/spec/rdfcore/rdfms-identity-anon-resources/test003.nt +14 -0
  285. data/spec/rdfcore/rdfms-identity-anon-resources/test003.rdf +31 -0
  286. data/spec/rdfcore/rdfms-identity-anon-resources/test004.nt +15 -0
  287. data/spec/rdfcore/rdfms-identity-anon-resources/test004.rdf +33 -0
  288. data/spec/rdfcore/rdfms-identity-anon-resources/test005.nt +14 -0
  289. data/spec/rdfcore/rdfms-identity-anon-resources/test005.rdf +31 -0
  290. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.nt +19 -0
  291. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.rdf +29 -0
  292. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.nt +15 -0
  293. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.rdf +29 -0
  294. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.nt +18 -0
  295. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.rdf +29 -0
  296. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.nt +19 -0
  297. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.rdf +29 -0
  298. data/spec/rdfcore/rdfms-para196/test001.nt +17 -0
  299. data/spec/rdfcore/rdfms-para196/test001.rdf +35 -0
  300. data/spec/rdfcore/rdfms-rdf-id/error001.rdf +26 -0
  301. data/spec/rdfcore/rdfms-rdf-id/error002.rdf +26 -0
  302. data/spec/rdfcore/rdfms-rdf-id/error003.rdf +29 -0
  303. data/spec/rdfcore/rdfms-rdf-id/error004.rdf +27 -0
  304. data/spec/rdfcore/rdfms-rdf-id/error005.rdf +31 -0
  305. data/spec/rdfcore/rdfms-rdf-id/error006.rdf +26 -0
  306. data/spec/rdfcore/rdfms-rdf-id/error007.rdf +29 -0
  307. data/spec/rdfcore/rdfms-rdf-names-use/error-001.rdf +23 -0
  308. data/spec/rdfcore/rdfms-rdf-names-use/error-002.rdf +23 -0
  309. data/spec/rdfcore/rdfms-rdf-names-use/error-003.rdf +23 -0
  310. data/spec/rdfcore/rdfms-rdf-names-use/error-004.rdf +23 -0
  311. data/spec/rdfcore/rdfms-rdf-names-use/error-005.rdf +23 -0
  312. data/spec/rdfcore/rdfms-rdf-names-use/error-006.rdf +23 -0
  313. data/spec/rdfcore/rdfms-rdf-names-use/error-007.rdf +23 -0
  314. data/spec/rdfcore/rdfms-rdf-names-use/error-008.rdf +23 -0
  315. data/spec/rdfcore/rdfms-rdf-names-use/error-009.rdf +23 -0
  316. data/spec/rdfcore/rdfms-rdf-names-use/error-010.rdf +23 -0
  317. data/spec/rdfcore/rdfms-rdf-names-use/error-011.rdf +25 -0
  318. data/spec/rdfcore/rdfms-rdf-names-use/error-012.rdf +25 -0
  319. data/spec/rdfcore/rdfms-rdf-names-use/error-013.rdf +25 -0
  320. data/spec/rdfcore/rdfms-rdf-names-use/error-014.rdf +25 -0
  321. data/spec/rdfcore/rdfms-rdf-names-use/error-015.rdf +25 -0
  322. data/spec/rdfcore/rdfms-rdf-names-use/error-016.rdf +25 -0
  323. data/spec/rdfcore/rdfms-rdf-names-use/error-017.rdf +25 -0
  324. data/spec/rdfcore/rdfms-rdf-names-use/error-018.rdf +25 -0
  325. data/spec/rdfcore/rdfms-rdf-names-use/error-019.rdf +25 -0
  326. data/spec/rdfcore/rdfms-rdf-names-use/error-020.rdf +25 -0
  327. data/spec/rdfcore/rdfms-rdf-names-use/test-001.nt +1 -0
  328. data/spec/rdfcore/rdfms-rdf-names-use/test-001.rdf +23 -0
  329. data/spec/rdfcore/rdfms-rdf-names-use/test-002.nt +1 -0
  330. data/spec/rdfcore/rdfms-rdf-names-use/test-002.rdf +23 -0
  331. data/spec/rdfcore/rdfms-rdf-names-use/test-003.nt +1 -0
  332. data/spec/rdfcore/rdfms-rdf-names-use/test-003.rdf +23 -0
  333. data/spec/rdfcore/rdfms-rdf-names-use/test-004.nt +1 -0
  334. data/spec/rdfcore/rdfms-rdf-names-use/test-004.rdf +23 -0
  335. data/spec/rdfcore/rdfms-rdf-names-use/test-005.nt +1 -0
  336. data/spec/rdfcore/rdfms-rdf-names-use/test-005.rdf +23 -0
  337. data/spec/rdfcore/rdfms-rdf-names-use/test-006.nt +1 -0
  338. data/spec/rdfcore/rdfms-rdf-names-use/test-006.rdf +23 -0
  339. data/spec/rdfcore/rdfms-rdf-names-use/test-007.nt +1 -0
  340. data/spec/rdfcore/rdfms-rdf-names-use/test-007.rdf +23 -0
  341. data/spec/rdfcore/rdfms-rdf-names-use/test-008.nt +1 -0
  342. data/spec/rdfcore/rdfms-rdf-names-use/test-008.rdf +23 -0
  343. data/spec/rdfcore/rdfms-rdf-names-use/test-009.nt +1 -0
  344. data/spec/rdfcore/rdfms-rdf-names-use/test-009.rdf +23 -0
  345. data/spec/rdfcore/rdfms-rdf-names-use/test-010.nt +1 -0
  346. data/spec/rdfcore/rdfms-rdf-names-use/test-010.rdf +23 -0
  347. data/spec/rdfcore/rdfms-rdf-names-use/test-011.nt +1 -0
  348. data/spec/rdfcore/rdfms-rdf-names-use/test-011.rdf +23 -0
  349. data/spec/rdfcore/rdfms-rdf-names-use/test-012.nt +1 -0
  350. data/spec/rdfcore/rdfms-rdf-names-use/test-012.rdf +23 -0
  351. data/spec/rdfcore/rdfms-rdf-names-use/test-013.nt +1 -0
  352. data/spec/rdfcore/rdfms-rdf-names-use/test-013.rdf +23 -0
  353. data/spec/rdfcore/rdfms-rdf-names-use/test-014.nt +1 -0
  354. data/spec/rdfcore/rdfms-rdf-names-use/test-014.rdf +23 -0
  355. data/spec/rdfcore/rdfms-rdf-names-use/test-015.nt +1 -0
  356. data/spec/rdfcore/rdfms-rdf-names-use/test-015.rdf +23 -0
  357. data/spec/rdfcore/rdfms-rdf-names-use/test-016.nt +1 -0
  358. data/spec/rdfcore/rdfms-rdf-names-use/test-016.rdf +23 -0
  359. data/spec/rdfcore/rdfms-rdf-names-use/test-017.nt +1 -0
  360. data/spec/rdfcore/rdfms-rdf-names-use/test-017.rdf +25 -0
  361. data/spec/rdfcore/rdfms-rdf-names-use/test-018.nt +1 -0
  362. data/spec/rdfcore/rdfms-rdf-names-use/test-018.rdf +25 -0
  363. data/spec/rdfcore/rdfms-rdf-names-use/test-019.nt +1 -0
  364. data/spec/rdfcore/rdfms-rdf-names-use/test-019.rdf +25 -0
  365. data/spec/rdfcore/rdfms-rdf-names-use/test-020.nt +1 -0
  366. data/spec/rdfcore/rdfms-rdf-names-use/test-020.rdf +25 -0
  367. data/spec/rdfcore/rdfms-rdf-names-use/test-021.nt +1 -0
  368. data/spec/rdfcore/rdfms-rdf-names-use/test-021.rdf +25 -0
  369. data/spec/rdfcore/rdfms-rdf-names-use/test-022.nt +1 -0
  370. data/spec/rdfcore/rdfms-rdf-names-use/test-022.rdf +25 -0
  371. data/spec/rdfcore/rdfms-rdf-names-use/test-023.nt +1 -0
  372. data/spec/rdfcore/rdfms-rdf-names-use/test-023.rdf +25 -0
  373. data/spec/rdfcore/rdfms-rdf-names-use/test-024.nt +1 -0
  374. data/spec/rdfcore/rdfms-rdf-names-use/test-024.rdf +25 -0
  375. data/spec/rdfcore/rdfms-rdf-names-use/test-025.nt +1 -0
  376. data/spec/rdfcore/rdfms-rdf-names-use/test-025.rdf +25 -0
  377. data/spec/rdfcore/rdfms-rdf-names-use/test-026.nt +1 -0
  378. data/spec/rdfcore/rdfms-rdf-names-use/test-026.rdf +25 -0
  379. data/spec/rdfcore/rdfms-rdf-names-use/test-027.nt +1 -0
  380. data/spec/rdfcore/rdfms-rdf-names-use/test-027.rdf +25 -0
  381. data/spec/rdfcore/rdfms-rdf-names-use/test-028.nt +1 -0
  382. data/spec/rdfcore/rdfms-rdf-names-use/test-028.rdf +25 -0
  383. data/spec/rdfcore/rdfms-rdf-names-use/test-029.nt +1 -0
  384. data/spec/rdfcore/rdfms-rdf-names-use/test-029.rdf +25 -0
  385. data/spec/rdfcore/rdfms-rdf-names-use/test-030.nt +1 -0
  386. data/spec/rdfcore/rdfms-rdf-names-use/test-030.rdf +25 -0
  387. data/spec/rdfcore/rdfms-rdf-names-use/test-031.nt +1 -0
  388. data/spec/rdfcore/rdfms-rdf-names-use/test-031.rdf +25 -0
  389. data/spec/rdfcore/rdfms-rdf-names-use/test-032.nt +1 -0
  390. data/spec/rdfcore/rdfms-rdf-names-use/test-032.rdf +24 -0
  391. data/spec/rdfcore/rdfms-rdf-names-use/test-033.nt +1 -0
  392. data/spec/rdfcore/rdfms-rdf-names-use/test-033.rdf +24 -0
  393. data/spec/rdfcore/rdfms-rdf-names-use/test-034.nt +1 -0
  394. data/spec/rdfcore/rdfms-rdf-names-use/test-034.rdf +24 -0
  395. data/spec/rdfcore/rdfms-rdf-names-use/test-035.nt +1 -0
  396. data/spec/rdfcore/rdfms-rdf-names-use/test-035.rdf +24 -0
  397. data/spec/rdfcore/rdfms-rdf-names-use/test-036.nt +1 -0
  398. data/spec/rdfcore/rdfms-rdf-names-use/test-036.rdf +24 -0
  399. data/spec/rdfcore/rdfms-rdf-names-use/test-037.nt +1 -0
  400. data/spec/rdfcore/rdfms-rdf-names-use/test-037.rdf +24 -0
  401. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.nt +1 -0
  402. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.rdf +23 -0
  403. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.nt +1 -0
  404. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.rdf +25 -0
  405. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.nt +1 -0
  406. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.rdf +24 -0
  407. data/spec/rdfcore/rdfms-reification-required/test001.nt +15 -0
  408. data/spec/rdfcore/rdfms-reification-required/test001.rdf +29 -0
  409. data/spec/rdfcore/rdfms-seq-representation/empty.nt +13 -0
  410. data/spec/rdfcore/rdfms-seq-representation/test001.nt +19 -0
  411. data/spec/rdfcore/rdfms-seq-representation/test001.rdf +33 -0
  412. data/spec/rdfcore/rdfms-seq-representation/test002.nt +14 -0
  413. data/spec/rdfcore/rdfms-seq-representation/test003a.nt +14 -0
  414. data/spec/rdfcore/rdfms-seq-representation/test003b.nt +14 -0
  415. data/spec/rdfcore/rdfms-seq-representation/test004.nt +14 -0
  416. data/spec/rdfcore/rdfms-syntax-incomplete/error001.rdf +26 -0
  417. data/spec/rdfcore/rdfms-syntax-incomplete/error002.rdf +26 -0
  418. data/spec/rdfcore/rdfms-syntax-incomplete/error003.rdf +29 -0
  419. data/spec/rdfcore/rdfms-syntax-incomplete/error004.rdf +25 -0
  420. data/spec/rdfcore/rdfms-syntax-incomplete/error005.rdf +25 -0
  421. data/spec/rdfcore/rdfms-syntax-incomplete/error006.rdf +28 -0
  422. data/spec/rdfcore/rdfms-syntax-incomplete/test001.nt +14 -0
  423. data/spec/rdfcore/rdfms-syntax-incomplete/test001.rdf +28 -0
  424. data/spec/rdfcore/rdfms-syntax-incomplete/test002.nt +19 -0
  425. data/spec/rdfcore/rdfms-syntax-incomplete/test002.rdf +38 -0
  426. data/spec/rdfcore/rdfms-syntax-incomplete/test003.nt +17 -0
  427. data/spec/rdfcore/rdfms-syntax-incomplete/test003.rdf +28 -0
  428. data/spec/rdfcore/rdfms-syntax-incomplete/test004.nt +21 -0
  429. data/spec/rdfcore/rdfms-syntax-incomplete/test004.rdf +36 -0
  430. data/spec/rdfcore/rdfms-uri-substructure/error001.nt +18 -0
  431. data/spec/rdfcore/rdfms-uri-substructure/test001.nt +17 -0
  432. data/spec/rdfcore/rdfms-uri-substructure/test001.rdf +29 -0
  433. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.nt +13 -0
  434. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.rdf +33 -0
  435. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.nt +14 -0
  436. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.rdf +47 -0
  437. data/spec/rdfcore/rdfms-xmllang/test001.nt +14 -0
  438. data/spec/rdfcore/rdfms-xmllang/test001.rdf +30 -0
  439. data/spec/rdfcore/rdfms-xmllang/test002.nt +14 -0
  440. data/spec/rdfcore/rdfms-xmllang/test002.rdf +29 -0
  441. data/spec/rdfcore/rdfms-xmllang/test003.nt +14 -0
  442. data/spec/rdfcore/rdfms-xmllang/test003.rdf +28 -0
  443. data/spec/rdfcore/rdfms-xmllang/test004.nt +14 -0
  444. data/spec/rdfcore/rdfms-xmllang/test004.rdf +28 -0
  445. data/spec/rdfcore/rdfms-xmllang/test005.nt +14 -0
  446. data/spec/rdfcore/rdfms-xmllang/test005.rdf +28 -0
  447. data/spec/rdfcore/rdfms-xmllang/test006.nt +14 -0
  448. data/spec/rdfcore/rdfms-xmllang/test006.rdf +29 -0
  449. data/spec/rdfcore/rdfms-xmllang/test007a.nt +14 -0
  450. data/spec/rdfcore/rdfms-xmllang/test007b.nt +14 -0
  451. data/spec/rdfcore/rdfms-xmllang/test007c.nt +14 -0
  452. data/spec/rdfcore/rdfs-container-membership-superProperty/not1C.rdf +13 -0
  453. data/spec/rdfcore/rdfs-container-membership-superProperty/not1P.rdf +14 -0
  454. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions005.rdf +28 -0
  455. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions006.rdf +28 -0
  456. data/spec/rdfcore/rdfs-domain-and-range/premises005.rdf +32 -0
  457. data/spec/rdfcore/rdfs-domain-and-range/premises006.rdf +32 -0
  458. data/spec/rdfcore/rdfs-domain-and-range/test001.nt +16 -0
  459. data/spec/rdfcore/rdfs-domain-and-range/test001.rdf +29 -0
  460. data/spec/rdfcore/rdfs-domain-and-range/test002.nt +16 -0
  461. data/spec/rdfcore/rdfs-domain-and-range/test002.rdf +29 -0
  462. data/spec/rdfcore/rdfs-entailment/test001.nt +16 -0
  463. data/spec/rdfcore/rdfs-entailment/test002.nt +15 -0
  464. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.nt +18 -0
  465. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.rdf +37 -0
  466. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.nt +18 -0
  467. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.rdf +40 -0
  468. data/spec/rdfcore/rdfs-subClassOf-a-Property/test001.nt +15 -0
  469. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test001.nt +24 -0
  470. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test002.nt +21 -0
  471. data/spec/rdfcore/statement-entailment/test001a.nt +12 -0
  472. data/spec/rdfcore/statement-entailment/test001b.nt +2 -0
  473. data/spec/rdfcore/statement-entailment/test002a.nt +2 -0
  474. data/spec/rdfcore/statement-entailment/test002b.nt +5 -0
  475. data/spec/rdfcore/tex-01/test001.rdf +34 -0
  476. data/spec/rdfcore/tex-01/test002.rdf +33 -0
  477. data/spec/rdfcore/unrecognised-xml-attributes/test001.nt +15 -0
  478. data/spec/rdfcore/unrecognised-xml-attributes/test001.rdf +31 -0
  479. data/spec/rdfcore/unrecognised-xml-attributes/test002.nt +14 -0
  480. data/spec/rdfcore/unrecognised-xml-attributes/test002.rdf +32 -0
  481. data/spec/rdfcore/xml-canon/test001.nt +16 -0
  482. data/spec/rdfcore/xml-canon/test001.rdf +28 -0
  483. data/spec/rdfcore/xmlbase/test001.nt +14 -0
  484. data/spec/rdfcore/xmlbase/test001.rdf +27 -0
  485. data/spec/rdfcore/xmlbase/test002.nt +14 -0
  486. data/spec/rdfcore/xmlbase/test002.rdf +28 -0
  487. data/spec/rdfcore/xmlbase/test003.nt +14 -0
  488. data/spec/rdfcore/xmlbase/test003.rdf +25 -0
  489. data/spec/rdfcore/xmlbase/test004.nt +18 -0
  490. data/spec/rdfcore/xmlbase/test004.rdf +27 -0
  491. data/spec/rdfcore/xmlbase/test006.nt +15 -0
  492. data/spec/rdfcore/xmlbase/test006.rdf +26 -0
  493. data/spec/rdfcore/xmlbase/test007.nt +14 -0
  494. data/spec/rdfcore/xmlbase/test007.rdf +25 -0
  495. data/spec/rdfcore/xmlbase/test008.nt +14 -0
  496. data/spec/rdfcore/xmlbase/test008.rdf +25 -0
  497. data/spec/rdfcore/xmlbase/test009.nt +14 -0
  498. data/spec/rdfcore/xmlbase/test009.rdf +26 -0
  499. data/spec/rdfcore/xmlbase/test010.nt +14 -0
  500. data/spec/rdfcore/xmlbase/test010.rdf +26 -0
  501. data/spec/rdfcore/xmlbase/test011.nt +14 -0
  502. data/spec/rdfcore/xmlbase/test011.rdf +27 -0
  503. data/spec/rdfcore/xmlbase/test013.nt +15 -0
  504. data/spec/rdfcore/xmlbase/test013.rdf +28 -0
  505. data/spec/rdfcore/xmlbase/test014.nt +15 -0
  506. data/spec/rdfcore/xmlbase/test014.rdf +28 -0
  507. data/spec/rdfcore/xmlsch-02/test001.rdf +34 -0
  508. data/spec/rdfcore/xmlsch-02/test002.rdf +34 -0
  509. data/spec/rdfcore/xmlsch-02/test003.rdf +37 -0
  510. data/spec/rdfxml_helper.rb +137 -0
  511. data/spec/rdfxml_spec.rb +362 -0
  512. data/spec/spec.opts +1 -0
  513. data/spec/spec_helper.rb +23 -0
  514. data/spec/sqlite3_store_spec.rb +41 -0
  515. data/spec/store_helper.rb +231 -0
  516. data/spec/string_hacks_spec.rb +21 -0
  517. data/spec/triple_spec.rb +172 -0
  518. data/spec/uriref_spec.rb +117 -0
  519. data/test/longtests_spec.rb +25 -0
  520. data/test/n3_tests/lcsh/sh85062913.n3 +41 -0
  521. data/test/n3_tests/lcsh/sh85062913.nt +21 -0
  522. data/test/n3_tests/lcsh/sh85082139.n3 +157 -0
  523. data/test/n3_tests/lcsh/sh85082139.nt +79 -0
  524. data/test/n3_tests/lcsh/sh85118553.n3 +123 -0
  525. data/test/n3_tests/lcsh/sh85118553.nt +63 -0
  526. data/test/n3_tests/misc/on_now-01.n3 +30 -0
  527. data/test/n3_tests/misc/on_now-01.nt +15 -0
  528. data/test/n3_tests/n3p/simple-01.n3 +1 -0
  529. data/test/n3_tests/n3p/simple-01.nt +0 -0
  530. data/test/n3_tests/n3p/simple-02.n3 +4 -0
  531. data/test/n3_tests/n3p/simple-02.nt +0 -0
  532. data/test/n3_tests/n3p/simple-03.n3 +5 -0
  533. data/test/n3_tests/n3p/simple-03.nt +1 -0
  534. data/test/n3_tests/n3p/simple-04.n3 +6 -0
  535. data/test/n3_tests/n3p/simple-04.nt +3 -0
  536. data/test/n3_tests/n3p/simple-05.n3 +7 -0
  537. data/test/n3_tests/n3p/simple-05.nt +2 -0
  538. data/test/n3_tests/n3p/simple-06.n3 +6 -0
  539. data/test/n3_tests/n3p/simple-06.nt +4 -0
  540. data/test/n3_tests/n3p/simple-07.n3 +7 -0
  541. data/test/n3_tests/n3p/simple-07.nt +6 -0
  542. data/test/perf_test/test.rb +11 -0
  543. data/test/perf_test/tommorris.rdf +2267 -0
  544. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.nt +24 -0
  545. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.rdf +46 -0
  546. data/test/rdf_tests/tm_001.nt +1 -0
  547. data/test/rdf_tests/tm_001.rdf +7 -0
  548. data/test/rdf_tests/xml-literal-mixed.nt +7 -0
  549. data/test/rdf_tests/xml-literal-mixed.rdf +15 -0
  550. data/test/xml.rdf +6 -0
  551. metadata +696 -0
@@ -0,0 +1,144 @@
1
+ module RdfContext
2
+ # An RDF Triple, or statement.
3
+ #
4
+ # Statements are composed of _subjects_, _predicates_ and _objects_.
5
+ class Triple
6
+ attr_accessor :subject, :object, :predicate
7
+
8
+ ##
9
+ # Creates a new triple directly from the intended subject, predicate, and object.
10
+ #
11
+ # Any or all of _subject_, _predicate_ or _object_ may be nil, to create a triple patern.
12
+ # A patern may not be added to a graph.
13
+ #
14
+ # ==== Example
15
+ # Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new) # => results in the creation of a new triple and returns it
16
+ #
17
+ # @param [URIRef, BNode] subject:: the subject of the triple
18
+ # @param [URIRef] predicate:: the predicate of the triple
19
+ # @param [URIRef, BNode, Literal, TypedLiteral] object:: the object of the triple
20
+ # @return [Triple]:: An array of the triples (leaky abstraction? consider returning the graph instead)
21
+ # @raise [Error]:: Checks parameter types and raises if they are incorrect.
22
+ #
23
+ # @author Tom Morris
24
+ def initialize (subject, predicate, object)
25
+ @subject = self.class.coerce_subject(subject)
26
+ @predicate = self.class.coerce_predicate(predicate)
27
+ @object = self.class.coerce_object(object)
28
+ @patern = subject.nil? || predicate.nil? || object.nil?
29
+ end
30
+
31
+ def is_patern?
32
+ @patern
33
+ end
34
+
35
+ # Serialize Triple to N-Triples
36
+ def to_ntriples
37
+ raise RdfException.new("Can't serialize patern triple") if is_patern?
38
+ @subject.to_ntriples + " " + @predicate.to_ntriples + " " + @object.to_ntriples + " ."
39
+ end
40
+
41
+ def to_s; self.to_ntriples; end
42
+
43
+ def inspect
44
+ [@subject, @predicate, @object, @patern].inspect
45
+ end
46
+
47
+ # Is the predicate of this statment rdf:type?
48
+ def is_type?
49
+ @predicate.to_s == "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
50
+ end
51
+
52
+ # Two triples are equal if their of their subjects, predicates and objects are equal.
53
+ # Or self or other is a patern and subject, predicate, object matches
54
+ def eql? (other)
55
+ other.is_a?(Triple) &&
56
+ (other.subject == self.subject || other.subject.nil? || self.subject.nil?) &&
57
+ (other.predicate == self.predicate || other.predicate.nil? || self.predicate.nil?) &&
58
+ (other.object == self.object || other.object.nil? || self.object.nil?)
59
+ end
60
+
61
+ alias_method :==, :eql?
62
+
63
+ # Clone triple, keeping references to literals and URIRefs, but cloning BNodes
64
+ def clone
65
+ raise RdfException.new("Can't clone patern triple") if is_patern?
66
+ s = subject.is_a?(BNode) ? subject.clone : subject
67
+ p = predicate.is_a?(BNode) ? predicate.clone : predicate
68
+ o = object.is_a?(BNode) ? object.clone : object
69
+ Triple.new(subject, predicate, object)
70
+ end
71
+
72
+ # For indexes
73
+ def hash
74
+ [subject, predicate, object].hash
75
+ end
76
+
77
+ protected
78
+
79
+ # Coerce a subject to the appropriate RdfContext type.
80
+ #
81
+ # @param[URI, URIRef, String] subject:: If a String looks like a URI, a URI is created, otherwise a BNode.
82
+ # @raise[InvalidSubject]:: If subject can't be intuited.
83
+ def self.coerce_subject(subject)
84
+ case subject
85
+ when Addressable::URI
86
+ URIRef.new(subject.to_s)
87
+ when URIRef, BNode
88
+ subject
89
+ when nil
90
+ subject
91
+ when /^\w+:\/\/\S+/ # does it smell like a URI?
92
+ URIRef.new subject
93
+ else
94
+ raise InvalidSubject, "Subject is not of a known class (#{subject.class}: #{subject.inspect})"
95
+ end
96
+ end
97
+
98
+ # Coerce a predicate to the appropriate RdfContext type.
99
+ #
100
+ # @param[URI, URIRef, String] subject:: If a String looks like a URI, a URI is created
101
+ # @raise[InvalidSubject]:: If subject can't be predicate.
102
+ def self.coerce_predicate(predicate)
103
+ case predicate
104
+ when Addressable::URI
105
+ URIRef.new(predicate.to_s)
106
+ when URIRef
107
+ predicate
108
+ when String
109
+ URIRef.new predicate
110
+ when nil
111
+ predicate
112
+ else
113
+ raise InvalidPredicate, "Predicate should be a URI"
114
+ end
115
+ rescue ParserException => e
116
+ raise InvalidPredicate, "Couldn't make a URIRef: #{e.message}"
117
+ end
118
+
119
+ # Coerce a object to the appropriate RdfContext type.
120
+ #
121
+ # @param[URI, URIRef, String, Integer, Float, BNode, Literal] object:: If a String looks like a URI, a URI is created, otherwise an untyped Literal.
122
+ # @raise[InvalidSubject]:: If subject can't be predicate.
123
+ def self.coerce_object(object)
124
+ case object
125
+ when Addressable::URI
126
+ URIRef.new(object.to_s)
127
+ when String
128
+ if object.to_s =~ /^\w+:\/\/\S+/ # does it smell like a URI?
129
+ URIRef.new(object.to_s)
130
+ else
131
+ Literal.untyped(object)
132
+ end
133
+ when Integer, Float
134
+ Literal.build_from(object)
135
+ when URIRef, BNode, Literal
136
+ object
137
+ when nil, regexp
138
+ object
139
+ else
140
+ raise InvalidObject, "#{object.class}: #{object.inspect} is not a valid object"
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,95 @@
1
+ require 'net/http'
2
+
3
+ module RdfContext
4
+ class URIRef
5
+ attr_accessor :uri
6
+
7
+ # Create a URIRef from a URI or a fragment and a URI
8
+ #
9
+ # ==== Example
10
+ # u = URIRef.new("http://example.com")
11
+ # u = URIRef.new("foo", u) => "http://example.com/foo"
12
+ #
13
+ def initialize (*args)
14
+ args.each {|s| test_string(s)}
15
+ if args.size == 1
16
+ @uri = Addressable::URI.parse(args[0].to_s)
17
+ else
18
+ @uri = Addressable::URI.join(*args.map{|s| s.to_s}.reverse)
19
+ end
20
+ if @uri.relative?
21
+ raise ParserException, "<" + @uri.to_s + "> is a relative URI"
22
+ end
23
+ if !@uri.to_s.match(/^javascript/).nil?
24
+ raise ParserException, "Javascript pseudo-URIs are not acceptable"
25
+ end
26
+
27
+ # Unique URI through class hash to ensure that URIRefs can be easily compared
28
+ @@uri_hash ||= {}
29
+ @@uri_hash[@uri.to_s] ||= @uri.freeze
30
+ @uri = @@uri_hash[@uri.to_s]
31
+ end
32
+
33
+ # Create a URI, either by appending a fragment, or using the input URI
34
+ def + (input)
35
+ input_uri = Addressable::URI.parse(input.to_s)
36
+ return URIRef.new(input_uri, self.to_s)
37
+ end
38
+
39
+ def short_name
40
+ if @uri.fragment()
41
+ return @uri.fragment()
42
+ elsif @uri.path.split("/").last.class == String and @uri.path.split("/").last.length > 0
43
+ return @uri.path.split("/").last
44
+ else
45
+ return false
46
+ end
47
+ end
48
+
49
+ def eql?(other)
50
+ @uri.to_s == other.to_s
51
+ end
52
+ alias_method :==, :eql?
53
+
54
+ # Needed for uniq
55
+ def hash; to_s.hash; end
56
+
57
+ def to_s
58
+ @uri.to_s
59
+ end
60
+
61
+ def to_ntriples
62
+ "<" + @uri.to_s + ">"
63
+ end
64
+
65
+ # Output URI as QName using URI binding
66
+ def to_qname(uri_binding = {})
67
+ uri_base = @uri.to_s
68
+ sn = short_name.to_s
69
+ uri_base = uri_base[0, uri_base.length - sn.length]
70
+ if uri_binding.has_key?(uri_base)
71
+ "#{uri_binding[uri_base]}:#{sn}"
72
+ else
73
+ raise ParserException, "Couldn't find QName for #{@uri}"
74
+ end
75
+ end
76
+
77
+ # Output URI as resource reference for RDF/XML
78
+ def xml_args
79
+ [{"rdf:resource" => @uri.to_s}]
80
+ end
81
+
82
+ def test_string (string)
83
+ string.to_s.each_byte do |b|
84
+ if b >= 0 and b <= 31
85
+ raise ParserException, "URI '#{string}' must not contain control characters"
86
+ end
87
+ end
88
+ end
89
+
90
+ # def load_graph
91
+ # get = Net::HTTP.start(@uri.host, @uri.port) {|http| [:xml, http.get(@uri.path)] }
92
+ # return RdfContext::RdfXmlParser.new(get[1].body, @uri.to_s).graph if get[0] == :xml
93
+ # end
94
+ end
95
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/rdf_context.rb'}"
9
+ puts "Loading rdf_context gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,58 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+ describe "Blank nodes" do
3
+ before(:all) { @context = {} }
4
+
5
+ describe "which have custom identifiers" do
6
+ subject { BNode.new("foo", @context) }
7
+
8
+ it "should return identifier" do
9
+ subject.identifier.should =~ /foo/
10
+ subject.to_s.should =~ /foo/
11
+ end
12
+
13
+ it "should be rejected if they are not acceptable" do
14
+ b = BNode.new("4cake", @context)
15
+ b.identifier.should_not =~ /4cake/
16
+ end
17
+
18
+ it "should be expressible in NT syntax" do
19
+ subject.to_ntriples.should =~ /foo/
20
+ end
21
+
22
+ it "should be able to determine equality" do
23
+ other = BNode.new(subject.to_s, @context)
24
+ should == other
25
+ end
26
+
27
+ it "should be able to determine inequality" do
28
+ other = URIRef.new('http://somehost.com/wherever.xml')
29
+ should_not == other
30
+ end
31
+
32
+ it "should resource hash for RDF/XML named bnode" do
33
+ subject.xml_args.should == [{"rdf:nodeID" => subject.to_s}]
34
+ end
35
+ end
36
+
37
+ describe "which has a blank identifier" do
38
+ subject { BNode.new("", @context) }
39
+ it "should not be the same as an anonymous identifier" do should_not == BNode.new end
40
+ it "should be the same as another blank identifier" do should == BNode.new("", @context) end
41
+ end
42
+
43
+ describe "which are anonymous" do
44
+ subject { BNode.new(@graph)}
45
+ it "should not be equivalent to another anonymous node" do
46
+ should_not == BNode.new
47
+ end
48
+
49
+ it "should be equivalent it's clone" do
50
+ should == subject.clone
51
+ end
52
+
53
+ it "should create resource hash for RDF/XML anonymous bnode" do
54
+ b = BNode.new
55
+ b.xml_args.should == [{"rdf:nodeID" => b.identifier}]
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,60 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe "ConjunctiveGraph" do
4
+ before(:each) do
5
+ @ex = Namespace.new("http://example.org/", "ex")
6
+ @identifier = URIRef.new("http://store.identifier")
7
+ @store = MemoryStore.new(@identifier)
8
+ end
9
+
10
+ subject { ConjunctiveGraph.new(:store => @store)}
11
+
12
+ it "should should have same identifier as store" do
13
+ subject.identifier.should == @identifier
14
+ end
15
+
16
+ it "should have a default context" do
17
+ subject.default_context.should be_a(Graph)
18
+ subject.default_context.identifier.should == @identifier
19
+ subject.default_context.store.should == @store
20
+ end
21
+
22
+ it "should add triples to default context" do
23
+ t = Triple.new(@ex.a, @ex.b, @ex.c)
24
+ subject.add(t)
25
+
26
+ count = 0
27
+ subject.triples do |t, ctx|
28
+ t.should == t
29
+ ctx.should be_a(Graph)
30
+ ctx.identifier.should == @identifier
31
+ count += 1
32
+ end
33
+ count.should == 1
34
+ end
35
+
36
+ it "should retrieve triples from all contexts" do
37
+ g = Graph.new(:store => @store)
38
+ t = Triple.new(@ex.a, @ex.b, @ex.c)
39
+ g.add(t)
40
+
41
+ count = 0
42
+ subject.triples do |t, ctx|
43
+ t.should == t
44
+ ctx.should == g
45
+ count += 1
46
+ end
47
+ count.should == 1
48
+ end
49
+
50
+ it "should parse into new context" do
51
+ n3_string = "<http://example.org/> <http://xmlns.com/foaf/0.1/name> \"Gregg Kellogg\" . "
52
+ graph = subject.parse(n3_string, "http://foo.bar", :type => :n3)
53
+ graph.identifier.should == "http://foo.bar"
54
+ subject.size.should == 1
55
+ t = subject.triples.first
56
+ t.subject.to_s.should == "http://example.org/"
57
+ t.predicate.to_s.should == "http://xmlns.com/foaf/0.1/name"
58
+ t.object.to_s.should == "Gregg Kellogg"
59
+ end
60
+ end
@@ -0,0 +1,390 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe "Graphs" do
4
+ before(:all) do
5
+ @ex = Namespace.new("http://example.org/", "ex")
6
+ @foaf = Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")
7
+ @bn_ctx = {}
8
+ end
9
+
10
+ subject { Graph.new(:store => ListStore.new) }
11
+ it "should allow you to add one or more triples" do
12
+ lambda do
13
+ subject.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new)
14
+ end.should_not raise_error
15
+ end
16
+
17
+ it "should support << as an alias for add_triple" do
18
+ lambda do
19
+ subject << Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new)
20
+ end.should_not raise_error
21
+ subject.size.should == 1
22
+ end
23
+
24
+ it "should return bnode subjects" do
25
+ bn = BNode.new
26
+ subject.add_triple(bn, URIRef.new("http://xmlns.com/foaf/0.1/knows"), bn)
27
+ subject.subjects.should == [bn]
28
+ end
29
+
30
+ it "should be able to determine whether or not it has existing BNodes" do
31
+ foaf = Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")
32
+ john = BNode.new('john', @bn_ctx)
33
+ jane = BNode.new('jane', @bn_ctx)
34
+ jack = BNode.new('jack', @bn_ctx)
35
+
36
+ subject << Triple.new(john, foaf.knows, jane)
37
+ subject.has_bnode_identifier?(john).should be_true
38
+ subject.has_bnode_identifier?(jane).should be_true
39
+ subject.has_bnode_identifier?(jack).should_not be_true
40
+ end
41
+
42
+ it "should allow you to create and bind Namespace objects" do
43
+ subject.bind(Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")).should be_a(Namespace)
44
+ subject.nsbinding["foaf"].uri.should == "http://xmlns.com/foaf/0.1/"
45
+ end
46
+
47
+ it "should bind namespace" do
48
+ foaf = Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")
49
+ subject.bind(foaf).should == foaf
50
+ end
51
+
52
+ it "should not allow you to bind things other than namespaces" do
53
+ lambda do
54
+ subject.bind(false)
55
+ end.should raise_error
56
+ end
57
+
58
+ it "should follow the specification as to output identical triples" do
59
+ subject.add_triple(@ex.a, @ex.b, @ex.c)
60
+ subject.add_triple(@ex.a, @ex.b, @ex.c)
61
+ subject.size.should == 1
62
+ end
63
+
64
+ it "should parse into existing graph" do
65
+ n3_string = "<http://example.org/> <http://xmlns.com/foaf/0.1/name> \"Gregg Kellogg\" . "
66
+ graph = subject.parse(n3_string, nil, :type => :n3)
67
+ graph.should == subject
68
+ graph.identifier.should be_a(BNode)
69
+ subject.size.should == 1
70
+ subject[0].subject.to_s.should == "http://example.org/"
71
+ subject[0].predicate.to_s.should == "http://xmlns.com/foaf/0.1/name"
72
+ subject[0].object.to_s.should == "Gregg Kellogg"
73
+ end
74
+
75
+ it "should add multiple triples" do
76
+ subject.add(Triple.new(@ex.a, @ex.b, @ex.c), Triple.new(@ex.a, @ex.b, @ex.d))
77
+ subject.size.should == 2
78
+ end
79
+
80
+ describe "with identifier" do
81
+ before(:all) { @identifier = URIRef.new("http://foo.bar") }
82
+ subject { Graph.new(:identifier => @identifier) }
83
+
84
+ it "should retrieve identifier" do
85
+ subject.identifier.should == @identifier
86
+ subject.identifier.should == @identifier.to_s
87
+ end
88
+ end
89
+
90
+ describe "with named store" do
91
+ before(:all) do
92
+ @identifier = URIRef.new("http://foo.bar")
93
+ @store = ListStore.new(:identifier => @identifier)
94
+ end
95
+
96
+ subject {
97
+ g = Graph.new(:identifier => @identifier, :store => @store)
98
+ g.add_triple(@ex.john, @foaf.knows, @ex.jane)
99
+ g.add_triple(@ex.john, @foaf.knows, @ex.rick)
100
+ g.add_triple(@ex.jane, @foaf.knows, @ex.rick)
101
+ g.bind(@foaf)
102
+ g
103
+ }
104
+
105
+ it "should retrieve identifier" do
106
+ subject.identifier.should == @identifier
107
+ subject.identifier.should == @identifier.to_s
108
+ end
109
+
110
+ it "should be same as graph with same store and identifier" do
111
+ g = Graph.new(:store => @store, :identifier => @identifier)
112
+ subject.should == g
113
+ end
114
+ end
115
+
116
+ describe "with XML Literal objects" do
117
+ subject {
118
+ dc = Namespace.new("http://purl.org/dc/elements/1.1/", "dc")
119
+ xhtml = Namespace.new("http://www.w3.org/1999/xhtml", "")
120
+ g = Graph.new(:store => ListStore.new)
121
+ g << Triple.new(
122
+ URIRef.new("http://www.w3.org/2006/07/SWD/RDFa/testsuite/xhtml1-testcases/0011.xhtml"),
123
+ URIRef.new("http://purl.org/dc/elements/1.1/title"),
124
+ Literal.typed("E = mc<sup xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">2</sup>: The Most Urgent Problem of Our Time",
125
+ "http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral",
126
+ g.nsbinding)
127
+ )
128
+ g.bind(dc)
129
+ g.bind(xhtml)
130
+ g
131
+ }
132
+
133
+ it "should output NTriple" do
134
+ nt = '<http://www.w3.org/2006/07/SWD/RDFa/testsuite/xhtml1-testcases/0011.xhtml> <http://purl.org/dc/elements/1.1/title> "E = mc<sup xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">2</sup>: The Most Urgent Problem of Our Time"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .' + "\n"
135
+ subject.to_ntriples.should == nt
136
+ end
137
+
138
+ it "should output RDF/XML" do
139
+ rdfxml = <<-HERE
140
+ <?xml version="1.0" encoding="UTF-8"?>
141
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xhv=\"http://www.w3.org/1999/xhtml/vocab#\">
142
+ <rdf:Description rdf:about="http://www.w3.org/2006/07/SWD/RDFa/testsuite/xhtml1-testcases/0011.xhtml">
143
+ <dc:title rdf:parseType="Literal">E = mc<sup xmlns="http://www.w3.org/1999/xhtml" xmlns:dc="http://purl.org/dc/elements/1.1/">2>/sup>: The Most Urgent Problem of Our Time</dc:title>
144
+ </rdf:Description>
145
+ </rdf:RDF>
146
+ HERE
147
+ subject.to_rdfxml.should include("E = mc<sup xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">2</sup>: The Most Urgent Problem of Our Time")
148
+ end
149
+ end
150
+
151
+ describe "with bnodes" do
152
+ subject {
153
+ g = Graph.new(:store => ListStore.new)
154
+ a = BNode.new("a")
155
+ b = BNode.new("b")
156
+
157
+ g << Triple.new(a, @foaf.name, Literal.untyped("Manu Sporny"))
158
+ g << Triple.new(a, @foaf.knows, b)
159
+ g << Triple.new(b, @foaf.name, Literal.untyped("Ralph Swick"))
160
+ g.bind(@foaf)
161
+ g
162
+ }
163
+
164
+ it "should return bnodes" do
165
+ subject.bnodes.keys.length.should == 2
166
+ subject.bnodes.values.should == [2, 2]
167
+ end
168
+
169
+ it "should output RDF/XML" do
170
+ rdfxml = <<-HERE
171
+ <?xml version="1.0" encoding="utf-8"?>
172
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#">
173
+ <rdf:Description rdf:nodeID="a">
174
+ <foaf:name>Manu Sporny</foaf:name>
175
+ <foaf:knows rdf:nodeID="b"/>
176
+ </rdf:Description>
177
+ <rdf:Description rdf:nodeID="b">
178
+ <foaf:name>Ralph Swick</foaf:name>
179
+ </rdf:Description>
180
+ </rdf:RDF>
181
+ HERE
182
+ xml = subject.to_rdfxml
183
+ xml.should include("Ralph Swick")
184
+ xml.should include("Manu Sporny")
185
+ end
186
+ end
187
+
188
+ describe "with triples" do
189
+ subject {
190
+ g = Graph.new(:store => ListStore.new)
191
+ g.add_triple(@ex.john, @foaf.knows, @ex.jane)
192
+ g.add_triple(@ex.john, @foaf.knows, @ex.rick)
193
+ g.add_triple(@ex.jane, @foaf.knows, @ex.rick)
194
+ g.bind(@foaf)
195
+ g
196
+ }
197
+
198
+ it "should detect included triple" do
199
+ subject.contains?(subject[0]).should be_true
200
+ end
201
+
202
+ it "should tell you how large the graph is" do
203
+ subject.size.should == 3
204
+ end
205
+
206
+ it "should return unique subjects" do
207
+ subject.subjects.should == [@ex.john.uri.to_s, @ex.jane.uri.to_s]
208
+ end
209
+
210
+ it "should return unique predicates" do
211
+ subject.predicates.should == [@foaf.knows.uri.to_s]
212
+ end
213
+
214
+ it "should return unique objects" do
215
+ subject.objects.should == [@ex.jane.uri.to_s, @ex.rick.uri.to_s]
216
+ end
217
+
218
+ it "should allow you to select resources" do
219
+ subject.triples(Triple.new(@ex.john, nil, nil)).size.should == 2
220
+ end
221
+
222
+ it "should allow iteration" do
223
+ count = 0
224
+ subject.triples do |t|
225
+ count = count + 1
226
+ t.class.should == Triple
227
+ end
228
+ count.should == 3
229
+ end
230
+
231
+ it "should allow iteration over a particular subject" do
232
+ count = 0
233
+ subject.triples(Triple.new(@ex.john, nil, nil)) do |t|
234
+ count = count + 1
235
+ t.class.should == Triple
236
+ t.subject.should == @ex.john
237
+ end
238
+ count.should == 2
239
+ end
240
+
241
+ it "should give you a list of resources of a particular type" do
242
+ subject.add_triple(@ex.john, RDF_TYPE, @foaf.Person)
243
+ subject.add_triple(@ex.jane, RDF_TYPE, @foaf.Person)
244
+
245
+ subject.get_by_type("http://xmlns.com/foaf/0.1/Person").should == [@ex.john, @ex.jane]
246
+ end
247
+
248
+ it "should remove a triple" do
249
+ subject.add(Triple.new(@ex.john, RDF_TYPE, @foaf.Person))
250
+ subject.size.should == 4
251
+ subject.remove(Triple.new(@ex.john, RDF_TYPE, @foaf.Person))
252
+ subject.size.should == 3
253
+ end
254
+
255
+ it "should remove all triples" do
256
+ subject.remove(Triple.new(nil, nil, nil))
257
+ subject.size.should == 0
258
+ end
259
+
260
+ describe "find triples" do
261
+ it "should find subjects" do
262
+ subject.triples(Triple.new(@ex.john, nil, nil)).size.should == 2
263
+ subject.triples(Triple.new(@ex.jane, nil, nil)).size.should == 1
264
+ end
265
+
266
+ it "should find predicates" do
267
+ subject.triples(Triple.new(nil, @foaf.knows, nil)).size.should == 3
268
+ end
269
+
270
+ it "should find objects" do
271
+ subject.triples(Triple.new(nil, nil, @ex.rick)).size.should == 2
272
+ end
273
+
274
+ it "should find object with regexp" do
275
+ subject.triples(Triple.new(nil, nil, @ex.rick)).size.should == 2
276
+ end
277
+
278
+ it "should find combinations" do
279
+ subject.triples(Triple.new(@ex.john, nil, @ex.rick)).size.should == 1
280
+ end
281
+ end
282
+
283
+ describe "encodings" do
284
+ it "should output NTriple" do
285
+ nt = "<http://example.org/john> <http://xmlns.com/foaf/0.1/knows> <http://example.org/jane> .\n<http://example.org/john> <http://xmlns.com/foaf/0.1/knows> <http://example.org/rick> .\n<http://example.org/jane> <http://xmlns.com/foaf/0.1/knows> <http://example.org/rick> .\n"
286
+ subject.to_ntriples.should == nt
287
+ end
288
+
289
+ it "should output RDF/XML" do
290
+ rdfxml = <<HERE
291
+ <?xml version="1.0" encoding="UTF-8"?>
292
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#">
293
+ <rdf:Description rdf:about="http://example.org/john">
294
+ <foaf:knows rdf:resource="http://example.org/jane"/>
295
+ </rdf:Description>
296
+ <rdf:Description rdf:about="http://example.org/john">
297
+ <foaf:knows rdf:resource="http://example.org/rick"/>
298
+ </rdf:Description>
299
+ <rdf:Description rdf:about="http://example.org/jane">
300
+ <foaf:knows rdf:resource="http://example.org/rick"/>
301
+ </rdf:Description>
302
+ </rdf:RDF>
303
+ HERE
304
+ subject.to_rdfxml.should be_equivalent_xml(rdfxml)
305
+ end
306
+ end
307
+ end
308
+
309
+ describe "which are merged" do
310
+ it "should be able to integrate another graph" do
311
+ subject.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new)
312
+ g = Graph.new(:store => ListStore.new)
313
+ g.merge!(subject)
314
+ g.size.should == 1
315
+ end
316
+
317
+ it "should not merge with non graph" do
318
+ lambda do
319
+ h.merge!("")
320
+ end.should raise_error
321
+ end
322
+
323
+ # One does not, in general, obtain the merge of a set of graphs by concatenating their corresponding
324
+ # N-Triples documents and constructing the graph described by the merged document. If some of the
325
+ # documents use the same node identifiers, the merged document will describe a graph in which some of the
326
+ # blank nodes have been 'accidentally' identified. To merge N-Triples documents it is necessary to check
327
+ # if the same nodeID is used in two or more documents, and to replace it with a distinct nodeID in each
328
+ # of them, before merging the documents.
329
+ it "should remap bnodes to avoid duplicate bnode identifiers" do
330
+ subject.add_triple(BNode.new("a1", @bn_ctx), URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new("a2", @bn_ctx))
331
+ g = Graph.new(:store => ListStore.new)
332
+ g.add_triple(BNode.new("a1", @bn_ctx), URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new("a2", @bn_ctx))
333
+ g.merge!(subject)
334
+ g.size.should == 2
335
+ s1, s2 = g.triples.map(&:subject)
336
+ p1, p2 = g.triples.map(&:predicate)
337
+ o1, o2 = g.triples.map(&:object)
338
+ s1.should_not == s2
339
+ p1.should == p1
340
+ o1.should_not == o2
341
+ end
342
+
343
+ it "should remove duplicate triples" do
344
+ subject.add_triple(@ex.a, URIRef.new("http://xmlns.com/foaf/0.1/knows"), @ex.b)
345
+ g = Graph.new(:store => ListStore.new)
346
+ g.add_triple(@ex.a, URIRef.new("http://xmlns.com/foaf/0.1/knows"), @ex.b)
347
+ g.merge!(subject)
348
+ g.size.should == 1
349
+ end
350
+ end
351
+
352
+ describe "that can be compared" do
353
+ {
354
+ "ListStore" => :list_store,
355
+ "MemoryStore" => :memory_store
356
+ }.each_pair do |t, s|
357
+ describe "using #{t}" do
358
+ subject { Graph.new(:store => s)}
359
+
360
+ it "should be true for empty graphs" do
361
+ subject.should == Graph.new(:store => s, :identifier => subject.identifier)
362
+ end
363
+
364
+ it "should be false for different graphs" do
365
+ f = Graph.new(:store => s, :identifier => subject.identifier)
366
+ f.add_triple(URIRef.new("http://example.org/joe"), URIRef.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), URIRef.new("http://xmlns.com/foaf/0.1/Person"))
367
+ subject.should_not == f
368
+ end
369
+
370
+ it "should be true for equivalent graphs with different BNode identifiers" do
371
+ subject.add_triple(@ex.a, @foaf.knows, BNode.new("a1", @bn_ctx))
372
+ subject.add_triple(BNode.new("a1", @bn_ctx), @foaf.knows, @ex.a)
373
+
374
+ f = Graph.new(:store => s, :identifier => subject.identifier)
375
+ f.add_triple(@ex.a, @foaf.knows, BNode.new("a2", @bn_ctx))
376
+ f.add_triple(BNode.new("a2", @bn_ctx), @foaf.knows, @ex.a)
377
+ subject.should == f
378
+ end
379
+
380
+ it "should be true for graphs with literals" do
381
+ subject.add_triple(@ex.a, @foaf.knows, Literal.untyped("foo"))
382
+
383
+ f = Graph.new(:store => s, :identifier => subject.identifier)
384
+ f.add_triple(@ex.a, @foaf.knows, Literal.untyped("foo"))
385
+ subject.should == f
386
+ end
387
+ end
388
+ end
389
+ end
390
+ end