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,47 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "graph.rb")
|
2
|
+
|
3
|
+
module RdfContext
|
4
|
+
# ConjunctiveGraph - The top level container for all named Graphs sharing a _Store_
|
5
|
+
#
|
6
|
+
# A ConjuctiveGraph is a graph that can contain other graphs. Graphs are kept distinct
|
7
|
+
# by a _context_, which is the identifier of the sub-graph. It is the union of all graphs in a _Store_.
|
8
|
+
#
|
9
|
+
# For the sake of persistence, Conjunctive Graphs must be distinguished by identifiers (that may not
|
10
|
+
# necessarily be RDF identifiers or may be an RDF identifier normalized - SHA1/MD5 perhaps - for database
|
11
|
+
# naming purposes ) which could be referenced to indicate conjunctive queries (queries made across the
|
12
|
+
# entire conjunctive graph) or appear as nodes in asserted statements. In this latter case, such
|
13
|
+
# statements could be interpreted as being made about the entire 'known' universe.
|
14
|
+
class ConjunctiveGraph < Graph
|
15
|
+
# Store for ConjunctiveGraph must support contexts.
|
16
|
+
def initialize(options = {})
|
17
|
+
unless options[:store] && options[:store].context_aware?
|
18
|
+
raise GraphException.new("Conjuective Graph requires store supporting contexts")
|
19
|
+
end
|
20
|
+
|
21
|
+
super(:identifier => options[:store].identifier, :store => options[:store])
|
22
|
+
@context_aware = true
|
23
|
+
end
|
24
|
+
|
25
|
+
# The default_context is a Graph having an _identifier_ the same as the
|
26
|
+
# _identifier_ of the _store_.
|
27
|
+
def default_context
|
28
|
+
@@default_context = Graph.new(:identifier => @store.identifier, :store => @store)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Parse source into a new context.
|
32
|
+
#
|
33
|
+
# Create a new context (Graph) and parse into that.
|
34
|
+
#
|
35
|
+
# @param [IO, String] stream:: the RDF IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
|
36
|
+
# @param [String] uri:: the URI of the document
|
37
|
+
# @param [Hash] options:: Options from
|
38
|
+
# <em>options[:debug]</em>:: Array to place debug messages
|
39
|
+
# <em>options[:type]</em>:: One of _rdfxml_, _html_, or _n3_
|
40
|
+
# <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
|
41
|
+
# @return [Graph]:: Returns the graph containing parsed triples
|
42
|
+
def parse(stream, uri, options = {}, &block) # :yields: triple
|
43
|
+
graph = Graph.new(:identifier => uri, :store => self.store)
|
44
|
+
Parser.parse(stream, uri, options.merge(:graph => graph), &block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module RdfContext
|
2
|
+
class RdfException < RuntimeError; end
|
3
|
+
class ParserException < RdfException; end
|
4
|
+
class GraphException < RdfException; end
|
5
|
+
class StoreException < RdfException; end
|
6
|
+
class BNodeException < RdfException; end
|
7
|
+
class TypeError < RdfException; end
|
8
|
+
class InvalidPredicate < RdfException; end
|
9
|
+
class InvalidSubject < RdfException; end
|
10
|
+
class InvalidObject < RdfException; end
|
11
|
+
end
|
@@ -0,0 +1,333 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'store', 'list_store')
|
2
|
+
require File.join(File.dirname(__FILE__), 'store', 'memory_store')
|
3
|
+
|
4
|
+
module RdfContext
|
5
|
+
# A simple graph to hold triples.
|
6
|
+
#
|
7
|
+
# Graphs store triples, and the namespaces associated with those triples, where defined
|
8
|
+
class Graph
|
9
|
+
attr_reader :triples
|
10
|
+
attr_reader :nsbinding
|
11
|
+
attr_reader :identifier
|
12
|
+
attr_reader :store
|
13
|
+
|
14
|
+
# Create a Graph with the given store and identifier.
|
15
|
+
#
|
16
|
+
# The constructor accepts a _store_ option,
|
17
|
+
# that will be used to store the graph data.
|
18
|
+
#
|
19
|
+
# Stores can be context-aware or unaware. Unaware stores take up
|
20
|
+
# (some) less space but cannot support features that require
|
21
|
+
# context, such as true merging/demerging of sub-graphs and
|
22
|
+
# provenance.
|
23
|
+
#
|
24
|
+
# The Graph constructor can take an identifier which identifies the Graph
|
25
|
+
# by name. If none is given, the graph is assigned a BNode for it's identifier.
|
26
|
+
# For more on named graphs, see: http://en.wikipedia.org/wiki/RDFLib
|
27
|
+
#
|
28
|
+
# @param [Hash] options:: Options
|
29
|
+
# <em>options[:store]</em>:: storage, defaults to a new ListStore instance
|
30
|
+
# <em>options[:identifier]</em>:: Identifier for this graph, Literal, BNode or URIRef
|
31
|
+
def initialize(options = {})
|
32
|
+
@nsbinding = {}
|
33
|
+
|
34
|
+
# Instantiate triple store
|
35
|
+
@store = case options[:store]
|
36
|
+
when AbstractStore then options[:store]
|
37
|
+
when :list_store then ListStore.new
|
38
|
+
when :memory_store then MemoryStore.new
|
39
|
+
else ListStore.new
|
40
|
+
end
|
41
|
+
|
42
|
+
@identifier = options[:identifier] || BNode.new
|
43
|
+
end
|
44
|
+
|
45
|
+
def inspect
|
46
|
+
"#{self.class}[id=#{identifier},store=#{store.inspect}]"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Hash of graph, based on graph type and identifier
|
50
|
+
def hash
|
51
|
+
[self.class.to_s, self.identifier].hash
|
52
|
+
end
|
53
|
+
|
54
|
+
def context_aware?; @context_aware; end
|
55
|
+
|
56
|
+
# Data Store interface
|
57
|
+
def nsbinding; @store.nsbinding; end
|
58
|
+
|
59
|
+
# Destroy the store identified by _configuration_ if supported
|
60
|
+
def destroy(configuration = nil)
|
61
|
+
@store.destroy(configuration)
|
62
|
+
self.freeze
|
63
|
+
end
|
64
|
+
|
65
|
+
# Commit changes to graph
|
66
|
+
def commit; @store.commit; end
|
67
|
+
|
68
|
+
# Rollback active transactions
|
69
|
+
def rollback; @store.rollback; end
|
70
|
+
|
71
|
+
# Open the graph store
|
72
|
+
#
|
73
|
+
# Might be necessary for stores that require opening a connection to a
|
74
|
+
# database or acquiring some resource.
|
75
|
+
def open(configuration, create=false)
|
76
|
+
@store.open(configuration, create)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Close the graph store
|
80
|
+
#
|
81
|
+
# Might be necessary for stores that require closing a connection to a
|
82
|
+
# database or releasing some resource.
|
83
|
+
def close(commit_pending_transaction=false)
|
84
|
+
@store.open(commit_pending_transaction)
|
85
|
+
end
|
86
|
+
|
87
|
+
##
|
88
|
+
# Exports the graph to RDF in N-Triples form.
|
89
|
+
#
|
90
|
+
# ==== Example
|
91
|
+
# g = Graph.new; g.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new); g.to_ntriples # => returns a string of the graph in N-Triples form
|
92
|
+
#
|
93
|
+
# @return [String]:: The graph in N-Triples.
|
94
|
+
#
|
95
|
+
# @author Tom Morris
|
96
|
+
def to_ntriples
|
97
|
+
triples.collect do |t|
|
98
|
+
t.to_ntriples
|
99
|
+
end * "\n" + "\n"
|
100
|
+
end
|
101
|
+
|
102
|
+
# Output graph using to_ntriples
|
103
|
+
def to_s; self.to_ntriples; end
|
104
|
+
|
105
|
+
##
|
106
|
+
# Exports the graph to RDF in RDF/XML form.
|
107
|
+
#
|
108
|
+
# @return [String]:: The RDF/XML graph
|
109
|
+
def to_rdfxml
|
110
|
+
replace_text = {}
|
111
|
+
rdfxml = ""
|
112
|
+
xml = builder = Builder::XmlMarkup.new(:target => rdfxml, :indent => 2)
|
113
|
+
|
114
|
+
extended_bindings = nsbinding.merge(
|
115
|
+
"rdf" => RDF_NS,
|
116
|
+
"rdfs" => RDFS_NS,
|
117
|
+
"xhv" => XHV_NS,
|
118
|
+
"xml" => XML_NS
|
119
|
+
)
|
120
|
+
rdf_attrs = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.xmlns_attr => ns.uri.to_s)}
|
121
|
+
uri_bindings = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.uri.to_s => ns.prefix)}
|
122
|
+
xml.instruct!
|
123
|
+
xml.rdf(:RDF, rdf_attrs) do
|
124
|
+
# Add statements for each subject
|
125
|
+
subjects.each do |s|
|
126
|
+
xml.rdf(:Description, (s.is_a?(BNode) ? "rdf:nodeID" : "rdf:about") => s) do
|
127
|
+
triples(Triple.new(s, nil, nil)) do |triple, context|
|
128
|
+
xml_args = triple.object.xml_args
|
129
|
+
if triple.object.is_a?(Literal) && triple.object.xmlliteral?
|
130
|
+
replace_text["__replace_with_#{triple.object.object_id}__"] = xml_args[0]
|
131
|
+
xml_args[0] = "__replace_with_#{triple.object.object_id}__"
|
132
|
+
end
|
133
|
+
xml.tag!(triple.predicate.to_qname(uri_bindings), *xml_args)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Perform literal substitutions
|
140
|
+
replace_text.each_pair do |match, value|
|
141
|
+
rdfxml.sub!(match, value)
|
142
|
+
end
|
143
|
+
|
144
|
+
rdfxml
|
145
|
+
end
|
146
|
+
|
147
|
+
##
|
148
|
+
# Bind a namespace to the graph.
|
149
|
+
#
|
150
|
+
# ==== Example
|
151
|
+
# g = Graph.new; g.bind(Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")) # => binds the Foaf namespace to g
|
152
|
+
#
|
153
|
+
# @param [String] namespace:: the namespace to bind
|
154
|
+
# @return [Namespace]:: The newly bound or pre-existing namespace.
|
155
|
+
def bind(namespace)
|
156
|
+
raise GraphException, "Can't bind #{namespace.inspect} as namespace" unless namespace.is_a?(Namespace)
|
157
|
+
@store.bind(namespace)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Namespace for prefix
|
161
|
+
def namespace(prefix); @store.namespace(prefix); end
|
162
|
+
|
163
|
+
# Prefix for namespace
|
164
|
+
def prefix(namespace); @store.prefix(namespace); end
|
165
|
+
|
166
|
+
# Number of Triples in the graph
|
167
|
+
def size; @store.size(self); end
|
168
|
+
|
169
|
+
# List of distinct subjects in graph
|
170
|
+
def subjects; @store.subjects(self); end
|
171
|
+
|
172
|
+
# List of distinct predicates in graph
|
173
|
+
def predicates; @store.predicates(self); end
|
174
|
+
|
175
|
+
# List of distinct objects in graph
|
176
|
+
def objects; @store.objects(self); end
|
177
|
+
|
178
|
+
# Indexed statement in serialized graph triples. Equivalent to graph.triples[item]
|
179
|
+
def [] (item); @store.item(item, self); end
|
180
|
+
|
181
|
+
# Adds a triple to a graph directly from the intended subject, predicate, and object.
|
182
|
+
#
|
183
|
+
# ==== Example
|
184
|
+
# g = Graph.new; g.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new) # => results in the triple being added to g; returns an array of g's triples
|
185
|
+
#
|
186
|
+
# @param [URIRef, BNode] subject:: the subject of the triple
|
187
|
+
# @param [URIRef] predicate:: the predicate of the triple
|
188
|
+
# @param [URIRef, BNode, Literal] object:: the object of the triple
|
189
|
+
# @return [Graph]:: Returns the graph
|
190
|
+
# @raise [Error]:: Checks parameter types and raises if they are incorrect.
|
191
|
+
def add_triple(subject, predicate, object)
|
192
|
+
self.add(Triple.new(subject, predicate, object))
|
193
|
+
self
|
194
|
+
end
|
195
|
+
|
196
|
+
##
|
197
|
+
# Adds an more extant triples to a graph. Delegates to Store.
|
198
|
+
#
|
199
|
+
# ==== Example
|
200
|
+
# g = Graph.new;
|
201
|
+
# t = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
|
202
|
+
# g << t
|
203
|
+
#
|
204
|
+
# @param [Triple] t:: the triple to be added to the graph
|
205
|
+
# @return [Graph]:: Returns the graph
|
206
|
+
def << (triple)
|
207
|
+
@store.add(triple, self)
|
208
|
+
self
|
209
|
+
end
|
210
|
+
|
211
|
+
##
|
212
|
+
# Adds one or more extant triples to a graph. Delegates to Store.
|
213
|
+
#
|
214
|
+
# ==== Example
|
215
|
+
# g = Graph.new;
|
216
|
+
# t1 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
|
217
|
+
# t2 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
|
218
|
+
# g.add(t1, t2, ...)
|
219
|
+
#
|
220
|
+
# @param [Triple] triples:: one or more triples. Last element may be a hash for options
|
221
|
+
# <em>options[:context]</em>:: Graph context in which to deposit triples, defaults to default_context or self
|
222
|
+
# @return [Graph]:: Returns the graph
|
223
|
+
def add(*triples)
|
224
|
+
options = triples.last.is_a?(Hash) ? triples.pop : {}
|
225
|
+
ctx = options[:context] || @default_context || self
|
226
|
+
triples.each {|t| @store.add(t, ctx)}
|
227
|
+
self
|
228
|
+
end
|
229
|
+
|
230
|
+
# Remove a triple from the graph. Delegates to store.
|
231
|
+
# Nil matches all triples and thus empties the graph
|
232
|
+
def remove(triple); @store.remove(triple, self); end
|
233
|
+
|
234
|
+
# Triples from graph, optionally matching subject, predicate, or object.
|
235
|
+
# Delegates to Store#triples.
|
236
|
+
#
|
237
|
+
# @param [Triple, nil] triple:: Triple to match, may be a patern triple or nil
|
238
|
+
# @return [Array]:: List of matched triples
|
239
|
+
def triples(triple = Triple.new(nil, nil, nil), &block) # :yields: triple, context
|
240
|
+
@store.triples(triple, self, &block) || []
|
241
|
+
end
|
242
|
+
alias_method :find, :triples
|
243
|
+
|
244
|
+
# Detect the presence of a BNode in the graph, either as a subject or an object
|
245
|
+
#
|
246
|
+
# @param [BNode] bn:: BNode to find
|
247
|
+
#
|
248
|
+
def has_bnode_identifier?(bn)
|
249
|
+
triples do |triple, context|
|
250
|
+
return true if triple.subject.eql?(bn) || triple.object.eql?(bn)
|
251
|
+
end
|
252
|
+
false
|
253
|
+
end
|
254
|
+
|
255
|
+
# Check to see if this graph contains the specified triple
|
256
|
+
def contains?(triple)
|
257
|
+
@store.contains?(triple, self)
|
258
|
+
end
|
259
|
+
|
260
|
+
# Get all BNodes with usage count used within graph
|
261
|
+
def bnodes
|
262
|
+
@store.bnodes(self)
|
263
|
+
end
|
264
|
+
|
265
|
+
# Get list of subjects having rdf:type == object
|
266
|
+
#
|
267
|
+
# @param [Resource, Regexp, String] object:: Type resource
|
268
|
+
def get_by_type(object)
|
269
|
+
triples(Triple.new(nil, RDF_TYPE, object)).map {|t, ctx| t.subject}
|
270
|
+
end
|
271
|
+
|
272
|
+
# Merge a graph into this graph
|
273
|
+
def merge!(graph)
|
274
|
+
raise GraphException.new("merge without a graph") unless graph.is_a?(Graph)
|
275
|
+
|
276
|
+
# Map BNodes from source Graph to new BNodes
|
277
|
+
bn = graph.bnodes
|
278
|
+
bn.keys.each {|k| bn[k] = BNode.new}
|
279
|
+
|
280
|
+
graph.triples do |triple, context|
|
281
|
+
# If triple contains bnodes, remap to new values
|
282
|
+
if triple.subject.is_a?(BNode) || triple.object.is_a?(BNode)
|
283
|
+
triple = triple.clone
|
284
|
+
triple.subject = bn[triple.subject] if triple.subject.is_a?(BNode)
|
285
|
+
triple.object = bn[triple.object] if triple.object.is_a?(BNode)
|
286
|
+
end
|
287
|
+
self << triple
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
# Two graphs are equal if each is an instance of the other, considering BNode equivalence.
|
292
|
+
# This may be done by creating a new graph an substituting each permutation of BNode identifiers
|
293
|
+
# from self to other until every permutation is exhausted, or a textual equivalence is found
|
294
|
+
# after sorting each graph.
|
295
|
+
#
|
296
|
+
# We just follow Python RDFlib's lead and do a simple comparison
|
297
|
+
def eql? (other)
|
298
|
+
#puts "eql? size #{self.size} vs #{other.size}"
|
299
|
+
return false if !other.is_a?(Graph) || self.size != other.size
|
300
|
+
return false unless other.identifier.to_s == identifier.to_s
|
301
|
+
|
302
|
+
bn_self = bnodes.values.sort
|
303
|
+
bn_other = other.bnodes.values.sort
|
304
|
+
#puts "eql? bnodes '#{bn_self.to_sentence}' vs '#{bn_other.to_sentence}'"
|
305
|
+
return false unless bn_self == bn_other
|
306
|
+
|
307
|
+
# Check each triple to see if it's contained in the other graph
|
308
|
+
triples do |t, ctx|
|
309
|
+
next if t.subject.is_a?(BNode) || t.object.is_a?(BNode)
|
310
|
+
#puts "eql? contains '#{t.to_ntriples}'"
|
311
|
+
return false unless other.contains?(t)
|
312
|
+
end
|
313
|
+
true
|
314
|
+
end
|
315
|
+
|
316
|
+
alias_method :==, :eql?
|
317
|
+
end
|
318
|
+
|
319
|
+
# Parse source into Graph.
|
320
|
+
#
|
321
|
+
# Merges results into a common Graph
|
322
|
+
#
|
323
|
+
# @param [IO, String] stream:: the RDF IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
|
324
|
+
# @param [String] uri:: the URI of the document
|
325
|
+
# @param [Hash] options:: Options from
|
326
|
+
# <em>options[:debug]</em>:: Array to place debug messages
|
327
|
+
# <em>options[:type]</em>:: One of _rdfxml_, _html_, or _n3_
|
328
|
+
# <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
|
329
|
+
# @return [Graph]:: Returns the graph containing parsed triples
|
330
|
+
def parse(stream, uri, options = {}, &block) # :yields: triple
|
331
|
+
Parser.parse(stream, uri, options.merge(:graph => self), &block)
|
332
|
+
end
|
333
|
+
end
|
@@ -0,0 +1,340 @@
|
|
1
|
+
module RdfContext
|
2
|
+
# An RDF Literal, with value, encoding and language elements.
|
3
|
+
class Literal
|
4
|
+
class Encoding
|
5
|
+
attr_reader :value
|
6
|
+
|
7
|
+
# New Encoding for a literal, typed, untyped or XMLLiteral
|
8
|
+
def initialize(value)
|
9
|
+
@value = URIRef.new(value.to_s) if value
|
10
|
+
end
|
11
|
+
|
12
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#int")</tt>
|
13
|
+
def self.integer
|
14
|
+
@integer ||= coerce "http://www.w3.org/2001/XMLSchema#int"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#float")</tt>
|
18
|
+
def self.float
|
19
|
+
@float ||= coerce "http://www.w3.org/2001/XMLSchema#float"
|
20
|
+
end
|
21
|
+
|
22
|
+
# Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#string")</tt>
|
23
|
+
def self.string
|
24
|
+
@string ||= coerce "http://www.w3.org/2001/XMLSchema#string"
|
25
|
+
end
|
26
|
+
|
27
|
+
# Create from URI, empty or nil string
|
28
|
+
def self.coerce(string_or_nil)
|
29
|
+
if string_or_nil.nil? || string_or_nil == ''
|
30
|
+
the_null_encoding
|
31
|
+
elsif xmlliteral == string_or_nil.to_s
|
32
|
+
xmlliteral
|
33
|
+
else
|
34
|
+
new string_or_nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def inspect
|
39
|
+
to_s()
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.the_null_encoding
|
43
|
+
@the_null_encoding ||= Null.new(nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.xmlliteral
|
47
|
+
@xmlliteral ||= XMLLiteral.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Compare against another encoding, or a URI of a literal type
|
51
|
+
def ==(other)
|
52
|
+
case other
|
53
|
+
when String
|
54
|
+
other == @value.to_s
|
55
|
+
when self.class
|
56
|
+
other.value.to_s == @value.to_s
|
57
|
+
else
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Generate hash of type to determine uniqueness
|
63
|
+
def hash
|
64
|
+
@value.hash
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_s
|
68
|
+
@value.to_s
|
69
|
+
end
|
70
|
+
|
71
|
+
# Serialize literal, adding datatype and language elements, if present.
|
72
|
+
# XMLLiteral and String values are RDF-escaped.
|
73
|
+
def format_as_n3(content, lang)
|
74
|
+
quoted_content = "\"#{content.to_s.rdf_escape}\"^^<#{value}>"
|
75
|
+
end
|
76
|
+
|
77
|
+
# Serialize literal to TriX
|
78
|
+
def format_as_trix(content, lang)
|
79
|
+
lang = " xml:lang=\"#{lang}\"" if lang
|
80
|
+
"<typedLiteral datatype=\"#{@value}\"#{lang}>#{content}</typedLiteral>"
|
81
|
+
end
|
82
|
+
|
83
|
+
# Return content and hash appropriate for encoding in XML
|
84
|
+
#
|
85
|
+
# ==== Example
|
86
|
+
# Encoding.string.xml_args("foo", "en-US") => ["foo", {"rdf:datatype" => "xs:string"}]
|
87
|
+
def xml_args(content, lang)
|
88
|
+
hash = {"rdf:datatype" => @value.to_s}
|
89
|
+
[content.to_s, hash]
|
90
|
+
end
|
91
|
+
|
92
|
+
# Compare literal contents, ignore language
|
93
|
+
def compare_contents(a, b, same_lang)
|
94
|
+
a == b
|
95
|
+
end
|
96
|
+
|
97
|
+
# Encode literal contents
|
98
|
+
def encode_contents(contents, options)
|
99
|
+
contents
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# The null encoding
|
104
|
+
class Null < Encoding
|
105
|
+
def to_s
|
106
|
+
''
|
107
|
+
end
|
108
|
+
|
109
|
+
# Format content for n3/N-Triples. Quote an RDF-escape and include language
|
110
|
+
def format_as_n3(content, lang)
|
111
|
+
"\"#{content.to_s.rdf_escape}\"" + (lang ? "@#{lang}" : "")
|
112
|
+
end
|
113
|
+
|
114
|
+
# Format content for TriX
|
115
|
+
def format_as_trix(content, lang)
|
116
|
+
if lang
|
117
|
+
"<plainLiteral xml:lang=\"#{lang}\"\>#{content}</plainLiteral>"
|
118
|
+
else
|
119
|
+
"<plainLiteral>#{content}</plainLiteral>"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Return content and hash appropriate for encoding in XML
|
124
|
+
#
|
125
|
+
# ==== Example
|
126
|
+
# Encoding.the_null_encoding.xml_args("foo", "en-US") => ["foo", {"xml:lang" => "en-US"}]
|
127
|
+
def xml_args(content, lang)
|
128
|
+
hash = {}
|
129
|
+
hash["xml:lang"] = lang if lang
|
130
|
+
[content, hash]
|
131
|
+
end
|
132
|
+
|
133
|
+
# Compare literal contents, requiring languages to match
|
134
|
+
def compare_contents(a, b, same_lang)
|
135
|
+
a == b && same_lang
|
136
|
+
end
|
137
|
+
|
138
|
+
def inspect
|
139
|
+
"<Literal::Encoding::Null>"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class XMLLiteral < Encoding
|
144
|
+
# Compare XMLLiterals
|
145
|
+
#
|
146
|
+
# Nokogiri doesn't do a deep compare of elements
|
147
|
+
#
|
148
|
+
# Convert node-sets to hash using ActiveSupport::XmlMini and compare hashes.
|
149
|
+
def compare_contents(a, b, same_lang)
|
150
|
+
begin
|
151
|
+
a_hash = ActiveSupport::XmlMini.parse("<foo>#{a}</foo>")
|
152
|
+
b_hash = ActiveSupport::XmlMini.parse("<foo>#{b}</foo>")
|
153
|
+
a_hash == b_hash
|
154
|
+
rescue
|
155
|
+
super
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def format_as_n3(content, lang)
|
160
|
+
"\"#{content.to_s.rdf_escape}\"^^<#{value}>"
|
161
|
+
end
|
162
|
+
|
163
|
+
def format_as_trix(content, lang)
|
164
|
+
"<typedLiteral datatype=\"#{@value}\">#{content}</typedLiteral>"
|
165
|
+
end
|
166
|
+
|
167
|
+
def xml_args(content, lang)
|
168
|
+
hash = {"rdf:parseType" => "Literal"}
|
169
|
+
[content, hash]
|
170
|
+
end
|
171
|
+
|
172
|
+
# Map namespaces from context to each top-level element found within node-set
|
173
|
+
def encode_contents(contents, options)
|
174
|
+
#puts "encode_contents: '#{contents}'"
|
175
|
+
if contents.is_a?(String)
|
176
|
+
ns_hash = options[:namespaces].values.inject({}) {|h, ns| h.merge(ns.xmlns_hash)}
|
177
|
+
ns_strs = []
|
178
|
+
ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
|
179
|
+
|
180
|
+
# Add inherited namespaces to created root element so that they're inherited to sub-elements
|
181
|
+
contents = Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{contents}</foo>").root.children
|
182
|
+
end
|
183
|
+
|
184
|
+
# Add already mapped namespaces and language
|
185
|
+
@contents = contents.map do |c|
|
186
|
+
c = Nokogiri::XML.parse(c.copy(true).to_s) if c.is_a?(LibXML::XML::Node)
|
187
|
+
if c.is_a?(Nokogiri::XML::Element)
|
188
|
+
# Gather namespaces from self and decendant nodes
|
189
|
+
c.traverse do |n|
|
190
|
+
ns = n.namespace
|
191
|
+
next unless ns
|
192
|
+
prefix = ns.prefix ? "xmlns:#{ns.prefix}" : "xmlns"
|
193
|
+
c[prefix] = ns.href unless c.namespaces[prefix]
|
194
|
+
end
|
195
|
+
|
196
|
+
# Add lanuage
|
197
|
+
if options[:language] && c["lang"].to_s.empty?
|
198
|
+
c["xml:lang"] = options[:language]
|
199
|
+
end
|
200
|
+
end
|
201
|
+
c.to_html
|
202
|
+
end.join("")
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class Language
|
207
|
+
attr_accessor :value
|
208
|
+
def initialize(string)
|
209
|
+
@value = string.to_s.downcase
|
210
|
+
end
|
211
|
+
|
212
|
+
def clean(string)
|
213
|
+
case string
|
214
|
+
when "eng"; "en"
|
215
|
+
else string
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def == (other)
|
220
|
+
case other
|
221
|
+
when String
|
222
|
+
other == @value
|
223
|
+
when self.class
|
224
|
+
other.value == @value
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def to_s; @value; end
|
229
|
+
end
|
230
|
+
|
231
|
+
attr_accessor :contents, :encoding, :lang
|
232
|
+
|
233
|
+
# Create a new Literal. Optinally pass a namespaces hash
|
234
|
+
# for use in applying to rdf::XMLLiteral values.
|
235
|
+
def initialize(contents, encoding, options = {})
|
236
|
+
unless encoding.is_a?(Encoding)
|
237
|
+
raise TypeError, "#{encoding.inspect} should be an instance of Encoding"
|
238
|
+
end
|
239
|
+
@encoding = encoding
|
240
|
+
lang = options[:language]
|
241
|
+
@lang = Language.new(lang) if lang
|
242
|
+
options = {:namespaces => {}}.merge(options)
|
243
|
+
|
244
|
+
@contents = @encoding.encode_contents(contents, options)
|
245
|
+
end
|
246
|
+
|
247
|
+
# Create literal from a string that is already N3 encoded.
|
248
|
+
def self.n3_encoded(contents, language, encoding = nil)
|
249
|
+
encoding = encoding.nil? ? Encoding.the_null_encoding : Encoding.coerce(encoding)
|
250
|
+
options = {}
|
251
|
+
options[:language] = language if language
|
252
|
+
#puts "encoded: #{contents.dump}"
|
253
|
+
contents = contents.rdf_unescape
|
254
|
+
#puts "unencoded: #{contents.dump}"
|
255
|
+
new(contents, encoding, options)
|
256
|
+
end
|
257
|
+
|
258
|
+
# Create an un-typed literal with a language
|
259
|
+
def self.untyped(contents, language = nil)
|
260
|
+
options = {}
|
261
|
+
options[:language] = language if language
|
262
|
+
new(contents, Encoding.the_null_encoding, options)
|
263
|
+
end
|
264
|
+
|
265
|
+
# Create a typed literal
|
266
|
+
# Options include:
|
267
|
+
# _namespaces_:: A hash of namespace entries (for XMLLiteral)
|
268
|
+
def self.typed(contents, encoding, options = {})
|
269
|
+
encoding = Encoding.coerce(encoding)
|
270
|
+
new(contents, encoding, options)
|
271
|
+
end
|
272
|
+
|
273
|
+
# Create a literal appropriate for type of object by datatype introspection
|
274
|
+
def self.build_from(object)
|
275
|
+
new(object.to_s, infer_encoding_for(object))
|
276
|
+
end
|
277
|
+
|
278
|
+
# Infer the proper XML datatype for the given object
|
279
|
+
def self.infer_encoding_for(object)
|
280
|
+
case object
|
281
|
+
when Integer then Encoding.new("http://www.w3.org/2001/XMLSchema#int")
|
282
|
+
when Float then Encoding.new("http://www.w3.org/2001/XMLSchema#float")
|
283
|
+
when Time then Encoding.new("http://www.w3.org/2001/XMLSchema#time")
|
284
|
+
when DateTime then Encoding.new("http://www.w3.org/2001/XMLSchema#dateTime")
|
285
|
+
when Date then Encoding.new("http://www.w3.org/2001/XMLSchema#date")
|
286
|
+
else Encoding.new("http://www.w3.org/2001/XMLSchema#string")
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
class << self
|
291
|
+
protected :new
|
292
|
+
end
|
293
|
+
|
294
|
+
# Compare literal with another literal or a string.
|
295
|
+
# If a string is passed, only contents must match.
|
296
|
+
# Otherwise, compare encoding types, contents and languages.
|
297
|
+
def ==(other)
|
298
|
+
case other
|
299
|
+
when String then other == self.contents
|
300
|
+
when self.class
|
301
|
+
other.encoding == @encoding &&
|
302
|
+
@encoding.compare_contents(self.contents, other.contents, other.lang == @lang)
|
303
|
+
else false
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def hash
|
308
|
+
[@contents, @encoding, @lang].hash
|
309
|
+
end
|
310
|
+
|
311
|
+
# Output literal in N3 format
|
312
|
+
def to_n3
|
313
|
+
encoding.format_as_n3(self.contents, @lang)
|
314
|
+
end
|
315
|
+
alias_method :to_ntriples, :to_n3
|
316
|
+
|
317
|
+
# Output literal in TriX format
|
318
|
+
def to_trix
|
319
|
+
encoding.format_as_trix(@contents, @lang)
|
320
|
+
end
|
321
|
+
|
322
|
+
# Return content and hash appropriate for encoding in XML
|
323
|
+
#
|
324
|
+
# ==== Example
|
325
|
+
# Encoding.the_null_encoding.xml_args("foo", "en-US") => ["foo", {"xml:lang" => "en-US"}]
|
326
|
+
def xml_args
|
327
|
+
encoding.xml_args( @contents, @lang)
|
328
|
+
end
|
329
|
+
|
330
|
+
# Is this an XMLLiteral?
|
331
|
+
def xmlliteral?
|
332
|
+
encoding.is_a?(XMLLiteral)
|
333
|
+
end
|
334
|
+
|
335
|
+
# Output literal contents as a string
|
336
|
+
def to_s
|
337
|
+
self.contents.to_s
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|