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.
- data/.autotest +2 -0
- data/.gitignore +10 -0
- data/.gitmodules +3 -0
- data/History.txt +73 -0
- data/README.rdoc +145 -0
- data/Rakefile +77 -0
- data/VERSION +1 -0
- data/bin/reddy +59 -0
- data/lib/rdf_context.rb +60 -0
- data/lib/rdf_context/bnode.rb +99 -0
- data/lib/rdf_context/conjunctive_graph.rb +47 -0
- data/lib/rdf_context/exceptions.rb +11 -0
- data/lib/rdf_context/graph.rb +333 -0
- data/lib/rdf_context/literal.rb +340 -0
- data/lib/rdf_context/n3_grammar.rb +2171 -0
- data/lib/rdf_context/n3_grammar.treetop +143 -0
- data/lib/rdf_context/n3parser.rb +152 -0
- data/lib/rdf_context/namespace.rb +82 -0
- data/lib/rdf_context/nokogiri_hacks.rb +8 -0
- data/lib/rdf_context/parser.rb +119 -0
- data/lib/rdf_context/rdfaparser.rb +398 -0
- data/lib/rdf_context/rdfxmlparser.rb +525 -0
- data/lib/rdf_context/store/abstract_sql_store.rb +843 -0
- data/lib/rdf_context/store/abstract_store.rb +64 -0
- data/lib/rdf_context/store/list_store.rb +63 -0
- data/lib/rdf_context/store/memory_store.rb +323 -0
- data/lib/rdf_context/store/sqlite3_store.rb +223 -0
- data/lib/rdf_context/string_hacks.rb +108 -0
- data/lib/rdf_context/term_utils.rb +196 -0
- data/lib/rdf_context/triple.rb +144 -0
- data/lib/rdf_context/uriref.rb +95 -0
- data/script/console +10 -0
- data/spec/bnode_spec.rb +58 -0
- data/spec/conjunctive_graph_spec.rb +60 -0
- data/spec/graph_spec.rb +390 -0
- data/spec/list_store_spec.rb +12 -0
- data/spec/literal_spec.rb +314 -0
- data/spec/matchers.rb +150 -0
- data/spec/memory_store_spec.rb +23 -0
- data/spec/n3parser_spec.rb +229 -0
- data/spec/namespaces_spec.rb +66 -0
- data/spec/ntriples/test.nt +78 -0
- data/spec/parser_spec.rb +29 -0
- data/spec/rdfa-triples/0001.nt +1 -0
- data/spec/rdfa-triples/0006.nt +2 -0
- data/spec/rdfa-triples/0007.nt +3 -0
- data/spec/rdfa-triples/0008.nt +1 -0
- data/spec/rdfa-triples/0009.nt +1 -0
- data/spec/rdfa-triples/0010.nt +2 -0
- data/spec/rdfa-triples/0011.nt +3 -0
- data/spec/rdfa-triples/0012.nt +1 -0
- data/spec/rdfa-triples/0013.nt +1 -0
- data/spec/rdfa-triples/0014.nt +1 -0
- data/spec/rdfa-triples/0015.nt +2 -0
- data/spec/rdfa-triples/0017.nt +3 -0
- data/spec/rdfa-triples/0018.nt +1 -0
- data/spec/rdfa-triples/0019.nt +1 -0
- data/spec/rdfa-triples/0020.nt +1 -0
- data/spec/rdfa-triples/0021.nt +1 -0
- data/spec/rdfa-triples/0023.nt +1 -0
- data/spec/rdfa-triples/0025.nt +2 -0
- data/spec/rdfa-triples/0026.nt +1 -0
- data/spec/rdfa-triples/0027.nt +1 -0
- data/spec/rdfa-triples/0029.nt +1 -0
- data/spec/rdfa-triples/0030.nt +1 -0
- data/spec/rdfa-triples/0031.nt +1 -0
- data/spec/rdfa-triples/0032.nt +1 -0
- data/spec/rdfa-triples/0033.nt +2 -0
- data/spec/rdfa-triples/0034.nt +1 -0
- data/spec/rdfa-triples/0035.nt +1 -0
- data/spec/rdfa-triples/0036.nt +1 -0
- data/spec/rdfa-triples/0037.nt +1 -0
- data/spec/rdfa-triples/0038.nt +1 -0
- data/spec/rdfa-triples/0039.nt +1 -0
- data/spec/rdfa-triples/0040.nt +1 -0
- data/spec/rdfa-triples/0041.nt +1 -0
- data/spec/rdfa-triples/0042.nt +0 -0
- data/spec/rdfa-triples/0046.nt +3 -0
- data/spec/rdfa-triples/0047.nt +3 -0
- data/spec/rdfa-triples/0048.nt +3 -0
- data/spec/rdfa-triples/0049.nt +2 -0
- data/spec/rdfa-triples/0050.nt +2 -0
- data/spec/rdfa-triples/0051.nt +2 -0
- data/spec/rdfa-triples/0052.nt +1 -0
- data/spec/rdfa-triples/0053.nt +2 -0
- data/spec/rdfa-triples/0054.nt +2 -0
- data/spec/rdfa-triples/0055.nt +2 -0
- data/spec/rdfa-triples/0056.nt +3 -0
- data/spec/rdfa-triples/0057.nt +4 -0
- data/spec/rdfa-triples/0058.nt +6 -0
- data/spec/rdfa-triples/0059.nt +6 -0
- data/spec/rdfa-triples/0060.nt +2 -0
- data/spec/rdfa-triples/0061.nt +1 -0
- data/spec/rdfa-triples/0062.nt +1 -0
- data/spec/rdfa-triples/0063.nt +1 -0
- data/spec/rdfa-triples/0064.nt +1 -0
- data/spec/rdfa-triples/0065.nt +3 -0
- data/spec/rdfa-triples/0066.nt +1 -0
- data/spec/rdfa-triples/0067.nt +1 -0
- data/spec/rdfa-triples/0068.nt +1 -0
- data/spec/rdfa-triples/0069.nt +1 -0
- data/spec/rdfa-triples/0070.nt +1 -0
- data/spec/rdfa-triples/0071.nt +1 -0
- data/spec/rdfa-triples/0072.nt +1 -0
- data/spec/rdfa-triples/0073.nt +1 -0
- data/spec/rdfa-triples/0074.nt +1 -0
- data/spec/rdfa-triples/0075.nt +1 -0
- data/spec/rdfa-triples/0076.nt +23 -0
- data/spec/rdfa-triples/0077.nt +23 -0
- data/spec/rdfa-triples/0078.nt +6 -0
- data/spec/rdfa-triples/0079.nt +3 -0
- data/spec/rdfa-triples/0080.nt +1 -0
- data/spec/rdfa-triples/0081.nt +6 -0
- data/spec/rdfa-triples/0082.nt +8 -0
- data/spec/rdfa-triples/0083.nt +6 -0
- data/spec/rdfa-triples/0084.nt +8 -0
- data/spec/rdfa-triples/0085.nt +4 -0
- data/spec/rdfa-triples/0086.nt +0 -0
- data/spec/rdfa-triples/0087.nt +23 -0
- data/spec/rdfa-triples/0088.nt +3 -0
- data/spec/rdfa-triples/0089.nt +1 -0
- data/spec/rdfa-triples/0090.nt +1 -0
- data/spec/rdfa-triples/0091.nt +3 -0
- data/spec/rdfa-triples/0092.nt +3 -0
- data/spec/rdfa-triples/0093.nt +2 -0
- data/spec/rdfa-triples/0094.nt +3 -0
- data/spec/rdfa-triples/0099.nt +1 -0
- data/spec/rdfa-triples/0100.nt +3 -0
- data/spec/rdfa-triples/0101.nt +3 -0
- data/spec/rdfa-triples/0102.nt +1 -0
- data/spec/rdfa-triples/0103.nt +1 -0
- data/spec/rdfa-triples/0104.nt +3 -0
- data/spec/rdfa-triples/0105.nt +1 -0
- data/spec/rdfa-triples/0106.nt +1 -0
- data/spec/rdfa-triples/0107.nt +0 -0
- data/spec/rdfa-triples/0108.nt +1 -0
- data/spec/rdfa-triples/0109.nt +1 -0
- data/spec/rdfa-triples/0110.nt +1 -0
- data/spec/rdfa-triples/0111.nt +2 -0
- data/spec/rdfa-triples/0112.nt +1 -0
- data/spec/rdfa-triples/0113.nt +2 -0
- data/spec/rdfa-triples/0114.nt +3 -0
- data/spec/rdfa-triples/0115.nt +4 -0
- data/spec/rdfa-triples/0116.nt +2 -0
- data/spec/rdfa-triples/0117.nt +2 -0
- data/spec/rdfa-triples/0118.nt +1 -0
- data/spec/rdfa-triples/0119.nt +1 -0
- data/spec/rdfa-triples/0120.nt +1 -0
- data/spec/rdfa-triples/0121.nt +2 -0
- data/spec/rdfa-triples/0122.nt +1 -0
- data/spec/rdfa-triples/0123.nt +3 -0
- data/spec/rdfa-triples/0124.nt +4 -0
- data/spec/rdfa-triples/0125.nt +1 -0
- data/spec/rdfa-triples/0126.nt +3 -0
- data/spec/rdfa-triples/1001.nt +6 -0
- data/spec/rdfa_helper.rb +189 -0
- data/spec/rdfa_parser_spec.rb +148 -0
- data/spec/rdfcore/Manifest.rdf +5395 -0
- data/spec/rdfcore/amp-in-url/test001.nt +16 -0
- data/spec/rdfcore/amp-in-url/test001.rdf +40 -0
- data/spec/rdfcore/datatypes-intensional/test001.nt +18 -0
- data/spec/rdfcore/datatypes-intensional/test002.nt +18 -0
- data/spec/rdfcore/datatypes/test001.nt +15 -0
- data/spec/rdfcore/datatypes/test001.rdf +29 -0
- data/spec/rdfcore/datatypes/test002.nt +14 -0
- data/spec/rdfcore/datatypes/test002.rdf +27 -0
- data/spec/rdfcore/datatypes/test002b.nt +17 -0
- data/spec/rdfcore/datatypes/test003a.nt +16 -0
- data/spec/rdfcore/datatypes/test003b.nt +16 -0
- data/spec/rdfcore/datatypes/test005a.nt +16 -0
- data/spec/rdfcore/datatypes/test005b.nt +16 -0
- data/spec/rdfcore/datatypes/test006.nt +17 -0
- data/spec/rdfcore/datatypes/test008a.nt +15 -0
- data/spec/rdfcore/datatypes/test008b.nt +15 -0
- data/spec/rdfcore/datatypes/test009a.nt +15 -0
- data/spec/rdfcore/datatypes/test009b.nt +15 -0
- data/spec/rdfcore/datatypes/test010.nt +17 -0
- data/spec/rdfcore/datatypes/test011a.nt +17 -0
- data/spec/rdfcore/datatypes/test011b.nt +17 -0
- data/spec/rdfcore/horst-01/test001.rdf +38 -0
- data/spec/rdfcore/horst-01/test002.rdf +39 -0
- data/spec/rdfcore/horst-01/test003.rdf +40 -0
- data/spec/rdfcore/horst-01/test004.rdf +42 -0
- data/spec/rdfcore/pfps-10/test001a.nt +14 -0
- data/spec/rdfcore/pfps-10/test001b.nt +15 -0
- data/spec/rdfcore/rdf-charmod-literals/test001.nt +15 -0
- data/spec/rdfcore/rdf-charmod-literals/test001.rdf +34 -0
- data/spec/rdfcore/rdf-charmod-uris/test001.nt +14 -0
- data/spec/rdfcore/rdf-charmod-uris/test001.rdf +34 -0
- data/spec/rdfcore/rdf-charmod-uris/test002.nt +15 -0
- data/spec/rdfcore/rdf-charmod-uris/test002.rdf +33 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/error001.rdf +27 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/error002.rdf +34 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.nt +17 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.rdf +27 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.nt +19 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.rdf +37 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.nt +18 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.rdf +29 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.nt +29 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.rdf +33 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.nt +40 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.rdf +28 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.nt +20 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.rdf +32 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.nt +15 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.rdf +28 -0
- data/spec/rdfcore/rdf-element-not-mandatory/test001.nt +10 -0
- data/spec/rdfcore/rdf-element-not-mandatory/test001.rdf +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.rdf +35 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.rdf +35 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.rdf +34 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.rdf +32 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.rdf +32 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.rdf +38 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.rdf +42 -0
- data/spec/rdfcore/rdfms-abouteach/error001.rdf +35 -0
- data/spec/rdfcore/rdfms-abouteach/error002.rdf +35 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/error1.rdf +25 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.nt +14 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.rdf +22 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.nt +14 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.rdf +22 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.nt +14 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.rdf +22 -0
- data/spec/rdfcore/rdfms-duplicate-member-props/test001.nt +17 -0
- data/spec/rdfcore/rdfms-duplicate-member-props/test001.rdf +30 -0
- data/spec/rdfcore/rdfms-empty-property-elements/error001.rdf +33 -0
- data/spec/rdfcore/rdfms-empty-property-elements/error002.rdf +33 -0
- data/spec/rdfcore/rdfms-empty-property-elements/error003.rdf +39 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test001.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test002.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test002.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test003.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test003.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test004.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test004.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test005.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test005.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test006.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test006.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test007.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test007.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test008.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test008.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test009.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test009.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test010.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test010.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test011.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test011.rdf +30 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test012.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test012.rdf +30 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test013.nt +15 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test013.rdf +35 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test014.nt +15 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test014.rdf +34 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test015.nt +15 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test015.rdf +38 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test016.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test016.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test017.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test017.rdf +38 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test001.nt +14 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test002.nt +15 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test002.rdf +33 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test003.nt +14 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test003.rdf +31 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test004.nt +15 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test004.rdf +33 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test005.nt +14 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test005.rdf +31 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.nt +19 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.rdf +29 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.nt +15 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.rdf +29 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.nt +18 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.rdf +29 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.nt +19 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.rdf +29 -0
- data/spec/rdfcore/rdfms-para196/test001.nt +17 -0
- data/spec/rdfcore/rdfms-para196/test001.rdf +35 -0
- data/spec/rdfcore/rdfms-rdf-id/error001.rdf +26 -0
- data/spec/rdfcore/rdfms-rdf-id/error002.rdf +26 -0
- data/spec/rdfcore/rdfms-rdf-id/error003.rdf +29 -0
- data/spec/rdfcore/rdfms-rdf-id/error004.rdf +27 -0
- data/spec/rdfcore/rdfms-rdf-id/error005.rdf +31 -0
- data/spec/rdfcore/rdfms-rdf-id/error006.rdf +26 -0
- data/spec/rdfcore/rdfms-rdf-id/error007.rdf +29 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-001.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-002.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-003.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-004.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-005.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-006.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-007.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-008.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-009.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-010.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-011.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-012.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-013.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-014.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-015.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-016.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-017.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-018.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-019.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-020.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-001.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-001.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-002.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-002.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-003.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-003.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-004.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-004.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-005.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-005.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-006.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-006.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-007.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-007.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-008.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-008.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-009.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-009.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-010.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-010.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-011.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-011.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-012.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-012.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-013.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-013.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-014.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-014.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-015.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-015.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-016.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-016.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-017.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-017.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-018.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-018.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-019.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-019.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-020.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-020.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-021.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-021.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-022.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-022.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-023.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-023.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-024.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-024.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-025.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-025.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-026.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-026.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-027.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-027.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-028.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-028.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-029.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-029.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-030.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-030.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-031.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-031.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-032.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-032.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-033.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-033.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-034.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-034.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-035.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-035.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-036.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-036.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-037.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-037.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-001.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-001.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-002.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-002.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-003.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-003.rdf +24 -0
- data/spec/rdfcore/rdfms-reification-required/test001.nt +15 -0
- data/spec/rdfcore/rdfms-reification-required/test001.rdf +29 -0
- data/spec/rdfcore/rdfms-seq-representation/empty.nt +13 -0
- data/spec/rdfcore/rdfms-seq-representation/test001.nt +19 -0
- data/spec/rdfcore/rdfms-seq-representation/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-seq-representation/test002.nt +14 -0
- data/spec/rdfcore/rdfms-seq-representation/test003a.nt +14 -0
- data/spec/rdfcore/rdfms-seq-representation/test003b.nt +14 -0
- data/spec/rdfcore/rdfms-seq-representation/test004.nt +14 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error001.rdf +26 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error002.rdf +26 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error003.rdf +29 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error004.rdf +25 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error005.rdf +25 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error006.rdf +28 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test001.nt +14 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test001.rdf +28 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test002.nt +19 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test002.rdf +38 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test003.nt +17 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test003.rdf +28 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test004.nt +21 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test004.rdf +36 -0
- data/spec/rdfcore/rdfms-uri-substructure/error001.nt +18 -0
- data/spec/rdfcore/rdfms-uri-substructure/test001.nt +17 -0
- data/spec/rdfcore/rdfms-uri-substructure/test001.rdf +29 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.nt +13 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.nt +14 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.rdf +47 -0
- data/spec/rdfcore/rdfms-xmllang/test001.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test001.rdf +30 -0
- data/spec/rdfcore/rdfms-xmllang/test002.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test002.rdf +29 -0
- data/spec/rdfcore/rdfms-xmllang/test003.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test003.rdf +28 -0
- data/spec/rdfcore/rdfms-xmllang/test004.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test004.rdf +28 -0
- data/spec/rdfcore/rdfms-xmllang/test005.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test005.rdf +28 -0
- data/spec/rdfcore/rdfms-xmllang/test006.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test006.rdf +29 -0
- data/spec/rdfcore/rdfms-xmllang/test007a.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test007b.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test007c.nt +14 -0
- data/spec/rdfcore/rdfs-container-membership-superProperty/not1C.rdf +13 -0
- data/spec/rdfcore/rdfs-container-membership-superProperty/not1P.rdf +14 -0
- data/spec/rdfcore/rdfs-domain-and-range/nonconclusions005.rdf +28 -0
- data/spec/rdfcore/rdfs-domain-and-range/nonconclusions006.rdf +28 -0
- data/spec/rdfcore/rdfs-domain-and-range/premises005.rdf +32 -0
- data/spec/rdfcore/rdfs-domain-and-range/premises006.rdf +32 -0
- data/spec/rdfcore/rdfs-domain-and-range/test001.nt +16 -0
- data/spec/rdfcore/rdfs-domain-and-range/test001.rdf +29 -0
- data/spec/rdfcore/rdfs-domain-and-range/test002.nt +16 -0
- data/spec/rdfcore/rdfs-domain-and-range/test002.rdf +29 -0
- data/spec/rdfcore/rdfs-entailment/test001.nt +16 -0
- data/spec/rdfcore/rdfs-entailment/test002.nt +15 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.nt +18 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.rdf +37 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.nt +18 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.rdf +40 -0
- data/spec/rdfcore/rdfs-subClassOf-a-Property/test001.nt +15 -0
- data/spec/rdfcore/rdfs-subPropertyOf-semantics/test001.nt +24 -0
- data/spec/rdfcore/rdfs-subPropertyOf-semantics/test002.nt +21 -0
- data/spec/rdfcore/statement-entailment/test001a.nt +12 -0
- data/spec/rdfcore/statement-entailment/test001b.nt +2 -0
- data/spec/rdfcore/statement-entailment/test002a.nt +2 -0
- data/spec/rdfcore/statement-entailment/test002b.nt +5 -0
- data/spec/rdfcore/tex-01/test001.rdf +34 -0
- data/spec/rdfcore/tex-01/test002.rdf +33 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test001.nt +15 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test001.rdf +31 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test002.nt +14 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test002.rdf +32 -0
- data/spec/rdfcore/xml-canon/test001.nt +16 -0
- data/spec/rdfcore/xml-canon/test001.rdf +28 -0
- data/spec/rdfcore/xmlbase/test001.nt +14 -0
- data/spec/rdfcore/xmlbase/test001.rdf +27 -0
- data/spec/rdfcore/xmlbase/test002.nt +14 -0
- data/spec/rdfcore/xmlbase/test002.rdf +28 -0
- data/spec/rdfcore/xmlbase/test003.nt +14 -0
- data/spec/rdfcore/xmlbase/test003.rdf +25 -0
- data/spec/rdfcore/xmlbase/test004.nt +18 -0
- data/spec/rdfcore/xmlbase/test004.rdf +27 -0
- data/spec/rdfcore/xmlbase/test006.nt +15 -0
- data/spec/rdfcore/xmlbase/test006.rdf +26 -0
- data/spec/rdfcore/xmlbase/test007.nt +14 -0
- data/spec/rdfcore/xmlbase/test007.rdf +25 -0
- data/spec/rdfcore/xmlbase/test008.nt +14 -0
- data/spec/rdfcore/xmlbase/test008.rdf +25 -0
- data/spec/rdfcore/xmlbase/test009.nt +14 -0
- data/spec/rdfcore/xmlbase/test009.rdf +26 -0
- data/spec/rdfcore/xmlbase/test010.nt +14 -0
- data/spec/rdfcore/xmlbase/test010.rdf +26 -0
- data/spec/rdfcore/xmlbase/test011.nt +14 -0
- data/spec/rdfcore/xmlbase/test011.rdf +27 -0
- data/spec/rdfcore/xmlbase/test013.nt +15 -0
- data/spec/rdfcore/xmlbase/test013.rdf +28 -0
- data/spec/rdfcore/xmlbase/test014.nt +15 -0
- data/spec/rdfcore/xmlbase/test014.rdf +28 -0
- data/spec/rdfcore/xmlsch-02/test001.rdf +34 -0
- data/spec/rdfcore/xmlsch-02/test002.rdf +34 -0
- data/spec/rdfcore/xmlsch-02/test003.rdf +37 -0
- data/spec/rdfxml_helper.rb +137 -0
- data/spec/rdfxml_spec.rb +362 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/sqlite3_store_spec.rb +41 -0
- data/spec/store_helper.rb +231 -0
- data/spec/string_hacks_spec.rb +21 -0
- data/spec/triple_spec.rb +172 -0
- data/spec/uriref_spec.rb +117 -0
- data/test/longtests_spec.rb +25 -0
- data/test/n3_tests/lcsh/sh85062913.n3 +41 -0
- data/test/n3_tests/lcsh/sh85062913.nt +21 -0
- data/test/n3_tests/lcsh/sh85082139.n3 +157 -0
- data/test/n3_tests/lcsh/sh85082139.nt +79 -0
- data/test/n3_tests/lcsh/sh85118553.n3 +123 -0
- data/test/n3_tests/lcsh/sh85118553.nt +63 -0
- data/test/n3_tests/misc/on_now-01.n3 +30 -0
- data/test/n3_tests/misc/on_now-01.nt +15 -0
- data/test/n3_tests/n3p/simple-01.n3 +1 -0
- data/test/n3_tests/n3p/simple-01.nt +0 -0
- data/test/n3_tests/n3p/simple-02.n3 +4 -0
- data/test/n3_tests/n3p/simple-02.nt +0 -0
- data/test/n3_tests/n3p/simple-03.n3 +5 -0
- data/test/n3_tests/n3p/simple-03.nt +1 -0
- data/test/n3_tests/n3p/simple-04.n3 +6 -0
- data/test/n3_tests/n3p/simple-04.nt +3 -0
- data/test/n3_tests/n3p/simple-05.n3 +7 -0
- data/test/n3_tests/n3p/simple-05.nt +2 -0
- data/test/n3_tests/n3p/simple-06.n3 +6 -0
- data/test/n3_tests/n3p/simple-06.nt +4 -0
- data/test/n3_tests/n3p/simple-07.n3 +7 -0
- data/test/n3_tests/n3p/simple-07.nt +6 -0
- data/test/perf_test/test.rb +11 -0
- data/test/perf_test/tommorris.rdf +2267 -0
- data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.nt +24 -0
- data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.rdf +46 -0
- data/test/rdf_tests/tm_001.nt +1 -0
- data/test/rdf_tests/tm_001.rdf +7 -0
- data/test/rdf_tests/xml-literal-mixed.nt +7 -0
- data/test/rdf_tests/xml-literal-mixed.rdf +15 -0
- data/test/xml.rdf +6 -0
- 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"
|
data/spec/bnode_spec.rb
ADDED
|
@@ -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
|
data/spec/graph_spec.rb
ADDED
|
@@ -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
|