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