rdf_context 0.4.2

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