rdf-tabular 1.0.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +62 -44
- data/UNLICENSE +1 -1
- data/VERSION +1 -1
- data/etc/csvw.jsonld +135 -50
- data/etc/doap.csv +1 -1
- data/etc/doap.csv-metadata.json +1 -1
- data/etc/doap.ttl +14 -13
- data/etc/earl.html +648 -648
- data/etc/earl.jsonld +691 -691
- data/etc/earl.ttl +846 -846
- data/lib/rdf/tabular.rb +3 -3
- data/lib/rdf/tabular/csvw.rb +626 -182
- data/lib/rdf/tabular/format.rb +8 -6
- data/lib/rdf/tabular/literal.rb +1 -1
- data/lib/rdf/tabular/metadata.rb +63 -58
- data/lib/rdf/tabular/reader.rb +32 -20
- data/lib/rdf/tabular/uax35.rb +1 -1
- data/spec/data/countries-minimal.json +38 -0
- data/spec/data/countries-minimal.ttl +36 -0
- data/spec/data/countries-standard.json +86 -0
- data/spec/data/countries-standard.ttl +75 -0
- data/spec/data/countries.csv +4 -0
- data/spec/data/countries.csv-minimal.json +16 -0
- data/spec/data/countries.csv-minimal.ttl +19 -0
- data/spec/data/countries.csv-standard.json +33 -0
- data/spec/data/countries.csv-standard.ttl +44 -0
- data/spec/data/countries.html +88 -0
- data/spec/data/countries.json +53 -0
- data/spec/data/countries_embed-minimal.json +38 -0
- data/spec/data/countries_embed-minimal.ttl +36 -0
- data/spec/data/countries_embed-standard.json +86 -0
- data/spec/data/countries_embed-standard.ttl +75 -0
- data/spec/data/countries_embed.html +88 -0
- data/spec/data/countries_html-minimal.json +38 -0
- data/spec/data/countries_html-minimal.ttl +36 -0
- data/spec/data/countries_html-standard.json +86 -0
- data/spec/data/countries_html-standard.ttl +75 -0
- data/spec/data/country-codes-and-names-minimal.json +19 -0
- data/spec/data/country-codes-and-names-minimal.ttl +22 -0
- data/spec/data/country-codes-and-names-standard.json +47 -0
- data/spec/data/country-codes-and-names-standard.ttl +45 -0
- data/spec/data/country-codes-and-names.csv +5 -0
- data/spec/data/country_slice.csv +4 -0
- data/spec/data/junior-roles.csv +3 -0
- data/spec/data/junior-roles.json +54 -0
- data/spec/data/roles-minimal.json +32 -0
- data/spec/data/roles-minimal.ttl +36 -0
- data/spec/data/roles-standard.json +56 -0
- data/spec/data/roles-standard.ttl +66 -0
- data/spec/data/roles.json +23 -0
- data/spec/data/senior-roles.csv +3 -0
- data/spec/data/senior-roles.json +52 -0
- data/spec/data/test232-metadata.json +10 -0
- data/spec/data/test232.csv +3 -0
- data/spec/data/tree-ops-atd.json +1 -0
- data/spec/data/tree-ops-ext-minimal.json +42 -0
- data/spec/data/tree-ops-ext-minimal.ttl +34 -0
- data/spec/data/tree-ops-ext-standard.json +93 -0
- data/spec/data/tree-ops-ext-standard.ttl +82 -0
- data/spec/data/tree-ops-ext.csv +4 -0
- data/spec/data/tree-ops-ext.json +81 -0
- data/spec/data/tree-ops-minimal.json +18 -0
- data/spec/data/tree-ops-minimal.ttl +14 -0
- data/spec/data/tree-ops-standard.json +44 -0
- data/spec/data/tree-ops-standard.ttl +44 -0
- data/spec/data/tree-ops-virtual-minimal.json +32 -0
- data/spec/data/tree-ops-virtual-minimal.ttl +25 -0
- data/spec/data/tree-ops-virtual-standard.json +49 -0
- data/spec/data/tree-ops-virtual-standard.ttl +49 -0
- data/spec/data/tree-ops-virtual.json +48 -0
- data/spec/data/tree-ops.csv +3 -0
- data/spec/data/tree-ops.csv-metadata.json +43 -0
- data/spec/data/tree-ops.html +54 -0
- data/spec/data/tree-ops.tsv +3 -0
- data/spec/format_spec.rb +1 -1
- data/spec/metadata_spec.rb +85 -8
- data/spec/reader_spec.rb +2 -2
- data/spec/suite_helper.rb +2 -2
- data/spec/suite_spec.rb +4 -5
- metadata +147 -37
- data/lib/rdf/tabular/json.rb +0 -0
- data/spec/w3c-csvw +0 -1
data/lib/rdf/tabular/reader.rb
CHANGED
@@ -5,7 +5,7 @@ module RDF::Tabular
|
|
5
5
|
##
|
6
6
|
# A Tabular Data to RDF parser in Ruby.
|
7
7
|
#
|
8
|
-
# @author [Gregg Kellogg](
|
8
|
+
# @author [Gregg Kellogg](https://greggkellogg.net/)
|
9
9
|
class Reader < RDF::Reader
|
10
10
|
format Format
|
11
11
|
include RDF::Util::Logger
|
@@ -22,24 +22,34 @@ module RDF::Tabular
|
|
22
22
|
|
23
23
|
##
|
24
24
|
# Writer options
|
25
|
-
# @see
|
25
|
+
# @see https://www.rubydoc.info/github/ruby-rdf/rdf/RDF/Writer#options-class_method
|
26
26
|
def self.options
|
27
27
|
super + [
|
28
28
|
RDF::CLI::Option.new(
|
29
29
|
symbol: :metadata,
|
30
30
|
datatype: RDF::URI,
|
31
|
+
control: :url2,
|
31
32
|
on: ["--metadata URI"],
|
32
33
|
description: "user supplied metadata, merged on top of extracted metadata. If provided as a URL, Metadata is loade from that location.") {|arg| RDF::URI(arg)},
|
33
34
|
RDF::CLI::Option.new(
|
34
35
|
symbol: :minimal,
|
36
|
+
control: :checkbox,
|
35
37
|
datatype: TrueClass,
|
36
38
|
on: ["--minimal"],
|
37
39
|
description: "Includes only the information gleaned from the cells of the tabular data.") {true},
|
38
40
|
RDF::CLI::Option.new(
|
39
41
|
symbol: :noProv,
|
40
42
|
datatype: TrueClass,
|
43
|
+
control: :checkbox,
|
41
44
|
on: ["--no-prov"],
|
42
45
|
description: "do not output optional provenance information.") {true},
|
46
|
+
RDF::CLI::Option.new(
|
47
|
+
symbol: :decode_uri,
|
48
|
+
datatype: TrueClass,
|
49
|
+
control: :checkbox,
|
50
|
+
on: ["--decode-uri"],
|
51
|
+
description: "decode %-encodings in the result of a URI Template operation."
|
52
|
+
)
|
43
53
|
]
|
44
54
|
end
|
45
55
|
|
@@ -51,16 +61,18 @@ module RDF::Tabular
|
|
51
61
|
# or an Array used as an internalized array of arrays
|
52
62
|
# @param [Hash{Symbol => Object}] options
|
53
63
|
# any additional options (see `RDF::Reader#initialize`)
|
64
|
+
# @option options [Boolean] :decode_uri
|
65
|
+
# Decode %-encodings in the result of a URI Template operation.
|
66
|
+
# @option options [Array<Hash>] :fks_referencing_table
|
67
|
+
# When called with Table metadata, a list of the foreign keys referencing this table
|
54
68
|
# @option options [Metadata, Hash, String, RDF::URI] :metadata user supplied metadata, merged on top of extracted metadata. If provided as a URL, Metadata is loade from that location
|
55
69
|
# @option options [Boolean] :minimal includes only the information gleaned from the cells of the tabular data
|
56
70
|
# @option options [Boolean] :noProv do not output optional provenance information
|
57
|
-
# @option optinons [Array<Hash>] :fks_referencing_table
|
58
|
-
# When called with Table metadata, a list of the foreign keys referencing this table
|
59
71
|
# @yield [reader] `self`
|
60
72
|
# @yieldparam [RDF::Reader] reader
|
61
73
|
# @yieldreturn [void] ignored
|
62
74
|
# @raise [RDF::ReaderError] if the CSV document cannot be loaded
|
63
|
-
def initialize(input = $stdin, options
|
75
|
+
def initialize(input = $stdin, **options, &block)
|
64
76
|
super do
|
65
77
|
# Base would be how we are to take this
|
66
78
|
@options[:base] ||= base_uri.to_s if base_uri
|
@@ -86,7 +98,7 @@ module RDF::Tabular
|
|
86
98
|
# If input is JSON, then the input is the metadata
|
87
99
|
content_type = @input.respond_to?(:content_type) ? @input.content_type : ""
|
88
100
|
if @options[:base] =~ /\.json(?:ld)?$/ || content_type =~ %r(application/(csvm\+|ld\+)?json)
|
89
|
-
@metadata = Metadata.new(@input,
|
101
|
+
@metadata = Metadata.new(@input, filenames: @options[:base], **@options)
|
90
102
|
# If @metadata is for a Table, turn it into a TableGroup
|
91
103
|
@metadata = @metadata.to_table_group if @metadata.is_a?(Table)
|
92
104
|
@metadata.normalize!
|
@@ -99,7 +111,7 @@ module RDF::Tabular
|
|
99
111
|
def script.content_type; "application/csvm+json"; end
|
100
112
|
log_debug("Reader#initialize") {"Process HTML script block"}
|
101
113
|
@input = script
|
102
|
-
@metadata = Metadata.new(@input,
|
114
|
+
@metadata = Metadata.new(@input, filenames: @options[:base], **@options)
|
103
115
|
# If @metadata is for a Table, turn it into a TableGroup
|
104
116
|
@metadata = @metadata.to_table_group if @metadata.is_a?(Table)
|
105
117
|
@metadata.normalize!
|
@@ -116,7 +128,7 @@ module RDF::Tabular
|
|
116
128
|
dialect.separator = "\t" if (input.content_type == "text/tsv" rescue nil)
|
117
129
|
embed_options = @options.dup
|
118
130
|
embed_options[:lang] = dialect_metadata.lang if dialect_metadata.lang
|
119
|
-
embedded_metadata = dialect.embedded_metadata(input, @options[:metadata], embed_options)
|
131
|
+
embedded_metadata = dialect.embedded_metadata(input, @options[:metadata], **embed_options)
|
120
132
|
|
121
133
|
if (@metadata = @options[:metadata]) && @metadata.tableSchema
|
122
134
|
@metadata.verify_compatible!(embedded_metadata)
|
@@ -133,7 +145,7 @@ module RDF::Tabular
|
|
133
145
|
else
|
134
146
|
# It's tabluar data. Find metadata and proceed as if it was specified in the first place
|
135
147
|
@options[:original_input] = @input unless @options[:metadata]
|
136
|
-
@input = @metadata = Metadata.for_input(@input,
|
148
|
+
@input = @metadata = Metadata.for_input(@input, **@options).normalize!
|
137
149
|
end
|
138
150
|
|
139
151
|
log_debug("Reader#initialize") {"input: #{input}, metadata: #{metadata.inspect}"}
|
@@ -183,7 +195,7 @@ module RDF::Tabular
|
|
183
195
|
if options[:original_input] && !input.describes_file?(options[:base_uri])
|
184
196
|
table_resource = RDF::Node.new
|
185
197
|
add_statement(0, table_group, CSVW.table, table_resource) unless minimal?
|
186
|
-
Reader.new(options[:original_input], options.merge(
|
198
|
+
Reader.new(options[:original_input], **options.merge(
|
187
199
|
metadata: input.tables.first,
|
188
200
|
base: input.tables.first.url,
|
189
201
|
no_found_metadata: true,
|
@@ -202,7 +214,7 @@ module RDF::Tabular
|
|
202
214
|
end.flatten.compact
|
203
215
|
table_resource = table.id || RDF::Node.new
|
204
216
|
add_statement(0, table_group, CSVW.table, table_resource) unless minimal?
|
205
|
-
Reader.open(table.url, options.merge(
|
217
|
+
Reader.open(table.url, **options.merge(
|
206
218
|
metadata: table,
|
207
219
|
base: table.url,
|
208
220
|
no_found_metadata: true,
|
@@ -222,7 +234,7 @@ module RDF::Tabular
|
|
222
234
|
activity = RDF::Node.new
|
223
235
|
add_statement(0, table_group, RDF::Vocab::PROV.wasGeneratedBy, activity)
|
224
236
|
add_statement(0, activity, RDF.type, RDF::Vocab::PROV.Activity)
|
225
|
-
add_statement(0, activity, RDF::Vocab::PROV.wasAssociatedWith, RDF::URI("
|
237
|
+
add_statement(0, activity, RDF::Vocab::PROV.wasAssociatedWith, RDF::URI("https://rubygems.org/gems/rdf-tabular"))
|
226
238
|
add_statement(0, activity, RDF::Vocab::PROV.startedAtTime, RDF::Literal::DateTime.new(start_time))
|
227
239
|
add_statement(0, activity, RDF::Vocab::PROV.endedAtTime, RDF::Literal::DateTime.new(Time.now))
|
228
240
|
|
@@ -418,9 +430,9 @@ module RDF::Tabular
|
|
418
430
|
|
419
431
|
res = if io
|
420
432
|
::JSON::dump_default_options = json_state
|
421
|
-
::JSON.dump(self.send(hash_fn, options), io)
|
433
|
+
::JSON.dump(self.send(hash_fn, **options), io)
|
422
434
|
else
|
423
|
-
hash = self.send(hash_fn, options)
|
435
|
+
hash = self.send(hash_fn, **options)
|
424
436
|
::JSON.generate(hash, json_state)
|
425
437
|
end
|
426
438
|
|
@@ -440,7 +452,7 @@ module RDF::Tabular
|
|
440
452
|
#
|
441
453
|
# @param [Hash{Symbol => Object}] options
|
442
454
|
# @return [Hash, Array]
|
443
|
-
def to_hash(options
|
455
|
+
def to_hash(**options)
|
444
456
|
# Construct metadata from that passed from file open, along with information from the file.
|
445
457
|
if input.is_a?(Metadata)
|
446
458
|
log_debug("each_statement: metadata") {input.inspect}
|
@@ -464,13 +476,13 @@ module RDF::Tabular
|
|
464
476
|
table_group['tables'] = tables
|
465
477
|
|
466
478
|
if options[:original_input] && !input.describes_file?(options[:base_uri])
|
467
|
-
Reader.new(options[:original_input], options.merge(
|
479
|
+
Reader.new(options[:original_input], **options.merge(
|
468
480
|
metadata: input.tables.first,
|
469
481
|
base: input.tables.first.url,
|
470
482
|
minimal: minimal?,
|
471
483
|
no_found_metadata: true,
|
472
484
|
)) do |r|
|
473
|
-
case t = r.to_hash(options)
|
485
|
+
case t = r.to_hash(**options)
|
474
486
|
when Array then tables += t unless input.tables.first.suppressOutput
|
475
487
|
when Hash then tables << t unless input.tables.first.suppressOutput
|
476
488
|
end
|
@@ -478,13 +490,13 @@ module RDF::Tabular
|
|
478
490
|
else
|
479
491
|
input.each_table do |table|
|
480
492
|
next if table.suppressOutput && !validate?
|
481
|
-
Reader.open(table.url, options.merge(
|
493
|
+
Reader.open(table.url, **options.merge(
|
482
494
|
metadata: table,
|
483
495
|
base: table.url,
|
484
496
|
minimal: minimal?,
|
485
497
|
no_found_metadata: true,
|
486
498
|
)) do |r|
|
487
|
-
case t = r.to_hash(options)
|
499
|
+
case t = r.to_hash(**options)
|
488
500
|
when Array then tables += t unless table.suppressOutput
|
489
501
|
when Hash then tables << t unless table.suppressOutput
|
490
502
|
end
|
@@ -557,7 +569,7 @@ module RDF::Tabular
|
|
557
569
|
co['@id'] = subject.to_s unless subject == 'null'
|
558
570
|
prop = case cell.propertyUrl
|
559
571
|
when RDF.type then '@type'
|
560
|
-
when nil then
|
572
|
+
when nil then CGI.unescape(column.name) # Use URI-decoded name
|
561
573
|
else
|
562
574
|
# Compact the property to a term or prefixed name
|
563
575
|
metadata.context.compact_iri(cell.propertyUrl, vocab: true)
|
data/lib/rdf/tabular/uax35.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"@id": "http://example.org/countries.csv#AD",
|
4
|
+
"http://www.geonames.org/ontology#countryCode": "AD",
|
5
|
+
"schema:latitude": 42.546245,
|
6
|
+
"schema:longitude": 1.601554,
|
7
|
+
"schema:name": "Andorra"
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"@id": "http://example.org/countries.csv#AE",
|
11
|
+
"http://www.geonames.org/ontology#countryCode": "AE",
|
12
|
+
"schema:latitude": 23.424076,
|
13
|
+
"schema:longitude": 53.847818,
|
14
|
+
"schema:name": "United Arab Emirates"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"@id": "http://example.org/countries.csv#AF",
|
18
|
+
"http://www.geonames.org/ontology#countryCode": "AF",
|
19
|
+
"schema:latitude": 33.93911,
|
20
|
+
"schema:longitude": 67.709953,
|
21
|
+
"schema:name": "Afghanistan"
|
22
|
+
},
|
23
|
+
{
|
24
|
+
"countryRef": "http://example.org/countries.csv#AF",
|
25
|
+
"year": "1960",
|
26
|
+
"population": 9616353
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"countryRef": "http://example.org/countries.csv#AF",
|
30
|
+
"year": "1961",
|
31
|
+
"population": 9799379
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"countryRef": "http://example.org/countries.csv#AF",
|
35
|
+
"year": "1962",
|
36
|
+
"population": 9989846
|
37
|
+
}
|
38
|
+
]
|
@@ -0,0 +1,36 @@
|
|
1
|
+
@prefix geo: <http://www.geonames.org/ontology#> .
|
2
|
+
@prefix schema: <http://schema.org/> .
|
3
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
4
|
+
|
5
|
+
<http://example.org/countries.csv#AD> schema:latitude "42.546245"^^xsd:double;
|
6
|
+
schema:longitude "1.601554"^^xsd:double;
|
7
|
+
schema:name "Andorra";
|
8
|
+
geo:countryCode "AD" .
|
9
|
+
|
10
|
+
<http://example.org/countries.csv#AE> schema:latitude "23.424076"^^xsd:double;
|
11
|
+
schema:longitude "53.847818"^^xsd:double;
|
12
|
+
schema:name "United Arab Emirates";
|
13
|
+
geo:countryCode "AE" .
|
14
|
+
|
15
|
+
<http://example.org/countries.csv#AF> schema:latitude "33.93911"^^xsd:double;
|
16
|
+
schema:longitude "67.709953"^^xsd:double;
|
17
|
+
schema:name "Afghanistan";
|
18
|
+
geo:countryCode "AF" .
|
19
|
+
|
20
|
+
[
|
21
|
+
<http://example.org/country_slice.csv#countryRef> <http://example.org/countries.csv#AF>;
|
22
|
+
<http://example.org/country_slice.csv#population> 9616353;
|
23
|
+
<http://example.org/country_slice.csv#year> "1960"^^xsd:gYear
|
24
|
+
] .
|
25
|
+
|
26
|
+
[
|
27
|
+
<http://example.org/country_slice.csv#countryRef> <http://example.org/countries.csv#AF>;
|
28
|
+
<http://example.org/country_slice.csv#population> 9799379;
|
29
|
+
<http://example.org/country_slice.csv#year> "1961"^^xsd:gYear
|
30
|
+
] .
|
31
|
+
|
32
|
+
[
|
33
|
+
<http://example.org/country_slice.csv#countryRef> <http://example.org/countries.csv#AF>;
|
34
|
+
<http://example.org/country_slice.csv#population> 9989846;
|
35
|
+
<http://example.org/country_slice.csv#year> "1962"^^xsd:gYear
|
36
|
+
] .
|
@@ -0,0 +1,86 @@
|
|
1
|
+
{
|
2
|
+
"tables": [
|
3
|
+
{
|
4
|
+
"url": "http://example.org/countries.csv",
|
5
|
+
"row": [
|
6
|
+
{
|
7
|
+
"url": "http://example.org/countries.csv#row=2",
|
8
|
+
"rownum": 1,
|
9
|
+
"describes": [
|
10
|
+
{
|
11
|
+
"@id": "http://example.org/countries.csv#AD",
|
12
|
+
"http://www.geonames.org/ontology#countryCode": "AD",
|
13
|
+
"schema:latitude": 42.546245,
|
14
|
+
"schema:longitude": 1.601554,
|
15
|
+
"schema:name": "Andorra"
|
16
|
+
}
|
17
|
+
]
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"url": "http://example.org/countries.csv#row=3",
|
21
|
+
"rownum": 2,
|
22
|
+
"describes": [
|
23
|
+
{
|
24
|
+
"@id": "http://example.org/countries.csv#AE",
|
25
|
+
"http://www.geonames.org/ontology#countryCode": "AE",
|
26
|
+
"schema:latitude": 23.424076,
|
27
|
+
"schema:longitude": 53.847818,
|
28
|
+
"schema:name": "United Arab Emirates"
|
29
|
+
}
|
30
|
+
]
|
31
|
+
},
|
32
|
+
{
|
33
|
+
"url": "http://example.org/countries.csv#row=4",
|
34
|
+
"rownum": 3,
|
35
|
+
"describes": [
|
36
|
+
{
|
37
|
+
"@id": "http://example.org/countries.csv#AF",
|
38
|
+
"http://www.geonames.org/ontology#countryCode": "AF",
|
39
|
+
"schema:latitude": 33.93911,
|
40
|
+
"schema:longitude": 67.709953,
|
41
|
+
"schema:name": "Afghanistan"
|
42
|
+
}
|
43
|
+
]
|
44
|
+
}
|
45
|
+
]
|
46
|
+
},
|
47
|
+
{
|
48
|
+
"url": "http://example.org/country_slice.csv",
|
49
|
+
"row": [
|
50
|
+
{
|
51
|
+
"url": "http://example.org/country_slice.csv#row=2",
|
52
|
+
"rownum": 1,
|
53
|
+
"describes": [
|
54
|
+
{
|
55
|
+
"countryRef": "http://example.org/countries.csv#AF",
|
56
|
+
"year": "1960",
|
57
|
+
"population": 9616353
|
58
|
+
}
|
59
|
+
]
|
60
|
+
},
|
61
|
+
{
|
62
|
+
"url": "http://example.org/country_slice.csv#row=3",
|
63
|
+
"rownum": 2,
|
64
|
+
"describes": [
|
65
|
+
{
|
66
|
+
"countryRef": "http://example.org/countries.csv#AF",
|
67
|
+
"year": "1961",
|
68
|
+
"population": 9799379
|
69
|
+
}
|
70
|
+
]
|
71
|
+
},
|
72
|
+
{
|
73
|
+
"url": "http://example.org/country_slice.csv#row=4",
|
74
|
+
"rownum": 3,
|
75
|
+
"describes": [
|
76
|
+
{
|
77
|
+
"countryRef": "http://example.org/countries.csv#AF",
|
78
|
+
"year": "1962",
|
79
|
+
"population": 9989846
|
80
|
+
}
|
81
|
+
]
|
82
|
+
}
|
83
|
+
]
|
84
|
+
}
|
85
|
+
]
|
86
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
@prefix csvw: <http://www.w3.org/ns/csvw#> .
|
2
|
+
@prefix geo: <http://www.geonames.org/ontology#> .
|
3
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
4
|
+
@prefix schema: <http://schema.org/> .
|
5
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
6
|
+
|
7
|
+
<http://example.org/countries.csv#AD> schema:latitude "42.546245"^^xsd:double;
|
8
|
+
schema:longitude "1.601554"^^xsd:double;
|
9
|
+
schema:name "Andorra";
|
10
|
+
geo:countryCode "AD" .
|
11
|
+
|
12
|
+
<http://example.org/countries.csv#AE> schema:latitude "23.424076"^^xsd:double;
|
13
|
+
schema:longitude "53.847818"^^xsd:double;
|
14
|
+
schema:name "United Arab Emirates";
|
15
|
+
geo:countryCode "AE" .
|
16
|
+
|
17
|
+
<http://example.org/countries.csv#AF> schema:latitude "33.93911"^^xsd:double;
|
18
|
+
schema:longitude "67.709953"^^xsd:double;
|
19
|
+
schema:name "Afghanistan";
|
20
|
+
geo:countryCode "AF" .
|
21
|
+
|
22
|
+
[
|
23
|
+
a csvw:TableGroup;
|
24
|
+
csvw:table [
|
25
|
+
a csvw:Table;
|
26
|
+
csvw:row [
|
27
|
+
a csvw:Row;
|
28
|
+
csvw:describes <http://example.org/countries.csv#AD>;
|
29
|
+
csvw:rownum 1;
|
30
|
+
csvw:url <http://example.org/countries.csv#row=2>
|
31
|
+
], [
|
32
|
+
a csvw:Row;
|
33
|
+
csvw:describes <http://example.org/countries.csv#AE>;
|
34
|
+
csvw:rownum 2;
|
35
|
+
csvw:url <http://example.org/countries.csv#row=3>
|
36
|
+
], [
|
37
|
+
a csvw:Row;
|
38
|
+
csvw:describes <http://example.org/countries.csv#AF>;
|
39
|
+
csvw:rownum 3;
|
40
|
+
csvw:url <http://example.org/countries.csv#row=4>
|
41
|
+
];
|
42
|
+
csvw:url <http://example.org/countries.csv>
|
43
|
+
], [
|
44
|
+
a csvw:Table;
|
45
|
+
csvw:row [
|
46
|
+
a csvw:Row;
|
47
|
+
csvw:describes [
|
48
|
+
<http://example.org/country_slice.csv#countryRef> <http://example.org/countries.csv#AF>;
|
49
|
+
<http://example.org/country_slice.csv#population> 9616353;
|
50
|
+
<http://example.org/country_slice.csv#year> "1960"^^xsd:gYear
|
51
|
+
];
|
52
|
+
csvw:rownum 1;
|
53
|
+
csvw:url <http://example.org/country_slice.csv#row=2>
|
54
|
+
], [
|
55
|
+
a csvw:Row;
|
56
|
+
csvw:describes [
|
57
|
+
<http://example.org/country_slice.csv#countryRef> <http://example.org/countries.csv#AF>;
|
58
|
+
<http://example.org/country_slice.csv#population> 9799379;
|
59
|
+
<http://example.org/country_slice.csv#year> "1961"^^xsd:gYear
|
60
|
+
];
|
61
|
+
csvw:rownum 2;
|
62
|
+
csvw:url <http://example.org/country_slice.csv#row=3>
|
63
|
+
], [
|
64
|
+
a csvw:Row;
|
65
|
+
csvw:describes [
|
66
|
+
<http://example.org/country_slice.csv#countryRef> <http://example.org/countries.csv#AF>;
|
67
|
+
<http://example.org/country_slice.csv#population> 9989846;
|
68
|
+
<http://example.org/country_slice.csv#year> "1962"^^xsd:gYear
|
69
|
+
];
|
70
|
+
csvw:rownum 3;
|
71
|
+
csvw:url <http://example.org/country_slice.csv#row=4>
|
72
|
+
];
|
73
|
+
csvw:url <http://example.org/country_slice.csv>
|
74
|
+
]
|
75
|
+
] .
|
@@ -0,0 +1,16 @@
|
|
1
|
+
[{
|
2
|
+
"countryCode": "AD",
|
3
|
+
"latitude": "42.546245",
|
4
|
+
"longitude": "1.601554",
|
5
|
+
"name": "Andorra"
|
6
|
+
}, {
|
7
|
+
"countryCode": "AE",
|
8
|
+
"latitude": "23.424076",
|
9
|
+
"longitude": "53.847818",
|
10
|
+
"name": "United Arab Emirates"
|
11
|
+
}, {
|
12
|
+
"countryCode": "AF",
|
13
|
+
"latitude": "33.93911",
|
14
|
+
"longitude": "67.709953",
|
15
|
+
"name": "Afghanistan"
|
16
|
+
}]
|