Copyright
©
2015
W3C
®
(
MIT
,
ERCIM
,
Keio
,
Beihang
),
All
Rights
Reserved.
).
W3C
liability
,
trademark
and
document
use
rules
apply.
Validation,
conversion,
display
display,
and
search
of
tabular
data
on
the
web
requires
additional
metadata
that
describes
how
the
data
should
be
interpreted.
This
document
defines
a
vocabulary
for
metadata
that
annotates
tabular
data.
This
can
be
used
to
provide
metadata
at
various
levels,
from
collections
groups
of
data
from
CSV
documents
tables
and
how
they
relate
to
each
other
down
to
individual
cells
within
a
table.
The metadata defined in this specification is used to provide annotations on an annotated table or group of tables , as defined in [ tabular-data-model ]. Annotated tables form the basis for all further processing, such as validating, converting, or displaying the tables.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
The CSV on the Web Working Group was chartered to produce a Recommendation "Access methods for CSV Metadata" as well as Recommendations for "Metadata vocabulary for CSV data" and "Mapping mechanism to transforming CSV into various Formats (e.g., RDF, JSON, or XML)". This document aims to primarily satisfy the second of those Recommendations.
This document was published by the CSV on the Web Working Group as a Working Draft. This document is intended to become a W3C Recommendation. If you wish to make comments regarding this document, please send them to public-csv-wg@w3.org ( subscribe , archives ). All comments are welcome.
Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the 5 February 2004 W3C Patent Policy . W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy .
This document is governed by the 1 August 2014 W3C Process Document .
Interpreting
tabular
data
that
is
available
on
the
web,
particularly
as
CSV,
usually
requires
additional
metadata.
As
an
example,
say
that
the
following
CSV
file
were
available
at
http://example.org/tree-ops.csv
GID,On Street,Species,Trim Cycle,Inventory Date 1,ADDISON AV,Celtis australis,Large Tree Routine Prune,10/18/2010 2,EMERSON ST,Liquidambar styraciflua,Large Tree Routine Prune,6/2/2010
A
human
consumer
of
this
data
might
be
able
to
figure
out
the
meaning
of
the
different
columns,
particularly
if
there
were
some
additional
human-readable
documentation
made
available.
Automated
processors
would
have
a
much
harder
time;
realistically
they
would
be
limited
to
displaying
the
information
in
a
table.
Making
available
machine-readable
metadata
helps
with
the
interpretation
of
the
tabular
data.
For
example,
say
that
the
following
metadata
file
were
available
at
:
http://example.org/trees-ops.csv-metadata.json
http://example.org/tree-ops.csv-metadata.json
{ "@context": ["http://www.w3.org/ns/csvw", {"@language": "en"}], "url": "tree-ops.csv", "dc:title": "Tree Operations", "dcat:keyword": ["tree", "street", "maintenance"], "dc:publisher": { "schema:name": "Example Municipality", "schema:url": {"@id": "http://example.org"} }, "dc:license": {"@id": "http://opendefinition.org/licenses/cc-by/"}, "dc:modified": {"@value": "2010-12-31", "@type": "xsd:date"}, "tableSchema": { "columns": [{ "name": "GID", "titles": ["GID", "Generic Identifier"], "dc:description": "An identifier for the operation on a tree.", "datatype": "string", "required": true }, { "name": "on_street", "titles": "On Street", "dc:description": "The street that the tree is on.", "datatype": "string" }, { "name": "species", "titles": "Species", "dc:description": "The species of the tree.", "datatype": "string" }, { "name": "trim_cycle", "titles": "Trim Cycle", "dc:description": "The operation performed on the tree.", "datatype": "string" }, { "name": "inventory_date", "titles": "Inventory Date", "dc:description": "The date of the operation that was performed.", "datatype": {"base": "date", "format": "M/d/yyyy"} }], "primaryKey": "GID", "aboutUrl": "#gid-{GID}" } }
Given
the
location
of
the
CSV
file,
this
metadata
document
can
be
located
by
appending
-metadata.json
to
the
URL
(as
described
in
Model
for
Tabular
Data
and
Metadata
on
the
Web
[
tabular-data-model
).
]).
It
provides
information
for
different
types
of
applications:
GID
column
are
all
present
and
unique.
Implementations
may
fulfil
one
or
more
of
these
functions.
In
particular,
Converters
may
or
may
not
act
as
a
Validator
(perhaps
through
the
setting
of
a
flag),
and
Metadata
on
check
the
Web
data
that
they
are
converting
to
ensure
that
it
is
compliant
with
the
schema.
If
a
Converter
does
not
also
act
as
a
Validator
specification
it
may
produce
invalid
output.
[
tabular-data-model
]
defines
an
Annotated
Tabular
Data
Model
annotated
tabular
data
model
in
which
groups
of
tables,
individual
tables,
columns,
rows
rows,
and
cells
can
be
annotated
with
properties
and
values,
and
a
Grouped
Tabular
Data
Model
in
which
a
group
of
tables
is
annotated.
annotations.
That
specification
also
describes
how
to
locate
metadata
about
a
given
CSV
tabular
data
file.
This
document
defines
the
format
and
structure
of
metadata
documents,
and
how
these
are
interpreted
to
create
an
Annotated
Tabular
Data
Model.
Model
.
It
also
defines
how
to
validate
tabular
data
based
on
some
of
these
annotations.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY , MUST , MUST NOT , SHOULD , and SHOULD NOT are to be interpreted as described in [ RFC2119 ].
The
metadata
format
is
based
on
a
dialect
of
[
JSON-LD
]
as
defined
in
section
A.
JSON-LD
Dialect
.
This
metadata
can
therefore
be
expressed
as
an
RDF
graph.
However,
It
is
not
necessary
for
conformant
applications
to
be
able
to
process
all
JSON-LD,
only
the
dialect
defined
in
this
specification.
All
applications
that
conform
to
this
specification
(including
validators
and
applications
that
read
or
convert
tabular
data)
MUST
read
the
JSON-based
format
described
in
this
document.
Tabular
data
Metadata
documents
are
MUST
conform
to
the
description
from
[
JSON-LD
tabular-data-model
]
documents,
however
the
aim
is
for
].
In
particular
note
that
each
row
MUST
contain
the
documents
to
same
number
of
cells
(although
some
of
these
cells
may
be
useable
without
any
extra
processing.
To
empty).
Parsers
might
not
be
valid,
able
to
map
all
CSV-encoded
data
to
such
a
table.
As
such,
the
metadata
document
MUST
format
described
in
this
specification
cannot
be
applied
to
all
CSV
files.
This
specification
makes
use
a
of
the
compact
IRI
Syntax
;
please
refer
to
the
Compact
IRIs
from
[
JSON-LD
Context
,
either
explicitly
via
].
This specification makes use of the following namespaces:
@context
csvw
:
http://www.w3.org/ns/csvw#
dc
:
http://purl.org/dc/terms/
dcat
:
http://www.w3.org/ns/dcat#
foaf
:
http://xmlns.com/foaf/0.1/
rdf
:
http://www.w3.org/1999/02/22-rdf-syntax-ns#
schema
:
http://schema.org/
xsd
:
http://www.w3.org/2001/XMLSchema#
The following typographic conventions are used in this specification:
markup
http://www.w3.org/ns/csvw
.
CSVW
aware
processors
SHOULD
assume
markup
definition
reference
markup
external
definition
reference
Should
JSON-LD
keywords
be
aliased?
The
sense
is
to
alias
@id
as
url
Notes
are
in
light
green
boxes
with
a
green
left
border
and
not
alias
the
others.
We
invite
comments
with
a
"Note"
header
in
green.
Notes
are
normative
or
informative
depending
on
the
utility
of
this
approach.
whether
they
are
in
a
normative
or
informative
section,
respectively.
Examples are in light khaki boxes, with khaki left border, and with a numbered "Example" header in khaki. Examples are always informative. The content of the example is in monospace font and may be syntax colored.
The
metadata
defined
in
this
specification
is
used
to
annotate
provide
annotations
on
an
existing
annotated
table
or
group
of
tables
,
as
defined
in
[
tabular-data-model
].
Annotated
tables
form
the
basis
for
all
further
processing,
such
as
validating
validating,
converting,
or
displaying
the
tables.
All compliant applications MUST create annotated tables based on the algorithm defined here. All compliant applications MUST generate errors and stop processing if a metadata document:
Compliant applications MUST ignore properties (aside from common properties ) which are not defined in this specification and MUST generate a warning when they are encoutered.
If a property has a value that is not permitted by this specification, then if a default value is provided for that property, compliant applications MUST use that default value and MUST generate a warning. If no default value is provided for that property, compliant applications MUST generate a warning and behave as if the property had not been specified.
Metadata
documents
contain
descriptions
of
groups
of
tables,
tables,
columns,
rows,
cells
and
regions
cells,
which
are
used
to
create
annotations
on
a
annotated
tabular
data
model.
model
.
A
description
object
is
a
JSON
object
that
describes
a
component
of
the
annotated
tabular
data
model
(a
group
of
tables
,
a
table
or
a
column
)
and
has
one
or
more
properties
are
mapped
into
properties
on
that
component.
There
are
two
types
of
description
objects:
The
description
objects
themselves
contain
a
number
of
properties.
These
are:
name
of
a
column
or
the
dc:provenance
of
a
table
For example, in the column description
{ "name": "inventory_date", "titles": "Inventory Date", "dc:description": "The date of the operation that was performed.", "datatype": { "base": "date", "format": "M/d/yyyy" } }
the
properties
name
,
,
and
title
titles
dc:description
are
direct
annotations
that
become
used
to
create
the
name
,
title
,
titles
,
datatype
and
dc:description
properties
annotations
on
the
column
in
the
data
model.
The
datatype
and
format
properties
are
property
is
an
inherited
properties
property
that
become
datatype
and
format
properties
on
the
cells
within
the
column.
2.1
Direct
Annotations
Direct
annotations
are
properties
on
the
description
object
for
a
given
table,
column,
row
or
cell
which
map
directly
to
properties
on
the
described
table,
column,
row
or
cell.
The
name
of
the
annotation
is
the
same
as
the
name
of
the
property
on
the
annotation.
The
value
of
the
annotation
is
the
same
as
also
affects
the
value
of
the
property
on
the
description
object.
2.2
Inherited
Properties
A
each
cell
may
be
assigned
annotations
based
on
properties
on
the
description
objects
for
the
group
of
tables,
table,
column
or
row
that
it
appears
in.
These
properties
are
known
as
inherited
properties
and
are
listed
in
that
column
(see
section
3.10
5.7
Inherited
Properties
.
To
ascertain
a
value
for
these
annotations,
an
application
MUST
identify
the
relevant
property
in
the
descriptions
of
the
table
or
column.
Applications
MUST
raise
an
error
if
the
value
of
a
property
in
a
table
description
is
not
compatible
with
the
value
of
that
property
on
the
group
of
tables.
Applications
MUST
raise
an
error
if
the
value
of
a
property
in
a
column
description
is
not
compatible
with
the
value
of
that
property
on
the
table.
Applications
MUST
raise
an
error
if
the
value
of
a
property
on
a
cell
is
not
compatible
with
the
values
of
that
property
on
the
column
that
the
cell
is
associated
with.
A
value
for
a
cell,
column
or
table
is
compatible
with
with
a
value
more
on
a
column,
table
or
group
of
tables
if
they
are
the
same
value
or
if
the
first
value
is
a
sub-value
of
the
second
value.
The
definitions
of
individual
inherited
properties
indicate
what
values
count
as
sub-values
of
others.
).
This
section
defines
a
set
of
properties
and
permitted
values
for
annotating
tabular
data,
and
how
these
annotations
properties
should
be
interpreted
by
applications.
A
metadata
document
is
a
JSON
document
which
holds
an
object
at
the
top
level.
This
object
is
a
description
object
of
either
a
table
group
of
tables
or
a
single
table.
table
.
A
metadata
document
may
contain
other
referenced
or
embedded
description
object
is
a
objects
,
description
objects
for
tables
and
columns
.
Additional
JSON
object
that
describes
a
component
objects,
not
part
of
the
annotated
tabular
data
model
(a
table
group,
a
table,
a
column,
a
row
or
a
cell)
and
has
one
or
more
properties
,
are
mapped
into
properties
on
that
component.
used
to
describe
schemas
,
dialect
descriptions
,
foreign
key
definitions
and
transformation
definitions
.
There are different types of properties on description objects:
These
Array
properties
hold
an
array
of
one
or
more
objects,
which
are
usually
description
objects
.
For
example,
the
property
is
an
array
property.
A
table
group
description
might
contain:
resources
tables
"tables": [{ "url": "https://example.org/countries.csv", "tableSchema": "https://example.org/countries.json" }, { "url": "https://example.org/country_slice.csv", "tableSchema": "https://example.org/country_slice.json" }]
in
which
case
the
property
has
a
value
that
is
an
array
of
two
table
description
objects.
resources
tables
Any items within an array that are not valid objects of the type expected are ignored. If the supplied value of an array property is not an array (eg if it is an integer), compliant applications MUST issue a warning and proceed as if the property had been supplied with an empty array.
These
Link
properties
hold
one
or
more
references
a
single
reference
to
other
resources
another
resource
by
URL.
Their
values
may
be:
value
is
a
strings
string
—
resolved
as
URLs
a
URL
against
the
base
URL
arrays
—
lists
.
If
the
supplied
value
of
strings
which
are
resolved
a
link
property
is
not
a
string
(eg
if
it
is
an
integer),
compliant
applications
MUST
issue
a
warning
and
proceed
as
URLs
against
if
the
base
URL
property
had
been
supplied
with
an
empty
string.
For
example,
the
property
is
a
link
property.
A
table
description
might
contain:
dc:hasVersion
url
"dc:hasVersion""url" : "example-2014-01-03.csv"
in
which
case
the
property
on
the
table
would
have
a
single
value,
a
link
to
dc:hasVersion
url
example-2014-01-03.csv
,
resolved
against
the
base
URL
of
the
metadata
document
.
Alternatively,
might
contain:
in
which
this
was
located.
For
example
if
the
metadata
document
contained:
"@context" :][ "http://www.w3.org/ns/csvw" , { "@base" : "http://example.org/" }]
in
which
case
the
dc:hasVersion
property
on
the
table
would
be
an
array
of
three
values,
links
this
is
equivalent
to
other
versions
of
the
table.
specifying:
"url" : "http://example.org/example-2014-01-03.csv"
A
URI
template
property
contains
properties
contain
a
[
URI-TEMPLATE
]
which
can
be
used
to
generate
a
URI.
These
URI
templates
are
expanded
in
the
context
of
each
row
by
combining
the
template
with
a
set
of
variables
with
values.
values
as
defined
in
[
URI-TEMPLATE
].
The
variables
that
are
set
are:
_row
null
The languages of cell values are ignored.
_column
_row
_column
is
set
to
the
_sourceColumn
_sourceColumn
is
set
to
the
source
number
of
the
column
that
is
currently
being
processed;
this
usually
varies
from
_column
by
skip
columns
_row
_row
is
set
to
the
row
number
of
the
row
from
the
annotated
table
that
is
currently
being
processed
_sourceRow
_sourceRow
is
set
_row
by
skip
rows
and
header
rows
_name
_name
is
set
to
the
name
may
have
been
encoded
if
taken
from
titles
;
this
prevents
double
percent-encoding.)
The
annotation
value
is
the
canonical
representation
of
result
of:
If the supplied value of a URI template property is not a string (eg if it is an integer), compliant applications MUST issue a warning and proceed as if the property had been supplied with an empty string.
For
example,
the
property
holds
a
URI
template
that
is
used
to
generate
a
URL
identifier
for
each
row,
which
might
look
like:
urlTemplate
aboutUrl
"urlTemplate""aboutUrl" :"http://example.org/example.csv#row={_row}""http://example.org/example.csv#row.{_row}"
The
identifiers
about
URL
annotations
that
are
generated
and
used
as
identifiers
for
the
rows
would
then
look
like
,
http://example.org/example.csv#row=1
http://example.org/example.csv#row.1
and
so
on.
http://example.org/example.csv#row=2
http://example.org/example.csv#row.2
Alternatively,
with
the
CSV
and
metadata
in
the
section
1.
Introduction
,
the
might
look
like:
urlTemplate
aboutUrl
"urlTemplate""aboutUrl" :"http://example.org/tree/{on%2Dstreet}/{GID}""http://example.org/tree/{on_street}/{GID}"
This
would
generate
URIs
such
as
http://example.org/tree/ADDISON%20AV/1
and
http://example.org/tree/EMERSON%20ST/2
.
If
the
value
of
the
on_street
or
GID
column
were
null
,
the
URL
would
still
be
generated
with
the
null
value
generating
an
empty
string
in
the
URL.
For
example
if
on_street
were
null
and
GID
were
3
,
the
generated
URL
would
be
http://example.org/tree//3
.
Once
the
URI
has
been
generated,
it
is
resolved
against
the
location
url
of
the
resource
table
(eg
the
CSV
file)
to
create
an
absolute
URI.
For
example,
given
a
within
a
schema
such
as:
urlTemplate
aboutUrl
"aboutUrl" : "#row.{_row}"
and
given
a
CSV
file
at
http://example.com/temp.csv
,
the
URL
for
the
first
row
will
be
.
http://example.com/temp.csv#row=1
http://example.com/temp.csv#row.1
The
propertyUrl
property
might
be
defined
as
"{#_name}"
,
meaning
that
it
resolves
as
a
fragment
identifier
relative
to
the
URL
of
the
source
of
the
table.
For
example,
accessing
it
from
a
column
with
the
column
name
GID
would
look
like:
"http://example.org/example.csv#GID"
A value defined within the data is also subject to expansion. For example, consider the following table:
project_name,project_type,keywords CSVW,foaf:Project,table;data;conversion
The
project_type
column
might
have
a
valueUrl
specified
as
"{project_type}"
.
In
the
first
row
the
cell
value
is
"foaf:Project"
.
The
foaf
prefix
is
understood,
as
described
in
section
5.8
Common
Properties
,
to
expand
to
http://xmlns.com/foaf/0.1/Project
.
Similarly,
the
keywords
column
might
have
a
valueUrl
specified
as
"https://duckduckgo.com/?q={keywords}"
.
If
the
column
also
specifies
"separator":
";"
,
then
the
cell
value
of
the
keywords
column
would
be
an
array
of
the
three
values
table
,
data
,
and
conversion
.
This
is
set
as
the
value
of
the
keywords
variable
within
the
URI
template,
which
means
the
result
would
be
https://duckduckgo.com/?q=table,data,conversion
.
If
the
value
in
the
keywords
column
were
an
empty
sequence
(created
from
an
empty
cell
in
the
original
data),
the
reference
properties
to
that
column
would
be
expanded
to
an
empty
string,
generating
https://duckduckgo.com/?q=
.
When a cell's value is not a string, the canonical representation of that value is used within the expanded URL. For example, the data may include dates such as those in:
GID,On Street,Species,Trim Cycle,Inventory Date 1,ADDISON AV,Celtis australis,Large Tree Routine Prune,10/18/2010 2,EMERSON ST,Liquidambar styraciflua,Large Tree Routine Prune,6/2/2010
These
The
Inventory
Date
column
description
would
indicate
that
these
were
dates
with
the
format
M/d/yyyy
:
{ "name": "inventory_date", "titles": "Inventory Date", "datatype": { "base": "date", "format": "M/d/yyyy" } }
The
string
value
of
the
inventory_date
column
in
the
first
row
is
parsed
to
create
the
date
18th
October
2010.
When
the
inventory_date
column
is
referenced
within
a
URI
template
such
as
http://example.org/event/{inventory_date}
,
the
canonical
representation
of
that
date,
as
defined
in
[
xmlschema11-2
]
is
used
within
the
URL,
giving
the
result
http://example.org/event/2010-10-18
.
Column
reference
properties
hold
one
or
more
references
to
other
column
description
objects.
The
referenced
description
object
must
have
an
a
name
property.
Column
reference
properties
can
then
reference
column
description
objects
through
values
that
are:
name
on
a
column
description
object
within
the
metadata
document
If the supplied value of a column reference property is not a string or array (eg if it is an integer), or if any of the values in the supplied array are not strings, or if any of the supplied strings do not reference one or more columns, compliant applications MUST issue a warning and proceed as if the property had been specified (which may mean that an error is issued, if the property was required).
For
example,
the
primaryKey
property
is
an
a
column
reference
property
on
the
schema.
It
has
to
hold
references
to
columns
defined
elsewhere
in
the
schema,
and
the
descriptions
of
those
columns
must
have
name
properties.
It
can
hold
a
single
reference,
like
this:
"tableSchema": { "columns": [{ "name": "GID" }, ... ], "primaryKey": "GID" }
or it can contain an array of references, like this:
"tableSchema": { "columns": [{ "name": "givenName" }, { "name": "familyName" }, ... ], "primaryKey": [ "givenName", "familyName" ] }
These
Object
properties
hold
one
or
more
objects
either
a
single
object
or
references
a
reference
to
objects
an
object
by
URL.
Their
values
may
be:
If
the
supplied
value
of
strings
and/or
objects,
interpreted
as
URLs
an
object
property
is
not
a
string
or
structured
objects
object
(eg
if
it
is
an
integer),
compliant
applications
MUST
issue
a
warning
and
proceed
as
if
the
property
had
been
specified
as
an
object
with
no
properties.
Object
properties
are
often
used
when
the
values
can
be
or
should
be
values
within
controlled
vocabularies,
or
structured
information
which
may
be
held
elsewhere.
For
example,
the
of
a
table
dc:creator
dialect
should
be
is
an
object
property.
It
could
be
provided
as
a
URL
that
indicates
the
creator,
a
commonly
used
dialect,
like
this:
"dc:creator""dialect" :"http://ons.gov.uk""http://example.org/tab-separated-values"
or a structured object, like this:
"dialect": { "delimiter": "\t", "encoding": "utf-8" }
or
an
array
of
URLs,
like
this:
Example
12
"dc:creator"
:
[
"http://ons.gov.uk"
,
When
specified
as
a
string,
the
resolved
URL
is
used
to
fetch
the
referenced
object
during
normalization
as
described
in
section
6.1
"https://www.gov.uk/government/organisations/department-for-transport"
Normalization
.
For
example,
if
http://example.org/tab-separated-values
resolved
to:
{ "@context": "http://www.w3.org/ns/csvw", "quoteChar": null, "header": true, "delimiter": "\t"]}
or
an
array
Following
normalization
,
the
value
of
structured
objects:
the
dialect
property
would
then
be:
"dialect": { "@id": "http://example.org/tab-separated-values", "quoteChar": null, "header": true, "delimiter": "\t"}]}
Natural
language
properties
These
hold
natural
language
strings.
Their
values
may
be:
Natural
language
properties
are
used
for
things
like
descriptions
and
titles.
For
example,
the
property
on
a
column
description
provides
a
natural
language
label
for
a
column.
If
it's
a
plain
string
like
this:
title
titles
"title""titles" : "Project title"
then
that
string
is
assumed
to
be
in
the
default
language
provided
through
the
@language
property
of
the
nearest
@context
(or
have
no
assumed
an
undefined
language,
und
,
if
there
is
no
such
property).
Multiple
alternative
values
can
be
given
in
an
array:
"titles": [ "Project title", "Project" ]
It's also possible to provide multiple values in different languages, using an object structure. For example:
"titles": { "en": "Project title", "fr": "Titre du projet" }
and within such an object, the values of the properties can themselves be arrays:
"titles": { "en": [ "Project title", "Project" ], "fr": "Titre du projet" }
The annotation value of a natural language property is an object whose properties are language codes and where the values of those properties are an array of strings (see Language Maps in [ JSON-LD ]).
We
invite
comment
on
whether
it
would
be
useful
to
enable
some
markup
in
When
extracting
a
annotation
value
from
a
metadata
that
will
have
already
been
merged
,
a
natural
language
strings,
for
example
by
stating
property
will
already
have
this
form.
If
the
supplied
value
of
a
natural
language
property
is
not
a
string,
array
or
object
(eg
if
it
is
an
integer),
compliant
applications
MUST
issue
a
warning
and
proceed
as
if
the
property
had
been
specified
as
an
empty
array.
If
the
supplied
value
is
an
array,
any
items
in
that
array
that
they
are
interpreted
not
strings
MUST
be
ignored.
If
the
supplied
value
is
an
object,
any
properties
that
are
not
valid
language
codes
as
HTML
defined
by
[
BCP47
]
MUST
be
ignored,
as
must
any
properties
whose
value
is
not
a
string
or
Markdown.
an
array,
and
any
items
that
are
not
strings
within
array
values
of
these
properties.
These
Atomic
properties
hold
atomic
values.
values
.
Their
values
may
be:
true
or
false
)
The
annotation
value
of
a
boolean
atomic
property
takes
is
false
if
unset;
otherwise,
the
annotation
value
of
an
atomic
property
is
normalized
value
of
that
property,
or
the
defined
default
value
or
null
,
if
unset.
Processors
MUST
issue
a
date
warning
if
a
property
is
set
to
an
invalid
value
type,
such
as
a
value,
this
MUST
be
boolean
atomic
property
being
set
to
the
number
1
or
a
string
in
numeric
atomic
property
being
set
to
the
format
string
,
and
act
as
if
the
property
had
not
been
specified
(which
may
mean
using
the
default
value
for
the
property,
or
may
mean
raising
an
error
and
halting
processing
if
the
property
is
a
required
property).
YYYY-MM-DD
.
"3.1415"
The
top-level
object
of
a
metadata
document
or
object
referenced
through
an
object
property
(whether
it
is
a
table
group
description
or
a
,
table
description
,
schema
,
dialect
description
or
transformation
definition
)
MAY
MUST
have
a
@context
property.
This
holds
is
an
object
that
provides
metadata
for
interpreting
other
properties,
namely:
@language
indicates
the
default
language
for
the
values
of
properties
array
property
,
as
defined
in
the
metadata
document;
if
present,
its
value
MUST
be
a
language
code
[
BCP47
Section
8.7
]
which
is
the
default
language
for
the
values
of
other
properties
in
the
metadata
document
Note
[
JSON-LD
Note
that
the
].
The
@language
@context
property
MUST
have
one
of
the
following
values:
@context
http://www.w3.org/ns/csvw
,
or
language
http://www.w3.org/ns/csvw
@base
indicates
an
atomic
property
that
provides
the
base
URL
against
which
other
URLs
within
the
description
metadata
file
are
resolved;
if
resolved.
If
present,
its
value
MUST
be
a
string
that
is
interpreted
as
a
URL
which
is
resolved
against
the
location
of
the
metadata
document
to
provide
the
base
URL
for
other
URLs
in
the
metadata
document;
if
unspecified,
the
base
URL
used
for
interpreting
relative
URLs
within
the
metadata
document
is
the
location
of
the
metadata
document
itself
itself.
Note
that
the
@base
property
of
the
@context
object
provides
the
base
URL
used
for
URLs
within
the
metadata
document,
not
the
URLs
that
appear
as
data
within
the
group
of
tables
or
table
it
describes.
URI
template
properties
are
not
resolved
against
this
base
URL:
they
are
resolved
against
the
URL
of
the
table.
import
@language
If
the
import
property
contains
an
array,
imports
are
carried
out
in
sequence:
the
first
metadata
file
referenced
is
imported
into
the
original
metadata
file;
the
second
is
imported
into
the
result
and
so
on.
If
a
referenced
metadata
file
has
already
been
imported
(or
was
the
original
metadata
file)
it
is
ignored.
If
the
top-level
object
of
any
of
the
metadata
files
are
table
descriptions
,
these
are
treated
as
if
they
were
table
group
descriptions
containing
a
single
table
description
(ie
having
a
single
resource
atomic
property
whose
value
is
the
same
as
that
indicates
the
original
table
description).
An
imported
description
object
B
is
imported
default
language
into
an
original
description
object
A
by
merging
each
property
of
B
into
A.
If
the
property
from
B
does
not
exist
on
A,
it
is
simply
added
to
A.
If
A
does
have
the
property,
the
way
the
values
are
merged
depends
on
the
type
of
the
property,
as
follows:
If
the
property
is
an
array
property
,
the
way
in
which
values
are
merged
depends
on
the
property;
see
the
relevant
property
for
this
definition.
If
the
property
is
a
link
property
,
then
if
the
property
only
accepts
single
values,
the
value
from
A
overrides
that
from
B,
otherwise
the
result
is
an
array
of
links:
those
from
A
followed
by
those
from
B
that
were
not
already
a
value
in
A.
If
the
property
is
a
URI
template
property
,
the
value
from
A
overrides
that
from
B.
If
the
property
is
a
column
reference
property
,
the
value
from
A
overrides
that
from
B.
If
the
property
is
an
object
property
,
then
if
the
property
only
accepts
single
objects:
if
the
value
of
the
property
in
A
is
a
string
or
the
value
from
B
is
a
string
then
the
value
from
A
overrides
that
from
B
otherwise
(if
both
values
as
objects)
the
objects
are
merged
as
described
here
If
the
property
accepts
arrays,
the
result
is
an
array
of
objects
or
strings:
those
from
A
followed
by
those
from
B
that
were
not
already
a
value
in
A.
If
the
property
is
a
natural
language
property
,
the
result
is
an
object
whose
properties
are
language
codes
and
where
the
values
of
those
properties
are
arrays.
The
suitable
language
code
for
the
values
is
either
explicit
within
the
existing
value
or
determined
through
the
default
language
string-valued
common
properties
in
the
metadata
document;
if
it
can't
be
determined
the
language
code
und
should
be
used.
The
arrays
should
provide
the
values
from
A
followed
by
those
from
B
that
were
not
already
a
value
in
A.
If
the
property
is
an
atomic
property
,
then
if
the
property
only
accepts
single
values,
the
value
from
A
overrides
that
from
B;
otherwise
the
result
is
an
array
of
values:
those
from
A
followed
by
those
from
B
that
were
not
already
a
value
in
A.
If
the
type
of
the
property
cannot
be
determined,
because
it
is
not
defined
in
this
specification
(ie
because
it
is
an
extension
property),
the
type
of
the
property
is
determined
based
on
present,
its
values
in
A
and
B,
as
follows,
and
merged
accordingly:
If
the
value
of
the
property
in
A
and
the
value
of
the
property
in
B
are
both
objects,
they
are
treated
as
if
the
property
is
an
object
property
that
only
accepts
single
objects.
If
one
of
the
values
is
an
array
and
the
other
is
an
object,
they
are
treated
as
if
the
property
is
an
object
property
that
accepts
arrays.
If
the
value
of
the
property
in
A
and
the
value
of
the
property
in
B
are
atomic
values,
they
are
treated
as
if
the
property
is
an
atomic
property
that
only
accepts
single
values.
If
one
of
the
values
is
an
array
and
the
other
is
an
atomic
value,
they
are
treated
as
if
the
property
is
an
atomic
property
that
accepts
arrays.
3.3
Common
Properties
Descriptions
of
groups
of
tables,
tables,
schemas,
columns,
rows
and
cells
MAY
MUST
contain
any
properties
whose
names
are
either
absolute
URLs
or
prefixed
names.
For
example,
a
table
description
may
contain
dc:description
,
dcat:keyword
or
schema:copyrightHolder
properties
to
provide
be
a
description,
keywords
or
the
name
of
the
copyright
holder,
as
defined
in
Dublin
Core
Terms
,
DCAT
or
schema.org
.
The
same
prefixes
are
pre-defined
as
for
language
code
[
rdfa-core
BCP47
]
within
the
RDFa
1.1
Initial
Context
and
MUST
NOT
be
overridden.
Properties
from
other
vocabularies
MUST
be
defined
using
full
URLs.
].
The
default
is
und
.
Forbidding
Note
that
the
declaration
@language
property
of
new
prefixes
ensures
consistent
processing
between
JSON-LD-aware
and
non-JSON-LD-aware
processors.
the
@context
object,
which
gives
the
default
language
used
within
the
metadata
file,
is
distinct
from
the
lang
property
on
a
description
object
,
which
gives
the
language
used
in
the
data
within
a
group
of
tables,
table,
or
column.
A
table
group
description
is
a
JSON
object
that
describes
a
group
of
tables.
tables
.
resources
tables
An
array
property
of
table
descriptions
for
the
tables
in
the
group.
group,
namely
those
listed
in
the
tables
annotation
on
the
group
of
tables
being
described.
Compliant
application
MUST
raise
an
error
if
this
array
does
not
contain
one
or
more
table
descriptions.
When
an
array
of
table
descriptions
B
is
imported
merged
into
an
original
array
of
table
descriptions
A,
A
,
each
table
description
within
B
is
combined
into
the
original
array
A
by:
@id
url
in
A
,
the
table
description
from
B
is
A
.
B
is
appended
to
the
array
of
table
descriptions
A
.
The description of a group of tables MAY also contain:
schema
dialect
An
object
property
that
provides
a
single
schema
dialect
description
as
described
in
section
3.8
Schemas
,
.
If
provided,
dialect
provides
hints
to
processors
about
how
to
parse
the
referenced
files
to
create
tabular
data
models
for
all
the
tables
in
the
group.
This
may
be
provided
as
an
embedded
object
within
the
JSON
metadata
or
as
a
URL
reference
reference.
See
section
5.9
Dialect
Descriptions
for
more
details.
notes
An
array
property
that
provides
an
array
of
objects
representing
arbitrary
annotations
on
the
annotated
group
of
tables
.
The
value
of
this
property
becomes
the
value
of
the
notes
annotation
for
the
group
of
tables
.
The
properties
on
these
objects
are
interpreted
equivalently
to
common
properties
as
described
in
section
5.8
Common
Properties
.
When
an
array
of
note
objects
B
is
merged
into
an
original
array
of
note
objects
A
,
each
note
object
from
B
is
appended
into
the
array
A
.
The
Web
Annotation
Working
Group
is
developing
a
separate
JSON
schema
document.
vocabulary
for
expressing
annotations.
In
future
versions
of
this
specification,
we
anticipate
referencing
that
vocabulary.
table-direction
tableDirection
An
atomic
property
that
MUST
have
a
single
string
value
that
is
one
of
"rtl"
,
"ltr"
or
"default"
.
Indicates
whether
the
tables
in
the
group
should
be
displayed
with
the
first
column
on
the
right,
on
the
left,
or
based
on
the
first
character
in
the
table
that
has
a
specific
direction.
The
value
of
this
property
becomes
the
value
of
the
direction
annotation
for
all
the
tables
in
the
table
group.
See
section
4.1.1
Bidirectional
Tables
for
more
details.
Issue
51
in
[
tabular-data-model
This
should
be
a
defined
controlled
vocabulary
in
JSON-LD,
so
that
the
values
map
on
to
URIs
in
the
RDF
version
rather
than
strings.
We
invite
comment
on
how
to
configure
the
JSON-LD
context
to
enable
these
values
to
be
interpreted
in
]
for
details.
The
default
value
for
this
way.
property
is
"default"
.
dialect
tableSchema
An
object
property
that
provides
a
single
dialect
schema
description
.
If
provided,
dialect
provides
hints
to
processors
about
how
to
parse
as
described
in
section
5.5
Schemas
,
used
as
the
referenced
files
for
to
create
tabular
data
models
default
for
all
the
tables
in
the
group.
This
may
be
provided
as
an
embedded
object
within
the
JSON
metadata
or
as
a
URL
reference.
See
section
3.6
Dialect
Descriptions
for
more
details.
reference
to
a
separate
JSON
object
that
is
a
schema
description
.
templates
transformations
An
array
property
of
template
specifications
transformation
definitions
that
provide
mechanisms
to
transform
the
tabular
data
into
other
formats.
See
section
3.7
Template
Specifications
The
value
of
this
property
becomes
the
value
of
the
transformations
annotation
for
more
details.
all
the
tables
in
the
table
group.
When
an
array
of
template
specifications
transformation
definitions
B
is
imported
merged
into
an
original
array
of
template
specifications
A,
transformation
definitions
A
,
each
template
specification
transformation
definition
within
B
is
combined
into
the
original
array
A
by:
targetFormat
and
templateFormat
url
in
A
,
the
B
is
A
.
B
is
appended
to
the
array
of
A
.
@id
@id
is
a
link
property
that
identifies
the
group
of
tables
,
as
defined
by
[
tabular-data-model
],
described
by
this
table
group
description
.
It
MUST
NOT
start
with
_:
.
The
value
of
this
property
becomes
the
value
of
the
id
annotation
for
the
group
of
tables
.
@type
If
included,
@type
is
an
atomic
property
that
MUST
be
set
to
"TableGroup"
.
Publishers
MAY
include
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
The
description
MAY
contain
any
common
properties
as
defined
in
section
3.3
Common
Properties
to
provide
extra
metadata
about
the
set
group
of
tables
as
a
whole.
The
description
MAY
contain
any
of
the
inherited
properties
defined
in
section
2.2
Inherited
Properties
to
describe
cells
within
the
tables.
A table description is a JSON object that describes a table within a CSV file.
@id
url
This link property gives the single URL of the CSV file that the table is held in, relative to the location of the metadata document. The value of this property is the value of the url annotation for the annotated table this table description describes.
The description of a table MAY also contain:
schema
dialect
As
defined
for
table
groups
.
This
may
be
provided
as
an
embedded
object
within
the
JSON
metadata
or
as
a
URL
reference
to
a
separate
JSON
schema
document.
notes
An
object
array
property
that
provides
an
array
of
objects
representing
annotations.
This
specification
does
not
place
any
constraints
arbitrary
annotations
on
the
structure
annotated
tabular
data
model
.
The
value
of
this
property
becomes
the
value
of
the
notes
annotation
for
the
table
.
The
properties
on
these
objects.
objects
are
interpreted
equivalently
to
common
properties
as
described
in
section
5.8
Common
Properties
.
When
an
array
of
note
objects
B
is
merged
into
an
original
array
of
note
objects
A
,
each
note
object
from
B
is
appended
into
the
array
A
.
The Web Annotation Working Group is developing a vocabulary for expressing annotations. In future versions of this specification, we anticipate referencing that vocabulary.
dialect
suppressOutput
A
boolean
atomic
property
.
@type
If
included,
,
suppresses
any
output
that
would
be
@type
MUST
true
set
to
"Table"
.
Publishers
MAY
include
generated
when
converting
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
Issue
We
invite
comment
on
whether
we
should
include
properties
that
help
in
checking
the
integrity
of
the
file:
datapackage
includes
bytes
and
hash
.
We
could
reuse
the
Subresource
Integrity
work
here.
table.
The
description
MAY
contain
any
common
properties
as
defined
in
section
3.3
Common
Properties
to
provide
extra
metadata
about
value
of
this
property
becomes
the
table
as
a
whole.
The
description
MAY
contain
any
value
of
the
properties
defined
in
section
2.2
Inherited
Properties
suppress
output
to
describe
cells
within
the
annotation
for
this
table.
3.6
Dialect
Descriptions
Much
of
the
tabular
data
that
is
published
on
the
web
The
default
is
messy,
and
CSV
parsers
frequently
need
to
be
configured
in
order
to
correctly
read
in
CSV.
A
dialect
description
provides
hints
to
parsers
about
how
to
parse
the
file
linked
to
from
the
.
@id
property.
It
can
have
any
of
the
following
properties,
which
relate
to
the
flags
described
in
Section
5
Parsing
Tabular
Data
within
[
tabular-data-model
]:
false
lineTerminator
tableDirection
As
defined
for
table
groups
.
The
value
of
this
property
that
sets
the
quote
character
flag
to
becomes
the
single
provided
value,
which
MUST
be
a
single
character.
doubleQuote
A
single
boolean
atomic
property
that,
if
true
,
sets
value
of
the
escape
character
direction
flag
to
"
.
If
false
,
to
\
.
skipRows
annotation
for
this
table.
commentPrefix
tableSchema
An
atomic
object
property
that
sets
the
comment
prefix
flag
to
the
single
provided
value,
which
MUST
be
provides
a
single
character
string.
header
A
single
boolean
atomic
property
that,
if
true
,
sets
the
header
row
count
flag
to
1
,
and
if
false
to
0
,
unless
headerRowCount
schema
description
is
provided,
as
described
in
which
case
the
value
provided
for
the
header
property
is
ignored.
headerRowCount
section
5.5
Schemas
An
atomic
property
that
sets
the
header
row
count
flag
to
the
single
provided
value,
which
MUST
.
This
may
be
a
non-negative
integer.
delimiter
An
atomic
property
that
sets
the
delimiter
flag
to
the
single
provided
value,
which
MUST
be
a
single
character
string.
skipColumns
An
atomic
property
that
sets
the
skip
columns
flag
to
as
an
embedded
object
within
the
single
provided
numeric
value,
which
MUST
be
JSON
metadata
or
as
a
non-negative
integer.
headerColumnCount
An
atomic
property
that
sets
the
header
column
count
flag
URL
reference
to
a
separate
JSON
schema
document.
If
a
table
description
is
within
a
table
group
description
,
the
single
provided
value,
which
MUST
be
non-negative
integer.
skipBlankRows
tableSchema
An
atomic
property
from
that
sets
the
skip
blank
rows
flag
to
the
single
provided
boolean
value.
skipInitialSpace
A
single
boolean
atomic
property
that,
if
true
,
sets
table
group
acts
as
the
trim
flag
to
"start"
.
If
false
,
to
false
.
default
for
this
property.
If
the
a
trim
tableSchema
property
is
provided,
not
declared
in
table
description
,
it
may
be
declared
on
the
skipInitialSpace
property
table
group
description
,
which
is
ignored.
then
used
as
the
schema
for
this
table
description
.
The
trim
@id
A
single
atomic
property
that,
if
of
the
boolean
,
true
tableSchema
sets
the
trim
flag
to
true
and
if
the
boolean
false
to
false
.
If
the
value
provided
there
is
a
string,
sets
the
trim
flag
to
one,
becomes
the
provided
value,
which
MUST
be
one
of
"true"
,
"false"
,
"start"
or
"end"
.
@type
If
included,
@type
MUST
be
set
to
"Dialect"
.
Publishers
MAY
include
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
The
default
dialect
description
for
CSV
files
is:
{
"encoding": "utf-8",
"lineTerminator": "\r\n",
"quoteChar": "\"",
"doubleQuote": true,
"skipRows": 0,
"header": true,
"headerRowCount": 1,
"delimiter": ",",
"skipColumns": 0,
"headerColumnCount": 0,
"skipBlankRows": false,
"skipInitialSpace": false,
"trim": false
}
3.7
Template
Specifications
A
template
specification
is
a
definition
value
of
how
tabular
data
can
be
transformed
into
another
format.
It
has
the
following
properties:
3.7.1
Required
Properties
Template
specifications
MUST
have
the
following
properties:
targetFormat
A
URL
schema
annotation
for
the
format
that
will
be
created
through
the
transformation.
If
one
has
been
defined,
this
should
be
a
URL
for
a
media
type,
in
the
form
http://www.iana.org/assignments/media-types/
media-type
such
as
http://www.iana.org/assignments/media-types/text/calendar
.
Otherwise,
it
can
be
any
URL
that
describes
the
target
format.
table.
The
When
a
schema
is
referenced
by
URL,
this
URL
becomes
the
value
of
the
targetFormat
@id
URL
is
intended
as
an
informative
identifier
for
property
in
the
target
format,
normalized
schema
description,
and
applications
MAY
NOT
access
thus
the
URL.
value
of
the
schema
annotation
on
the
table.
templateFormat
transformations
A
URL
As
defined
for
the
format
that
is
used
by
the
template.
If
one
has
been
defined,
table
groups
.
The
value
of
this
should
be
a
URL
for
a
media
type,
in
property
becomes
the
form
http://www.iana.org/assignments/media-types/
media-type
such
as
http://www.iana.org/assignments/media-types/application/javascript
.
Otherwise,
it
can
be
any
URL
that
describes
value
of
the
template
format.
Note
The
templateFormat
URL
is
intended
as
an
informative
identifier
transformations
annotation
for
the
template
format,
and
applications
MAY
NOT
access
the
URL.
The
template
formats
that
an
application
supports
are
implementation
defined.
this
table.
title
@id
If
included,
application/json
@id
)
and
the
transformation
is
creating
a
specific
profile
of
that
format.
source
A
single
string
atomic
link
property
that
provides,
if
included,
the
format
to
which
the
tabular
data
should
be
transformed
prior
to
the
transformation
using
the
template.
If
the
value
is
"json"
,
the
tabular
data
should
first
be
transformed
first
to
JSON
based
on
the
simple
mapping
defined
in
Generating
JSON
from
Tabular
Data
on
the
Web
.
If
the
value
is
"rdf"
,
it
should
similarly
first
be
transformed
to
XML
based
on
identifies
the
simple
mapping
table
,
as
defined
in
Generating
RDF
from
Tabular
Data
on
the
Web
[
tabular-data-model
],
described
by
this
table
description
.
If
the
It
MUST
NOT
start
with
.
The
value
of
this
property
source
_:
is
missing
or
null
then
becomes
the
source
value
of
the
transformation
is
the
annotated
tabular
data
model.
id
annotation
for
this
table.
@type
If
included,
@type
is
an
atomic
property
that
MUST
be
set
to
.
Publishers
MAY
include
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
"Template"
"Table"
The
template
specification
description
MAY
contain
any
common
properties
as
defined
in
section
3.3
Common
Properties
to
provide
extra
metadata
about
the
transformation.
table
as
a
whole.
The
following
template
specification
will
enable
a
processor
that
supports
it
to
generate
an
iCalendar
document
using
a
Mustache
template
description
MAY
contain
inherited
properties
based
on
the
JSON
created
from
the
simple
mapping
to
JSON.
describe
cells
within
the
table.
A schema is a definition of a tabular format that may be common to multiple tables. For example, multiple tables from different sources may have the same columns and be designed such that they can be aggregated together.
A
schema
description
is
a
JSON
object
that
encodes
the
information
about
a
schema.
schema
,
which
describes
the
structure
of
a
table.
All
the
properties
of
a
schema
description
are
optional.
columns
An
array
property
of
column
descriptions
as
described
in
section
3.9
5.6
Columns
.
These
are
matched
to
columns
in
tables
that
use
the
schema
by
position:
the
first
column
description
in
the
array
applies
to
the
first
column
in
the
table,
the
second
to
the
second
and
so
on.
The
name
properties
of
the
column
descriptions
MUST
be
unique
within
a
given
table
description.
When
an
array
of
column
descriptions
B
is
imported
merged
into
an
original
array
of
column
descriptions
A,
A
,
each
column
description
within
B
is
combined
into
the
original
array
A
,
based
on
the
index
of
each
column
description,
as
follows:
by:
name
and
titles
values
for
the
column
description
at
the
same
index
within
A
and
name
B
,
the
column
description
from
B
is
A
.
A
and
B
,
implementations
MUST
generate
an
error.
A
,
but
there
is
B
,
then:
primaryKey
virtual
primaryKey
B
is
["familyName",
"givenName"]
true
,
then
A
.
B
,
but
there
is
a
column
description
within
A
,
then:
virtual
property
of
the
column
description
in
familyName
A
givenName
columns.
Issue
66
Composite
primary
keys
and
foreign
key
references.
true
,
then
the
column
description
is
retained.
foreignKeys
An
array
property
of
foreign
key
definitions
that
define
how
the
values
from
specified
columns
within
this
table
link
to
rows
within
this
table
or
other
tables.
A
foreign
key
definition
is
a
JSON
object
with
that
MUST
contain
only
the
following
properties:
columns
columnReference
A column reference property that holds either a single reference to a column description object within this schema, or an array of references. These form the referencing columns for the foreign key definition .
reference
An
object
with
the
properties:
property
that
identifies
a
referenced
table
and
a
set
of
referenced
columns
within
that
table.
Its
properties
are:
resource
A
link
property
holding
a
URL
that
is
the
identifier
for
a
specific
resource
table
that
is
being
referenced.
If
this
property
is
present
then
MUST
NOT
be
present.
The
schema
schemaReference
metadata
document
table
group
MUST
contain
a
description
table
whose
url
annotation
is
identical
to
the
expanded
value
of
this
property.
That
table
is
the
resource.
referenced
table
.
schema
schemaReference
A
link
property
holding
a
URL
that
is
the
identifier
for
a
schema
that
is
being
referenced.
If
this
property
is
present
then
resource
MUST
NOT
be
present.
The
metadata
document
that
forms
the
basis
of
processing
table
group
MUST
contain
a
description
of
table
with
a
resource
tableSchema
having
a
@id
that
uses
is
identical
to
the
referenced
schema,
expanded
value
of
this
property,
and
there
MUST
NOT
be
more
than
one
such
resource.
table.
That
table
is
the
referenced
table
.
columns
columnReference
A
column
reference
property
that
holds
either
a
single
reference
(by
name)
to
a
column
description
object
within
this
schema,
the
tableSchema
of
the
referenced
table
,
or
an
array
of
such
references.
The value of this property becomes the foreign keys annotation on the table using this schema by creating a list of foreign keys comprising a list of columns in the table and a list of columns in the referenced table. The value of this property is also used to create the value of the referenced rows annotation on each of the rows in the table that uses this schema, which is a pair of the relevant foreign key and the referenced row in the referenced table.
As defined in [ tabular-data-model ], validators MUST check that, for each row, the combination of cells in the referencing columns references a unique row within the referenced table through a combination of cells in the referenced columns . For examples, see section 5.5.1.1 Foreign Key Reference Between Tables and section 5.5.1.2 Foreign Key Reference Between Schemas .
It
is
not
required
for
the
resource
table
or
schema
referenced
from
a
foreignKeys
property
to
have
a
similarly
defined
primaryKey
,
though
frequently
it
will.
.
When
an
array
of
foreign
key
definitions
B
is
imported
merged
into
an
original
array
of
foreign
key
definitions
A,
A
,
each
foreign
key
definition
within
B
which
does
not
appear
within
A
is
appended
to
the
original
array
A.
A
.
primaryKey
A
column
reference
property
The
cross
that
holds
either
a
single
reference
between
files
should
be
limited
to
files
from
one
publisher
-
else
they
are
just
web
links
with
no
guarantee
a
column
description
object
or
an
array
of
whether
references.
The
value
of
this
property
becomes
the
target
primary
key
annotation
for
each
row
within
a
table
that
uses
this
schema
by
creating
a
list
of
the
link
exists
which
'foreign
key'
might
imply.
cells
in
that
row
that
are
in
the
referenced
columns.
As
defined
in
[
tabular-data-model
],
validators
MUST
check
that
each
row
has
a
unique
combination
of
values
of
cells
in
the
indicated
columns.
For
example,
if
primaryKey
is
set
to
["familyName",
"givenName"]
then
every
row
must
have
a
unique
value
for
the
combination
of
values
of
cells
in
the
familyName
and
givenName
columns.
urlTemplate
@id
If
included,
@id
is
a
link
property
that
MAY
identifies
the
schema
described
by
this
schema
description
.
It
MUST
NOT
be
used
to
create
a
unique
identifier
for
each
row
when
mapping
data
to
other
formats.
start
with
_:
.
@type
If
included,
@type
is
an
atomic
property
that
MUST
be
set
to
"Schema"
.
Publishers
MAY
include
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
The
description
MAY
contain
any
common
properties
as
defined
in
section
3.3
Common
Properties
to
provide
extra
metadata
about
the
schema
as
a
whole.
The
description
MAY
contain
any
of
the
inherited
properties
defined
for
to
describe
cells
in
section
2.2
Inherited
Properties
.
within
tables
that
use
this
schema.
This section is non-normative.
A
list
of
countries
is
published
at
http://example.org/countries.csv
with
the
structure:
countryCode,latitude,longitude,name AD,42.546245,1.601554,Andorra AE,23.424076,53.847818,"United Arab Emirates" AF,33.93911,67.709953,Afghanistan
Another
file
contains
information
about
the
population
in
some
countries
each
year,
at
http://example.com/country_slice.csv
with
the
structure:
countryRef,year,population AF,1960,9616353 AF,1961,9799379 AF,1962,9989846
The
following
metadata
for
the
group
of
tables
links
the
two
together
by
defining
a
foreignKeys
property:
{ "@context": "http://www.w3.org/ns/csvw", "tables": [{ "url": "http://example.org/countries.csv", "tableSchema": { "columns": [{ "name": "countryCode", "datatype": "string", "propertyUrl": "http://www.geonames.org/ontology{#_name}" }, { "name": "latitude", "datatype": "number" }, { "name": "longitude", "datatype": "number" }, { "name": "name", "datatype": "string" }], "aboutUrl": "http://example.org/countries.csv{#countryCode}", "propertyUrl": "http://schema.org/{_name}", "primaryKey": "countryCode" } }, { "url": "http://example.org/country_slice.csv", "tableSchema": { "columns": [{ "name": "countryRef", "valueUrl": "http://example.org/countries.csv{#countryRef}" }, { "name": "year", "datatype": "gYear" }, { "name": "population", "datatype": "integer" }], "foreignKeys": [{ "columnReference": "countryRef", "reference": { "resource": "http://example.org/countries.csv", "columnReference": "countryCode" } }] } }] }
When
Within
the
population
data
in
annotated
table
generated
for
,
each
row
will
have
a
primary
key
annotation
whose
value
is
country_slice.csv
countries.csv
processed
(displayed
or
mapped
into
another
format),
a
link
can
be
made
from
list
containing
the
content
of
cell
from
the
countryRef
first
column
based
on
the
of
that
row
(
).
urlTemplate
countryCode
The
annotated
table
generated
for
country.csv
.
For
example,
if
the
countryRef
country_slice.csv
column
(the
will
have
a
foreign
keys
annotation
whose
value
of
columns
in
is
a
list
containing
a
single
foreign
key
referencing
the
foreignKeys
object)
in
first
column
from
the
table
generated
from
country_slice.csv
contains
the
value
(
UK
countryRef
then
)
and
the
processor
will
use
that
value
to
populate
first
column
from
the
table
generated
from
countryCode
countries.csv
variable
(the
value
of
(
).
Each
row
within
that
table
will
have
a
referenced
row
annotation
referencing
this
foreign
key
and
the
third
row
in
the
table
generated
from
reference.columns
countryCode
.foreignKeys
object)
when
interpreting
countries.csv
When
the
population
data
in
urlTemplate
country_slice.csv
for
country.csv
,
and
create
is
validated,
the
URL
http://example.org/countries.csv#UK
.
The
processor
does
not
need
to
retrieve
http://example.org/countries.csv
or
validator
must
check
that
the
value
every
UK
countryRef
appears
within
the
countryCode
country_slice.csv
column
to
create
this
link:
it
is
created
purely
based
on
the
has
a
matching
urlTemplate
countryCode
in
the
description
of
the
referenced
resource.
within
countries.csv
.
When
publishing
information
about
public
sector
roles
and
salaries,
as
in
Use
Case
4
,
the
UK
government
requires
departments
to
publish
two
files
which
are
interlinked.
The
first
lists
senior
grades
(simplified
here)
eg
e.g.,
at
HEFCE_organogram_senior_data_31032011.csv
:
Post Unique Reference, Name,Grade, Job Title,Reports to Senior Post 90115, Steve Egan,SCS1A,Deputy Chief Executive, 90334 90250, David Sweeney,SCS1A, Director, 90334 90284, Heather Fry,SCS1A, Director, 90334 90334,Sir Alan Langlands, SCS4, Chief Executive, xx
The
second
provides
information
about
the
number
of
junior
positions
that
report
to
those
individuals
(simplified
here)
eg
e.g.,
at
HEFCE_organogram_junior_data_31032011.csv
:
Reporting Senior Post,Grade,Payscale Minimum (£),Payscale Maximum (£),Generic Job Title,Number of Posts in FTE, Profession 90284, 4, 17426, 20002, Administrator, 2,Operational Delivery 90284, 5, 19546, 22478, Administrator, 1,Operational Delivery 90115, 4, 17426, 20002, Administrator, 8.67,Operational Delivery 90115, 5, 19546, 22478, Administrator, 0.5,Operational Delivery
The schemas are reused by multiple departments and for multiple pairs of files. The schemas are therefore defined in separate files, and they need to define links between the schemas which are then picked up as applying between tables that use those schemas.
The metadata file for the particular publication of the files above is:
{ "@context": "http://www.w3.org/ns/csvw", "tables": [{ "url": "HEFCE_organogram_senior_data_31032011.csv", "tableSchema": "http://example.org/schema/senior-roles.json" }, { "url": "HEFCE_organogram_junior_data_31032011.csv", "tableSchema": "http://example.org/schema/junior-roles.json" }] }
The
schema
for
the
senior
role
CSV
(at
http://example.org/schema/senior-roles.json
)
is
as
follows;
it
includes
a
foreign
key
reference
to
itself:
follows:
{ "@id": "http://example.org/schema/senior-roles.json", "@context": "http://www.w3.org/ns/csvw", "columns": [{ "name": "ref", "titles": "Post Unique Reference" }, { "name": "name", "titles": "Name" }, { "name": "grade", "titles": "Grade" }, { "name": "job", "titles": "Job Title" }, { "name": "reportsTo", "titles": "Reports to Senior Post" }], "primaryKey": "ref" }
The
schema
for
the
junior
role
CSV
(at
http://example.org/schema/junior-roles.json
)
is
as
follows;
it
includes
a
foreign
key
reference
to
the
senior
roles
schema:
{ "@id": "http://example.org/schema/junior-roles.json", "@context": "http://www.w3.org/ns/csvw", "columns": [{ "name": "reportsTo", "titles": "Reporting Senior Post" }, ... ], "foreignKeys": [{ "columnReference": "reportsTo", "reference": { "schemaReference": "http://example.org/schema/senior-roles.json", "columnReference": "ref" } }] }
In
The
foreign
key
definition
here
contains
a
schemaReference
to
senior-roles.json
.
Implementations
will
look
for
the
table
referenced
within
the
original
metadata
file
whose
tableSchema
is
senior-roles.json
,
which
is
HEFCE_organogram_senior_data_31032011.csv
.
The
implementation
will
therefore
look
for
a
relationship
between
the
reportsTo
column
in
HEFCE_organogram_junior_data_31032011.csv
and
the
ref
column
in
HEFCE_organogram_senior_data_31032011.csv
.
For
example,
in
the
first
line
of
HEFCE_organogram_junior_data_31032011.csv
,
the
reportsTo
(
Reporting
Senior
Post
)
column
contains
the
value
90284
.
When
creating
validating
that
file,
validators
will
check
that
there
is
a
link
single
row
within
the
table
generated
from
HEFCE_organogram_senior_data_31032011.csv
whose
ref
column
contains
the
value
90284
.
Foreign
key
definitions
provide
for
strong
linking
between
tables
that
column,
guarantees
(through
validation)
the
existance
of
a
referenced
row.
It
is
also
possible
to
provide
weak
linking
between
tables
that
are
not
tested
by
validations
but
which
may
be
useful
when
converting
tabular
data
into
other
formats,
using
urlTemplate
aboutUrl
defined
within
and
valueUrl
.
Taking
the
example
above
as
a
starting
point,
the
schema
at
for
http://example.org/schema/senior-roles.json
HEFCE_organogram_senior_data_31032011.csv
is
used
could
use
aboutUrl
to
generate
provide
a
URL
by
expanding
the
variable
reference
for
each
row,
which
can
similarly
be
created
as
a
ref
valueUrl
based
on
the
value
from
for
the
reportsTo
column.
This
gives
column:
{ "@id": "http://example.org/schema/senior-roles.json", "@context": "http://www.w3.org/ns/csvw", "aboutUrl": "#role-{ref}", "columns": [{ "name": "ref", "titles": "Post Unique Reference" }, { "name": "name", "titles": "Name" }, { "name": "grade", "titles": "Grade" }, { "name": "job", "titles": "Job Title" }, { "name": "reportsTo", "titles": "Reports to Senior Post", "valueUrl": "#role-{reportsTo}" }], "primaryKey": "ref" }
The
URLs
generated
for
the
values
of
the
relative
URL
#post-90284
reportsTo
which
will
(if
the
data
is
then
resolved
against
correct)
match
the
base
URL
of
URLs
generated
for
each
row
within
the
resource
table.
There
will
be
no
validation
error,
however,
if
there
is
a
value
in
the
reportsTo
column
that
uses
does
not
match
a
value
in
the
senior-roles.json
ref
schema
within
column.
In
contrast,
if
a
foreign
key
had
been
specified
with:
"foreignKeys": [{ "columnReference": "reportsTo", "reference": { "schemaReference": "http://example.org/schema/senior-roles.json", "columnReference": "ref" } }]
then
validators
would
raise
an
error
if
a
value
in
the
original
metadata
file,
namely
column
did
not
match
any
value
in
the
HEFCE_organogram_senior_data_31032011.csv
.
reportsTo
ref
column.
A
column
description
is
a
simple
JSON
object
that
describes
a
single
column.
The
description
provides
additional
human-readable
documentation
for
a
column,
as
well
as
additional
information
that
may
be
used
to
validate
the
cells
within
the
column,
create
a
user
interface
for
data
entry,
or
inform
conversion
into
other
formats.
All
properties
are
optional.
name
An
atomic
property
that
gives
a
single
canonical
name
for
the
column.
The
value
of
this
property
becomes
the
name
annotation
for
the
described
column
.
This
MUST
be
a
string.
Conversion
specifications
MUST
use
string
and
this
property
as
the
basis
for
the
names
of
properties/elements/attributes
in
has
no
default
value,
which
means
it
MUST
be
ignored
if
the
results
of
conversions.
supplied
value
is
not
a
string.
For
ease
of
reference
within
URI
template
properties
,
column
names
SHOULD
consist
only
of
alphanumeric
characters
or
underscores
(
[a-zA-Z0-9_]+
).
Names
are
restricted
as
defined
in
Variables
in
[
URI-TEMPLATE
]
with
the
additional
provision
that
names
beginning
with
are
reserved
by
this
specification
and
MUST
NOT
be
_
"_"
used.
Issue
33
What
do
to
with
conversion
if
no
column
name
is
given?
Issue
53
We
invite
comment
on
what
the
syntactic
limitations
should
be
on
column
names
to
make
them
most
useful
when
used
as
the
basis
of
conversion
into
other
formats,
bearing
in
mind
that
different
target
languages
such
as
JSON,
RDF
and
XML
have
different
syntactic
limitations
and
common
naming
conventions.
within
metadata
documents.
title
suppressOutput
A
boolean
atomic
property
and
the
column
already
has
a
.
If
,
suppresses
any
output
that
would
be
generated
when
converting
cells
in
this
column.
The
value
of
this
property
becomes
the
title
annotation
then
a
validator
MUST
issue
a
warning
if
true
existing
title
suppress
output
annotation
does
not
match
the
name
specified
in
for
the
described
column
description.
.
The
default
is
false
.
title
titles
A
natural
language
property
that
provides
possible
alternative
names
for
the
column.
The
possible
column
string
values
of
this
property,
along
with
their
associated
language
tags,
become
the
titles
are
defined
as:
if
annotation
for
the
value
of
described
column
.
If
there
is
no
title
name
is
a
string,
that
string
if
property
defined
on
this
column,
the
value
of
first
title
titles
is
an
array,
the
strings
in
that
array
if
the
value
of
having
the
same
language
tag
as
default
language
,
or
title
und
is
an
object,
the
string
or
strings
that
are
the
value
of
the
property
of
that
object
whose
name
if
no
default
language
is
specified,
becomes
the
column
language
name
where
annotation
for
the
described
column
language
is
the
value
of
.
This
annotation
MUST
be
percent-encoded
as
necessary
to
conform
to
the
syntactic
requirements
defined
in
[
RFC3986
]
language
virtual
A
boolean
atomic
property
on
taking
a
single
value
which
indicates
whether
the
column
description,
or
(if
there
is
no
such
language),
a
virtual
column
not
present
in
the
original
source.
The
default
value
of
the
is
.
The
normalized
value
of
this
property
language
false
on
the
table
description.
If
becomes
the
column
already
has
a
title
virtual
annotation
(because
a
header
row
has
been
included
in
for
the
original
CSV
file)
then
described
column
.
If
present,
a
validator
virtual
column
MUST
issue
a
warning
if
the
existing
title
annotation
is
not
appear
after
all
other
non-virtual
column
definitions.
Virtual
columns
are
useful
for
inserting
cells
with
default
values
into
an
annotated
table
to
control
the
same
as
any
results
of
the
possible
column
titles
.
conversions.
The
facility
We
invite
comment
on
whether
virtual
columns
are
useful
enough
to
specify
multiple
potential
titles
for
a
column
is
important
when
include
in
the
same
column
description
is
used
for
multiple
CSVs,
through
a
mechanism
yet
to
be
defined
by
this
specification.
final
recommendation
in
spite
of
the
added
complexity.
required
@id
If
included,
predicateUrl
@id
An
atomic
is
a
link
property
that
holds
one
or
more
URIs
that
MAY
be
used
as
URIs
for
predicates
if
identifies
the
table
is
mapped
to
another
format.
columns
,
as
defined
in
[
tabular-data-model
],
and
potentially
appearing
across
separate
tables,
described
by
this
column
description
.
It
MUST
NOT
start
with
_:
.
@type
If
included,
@type
is
an
atomic
property
that
MUST
be
set
to
"Column"
.
Publishers
MAY
include
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
If
the
column
description
has
neither
name
nor
titles
properties,
the
string
"_col.
[N]
"
where
[N]
is
the
column
number
,
becomes
the
name
annotation
for
the
described
column
.
The
description
MAY
contain
any
common
properties
as
defined
in
section
3.3
Common
Properties
to
provide
extra
metadata
about
the
column
as
a
whole,
such
as
a
full
description.
The
description
MAY
contain
any
of
the
inherited
properties
defined
for
to
describe
cells
in
within
the
column.
This section is non-normative.
virtual
columns
Virtual
columns
are
useful
when
data
needs
to
be
added
as
part
of
an
output
transformation
that
doesn't
exist
in
the
source
file.
This
may
be
to
add
type
information
to
a
column,
or
to
relate
different
columns
having
different
aboutUrl
.
For
example,
the
http://example.org/tree-ops.csv
example
used
in
the
introduction
can
be
used
with
the
following
metadata:
{ "url": "tree-ops.csv", "@context": ["http://www.w3.org/ns/csvw", {"@language": "en"}], "tableSchema": { "columns": [{ "name": "GID", "titles": "GID", "datatype": "string", "propertyUrl": "schema:url", "valueUrl": "#gid-{GID}" }, { "name": "on_street", "titles": "On Street", "datatype": "string", "aboutUrl": "#location-{GID}", "propertyUrl": "schema:streetAddress" }, { "name": "species", "titles": "Species", "datatype": "string", "propertyUrl": "schema:name" }, { "name": "trim_cycle", "titles": "Trim Cycle", "datatype": "string" }, { "name": "inventory_date", "titles": "Inventory Date", "datatype": {"base": "date", "format": "M/d/yyyy"}, "aboutUrl": "#event-{inventory_date}", "propertyUrl": "schema:startDate" }, { "propertyUrl": "schema:event", "valueUrl": "#event-{inventory_date}", "virtual": true }, { "propertyUrl": "schema:location", "valueUrl": "#location-{GID}", "virtual": true }, { "aboutUrl": "#location-{GID}", "propertyUrl": "rdf:type", "valueUrl": "schema:PostalAddress", "virtual": true }], "aboutUrl": "#gid-{GID}" } }
This
metadata
creates
a
relationship
model
between
data
in
each
column
by
different
combinations
of
aboutUrl
,
propertyUrl
,
and
valueUrl
on
existing
columns,
and
defining
new
virtual
columns
to
supply
additional
information.
In
this
case,
the
on_street
and
inventory_date
values
are
split
into
separate
entities,
each
having
their
own
aboutUrl
.
New
virtual
columns
are
defined
to
provide
a
location
type,
and
to
relate
the
main
row
entity
to
the
event
and
location
associated
with
it.
The
result
of
converting
the
table
to
RDF
would
include
the
following,
for
the
first
row,
with
the
contributions
from
the
virtual
columns
highlighted:
<#gid-1> schema:url <#gid-1> ; schema:name "Celtis australis" ; :trim_cycle "Large Tree Routine Prune" ; schema:event <#event-2010-10-18> ; schema:location <#location-1> ; . <#event-1> a schema:Event ; schema:startDate "2010-10-18"^^xsd:date ; . <#location-1> a schema:PostalAddress ; schema:streetAddress "ADDISON AV" ; .
The JSON would similarly include, again with the contributions from the virtual columns highlighted:
{ "@id": "#gid-1", "schema:url": "#gid-1", "schema:name": "Celtis australis", "trim_cycle": "Large Tree Routine Prune", "schema:event": { "@id": "#event-1", "@type": "schema:Event", "schema:startDate": "2010-10-18" }, "schema:location": { "@id": "#location-1", "@type": "schema:PostalAddress", "schema:streetAddress": "ADDISON AV" } }
Cell
descriptions
A
cell
may
override
inherited
be
assigned
annotations
based
on
properties
on
the
description
objects
for
the
group
of
tables
,
table
,
schema
,
or
column
that
it
appears
in.
These
properties
are
known
as
inherited
properties
and
are
listed
below.
To
ascertain
a
value
for
certain
annotations
on
cells,
an
application
MUST
identify
the
relevant
property
in
the
descriptions
of
the
group
of
tables,
table,
schema,
or
column.
aboutUrl
A URI template property that MAY be used to indicate what a cell contains information about. The value of this property becomes the about URL annotation for the described column .
aboutUrl
is
typically
defined
on
a
schema
description
or
table
description
to
indicate
what
each
row
is
about.
If
defined
on
individual
column
descriptions
,
care
must
be
taken
to
ensure
that
transformed
cell
values
maintain
a
semantic
relationship.
datatype
An
atomic
property
that
contains
either
a
single
string
that
is
the
main
datatype
of
the
values
of
the
cell
or
a
datatype
description
object.
If
the
value
of
this
property
is
a
string,
it
MUST
be
one
of
the
built-in
datatypes
defined
in
section
2.
5.11.1
Annotating
Tables
Built-in
Datatypes
.
It
;
if
it
is
good
practice
to
define
these
properties
an
object
then
it
describes
a
more
specialised
datatype.
If
a
cell
contains
a
sequence
(ie
the
separator
property
is
specified
and
not
null
)
then
this
property
specifies
the
datatype
of
each
value
within
that
sequence.
See
5.11
Datatypes
and
Parsing
Cells
in
[
tabular-data-model
]
for
more
details.
The normalized value of this property becomes the datatype annotation for the described column .
We
invite
comment
on
columns,
so
whether
datatype
should
allow
for
a
"union"
of
types
for
a
cell;
this
would
allow
for
a
set
of
datatypes
that
all
cells
within
could
be
matched
against
the
string
value
of
a
given
column
are
handled
in
cell,
choosing
the
same
way,
first
match;
e.g.,
to
match
either
a
date
or
on
tables
if
appropriate.
These
properties
are:
datetime
.
null
default
An
atomic
property
giving
the
holding
a
single
string
or
strings
that
is
used
to
create
a
default
value
for
null
values.
the
cell
in
cases
where
the
original
string
value
is
an
empty
string.
See
Parsing
Cells
in
[
tabular-data-model
]
for
more
details.
If
not
specified,
the
default
for
this
the
default
property
is
the
empty
string.
string,
""
.
The
value
of
this
property
becomes
the
default
annotation
for
the
described
column
.
language
lang
An
atomic
property
giving
a
single
string
language
code
as
defined
by
[
BCP47
].
Indicates
the
language
of
the
value
within
the
cell.
See
Parsing
Cells
in
[
tabular-data-model
]
for
more
details.
The
value
of
this
property
becomes
the
lang
annotation
for
the
described
column
.
The
default
is
und
.
text-direction
null
An
atomic
property
that
MUST
have
giving
the
string
or
strings
used
for
null
values
within
the
data.
If
the
string
value
of
the
cell
is
equal
to
any
one
of
these
values,
the
cell
value
is
null
.
See
Parsing
Cells
in
[
tabular-data-model
]
for
more
details.
If
not
specified,
the
default
for
the
null
property
is
the
empty
string
""
.
The
value
of
this
property
becomes
the
null
annotation
for
the
described
column
.
ordered
A
boolean
atomic
property
taking
a
single
string
value
which
indicates
whether
a
list
that
is
one
the
value
of
the
cell
is
ordered
(if
)
or
unordered
(if
"rtl"
true
"ltr"
false
(the
default).
Indicates
whether
).
The
default
is
false
.
This
property
is
irrelevant
if
the
text
within
separator
is
null
or
undefined,
but
this
is
not
an
error.
The
value
of
this
property
becomes
the
ordered
annotation
for
the
described
column
,
and
the
ordered
annotation
for
the
cells
should
within
that
column.
propertyUrl
An
URI
template
property
that
MAY
be
displayed
by
default
as
left-to-right
or
right-to-left
text.
See
section
4.1.1
Bidirectional
Tables
used
to
create
a
URI
for
a
property
if
the
table
is
mapped
to
another
format.
The
value
of
this
property
becomes
the
property
URL
annotation
for
the
described
column
.
propertyUrl
is
typically
defined
on
a
column
description
.
If
defined
on
a
schema
description
,
table
description
or
table
group
description
,
care
must
be
taken
to
ensure
that
transformed
cell
values
maintain
an
appropriate
semantic
relationship,
for
more
details.
example
by
including
the
name
of
the
column
in
the
generated
URL
by
using
_name
in
the
template.
required
A
boolean
atomic
property
taking
a
single
value
which
indicates
whether
the
cell
must
have
a
non-null
value.
The
default
is
false
.
The
value
of
this
property
becomes
the
required
annotation
for
the
described
column
.
separator
An
atomic
property
that
MUST
have
a
single
string
value
that
is
the
character
used
to
separate
items
in
the
string
value
of
the
cell.
If
null
(the
default)
or
unspecified,
the
cell
does
not
contain
a
list.
Otherwise,
application
MUST
split
the
string
value
of
the
cell
on
the
specified
separator
character
and
parse
each
of
the
resulting
strings
separately.
The
cell's
value
will
then
be
a
list.
Conversion
specifications
MUST
use
the
separator
to
determine
the
conversion
of
a
cell
into
the
target
format.
See
3.12
Parsing
cells
Cells
in
[
tabular-data-model
]
for
more
details.
The
value
of
this
property
becomes
the
separator
annotation
for
the
described
column
.
default
textDirection
An
atomic
property
holding
a
single
string
that
provides
MUST
have
a
default
string
value
for
the
cell
in
cases
where
the
original
single
string
value
that
is
a
one
of
null
"rtl"
value.
This
or
"ltr"
(the
default).
Indicates
whether
the
text
within
cells
should
be
displayed
by
default
as
left-to-right
or
right-to-left
text.
The
value
MAY
be
used
when
converting
of
this
property
becomes
the
table
into
other
formats.
text
direction
annotation
for
the
column
.
See
Bidirectional
Tables
in
[
tabular-data-model
]
for
details.
format
valueUrl
An
atomic
URI
template
property
that
contains
a
single
string
that
is
used
to
map
the
definition
values
of
the
format
cells
into
URLs.
The
value
of
this
property
becomes
the
cell,
used
when
parsing
value
URL
annotation
for
the
described
column
.
This
allows
processors
to
build
URLs
from
cell
values
,
for
example
to
reference
RDF
resources
,
as
described
defined
in
[
3.12
Parsing
cells
rdf-concepts
].
For
example,
if
the
value
URL
were
"{#reference}"
,
each
cell
value
of
a
column
named
reference
would
be
used
to
create
a
URI
such
as
http://example.com/#1234
,
if
1234
were
a
cell
value
of
that
column.
valueUrl
is
typically
defined
on
a
column
description
.
If
defined
on
a
schema
description
,
table
description
or
table
group
description
,
care
must
be
taken
to
ensure
that
transformed
cell
values
maintain
an
appropriate
semantic
relationship.
The value of an inherited property is the first value, if any, found by looking in the current description object through all of its containing objects: a inherited property defined in a column description takes precedence of one defined in a schema description , which in turn takes precedence of one defined in a table description , which in turn takes precedence of one defined in a table group description .
This section is non-normative.
In
the
following
example,
property
is
defined
on
the
datatype
aboutUrl
tableSchema
,
and
therefore
affects
all
cells
for
that
table.
{ "@context": ["http://www.w3.org/ns/csvw", {"@language": "en"}], "url": "tree-ops.csv", "dc:title": "Tree Operations", "dcat:keyword": ["tree", "street", "maintenance"], "dc:publisher": { "schema:name": "Example Municipality", "schema:url": {"@id": "http://example.org"} }, "dc:license": {"@id": "http://opendefinition.org/licenses/cc-by/"}, "dc:modified": {"@value": "2010-12-31", "@type": "xsd:date"}, "tableSchema": { "columns": [{ "name": "GID", "titles": ["GID", "Generic Identifier"], "dc:description": "An identifier for the operation on a tree.", "datatype": "string", "required": true }, { "name": "on_street", "titles": "On Street", "dc:description": "The street that the tree is on.", "datatype": "string" }, { "name": "species", "titles": "Species", "dc:description": "The species of the tree.", "datatype": "string" }, { "name": "trim_cycle", "titles": "Trim Cycle", "dc:description": "The operation performed on the tree.", "datatype": "string" }, { "name": "inventory_date", "titles": "Inventory Date", "dc:description": "The date of the operation that was performed.", "datatype": {"base": "date", "format": "M/d/yyyy"} }], "primaryKey": "GID", "aboutUrl": "#gid-{GID}" } }
An
atomic
The
equivalent
effect
could
be
achieved
by
using
the
aboutUrl
property
on
each
column:
{ "@context": ["http://www.w3.org/ns/csvw", {"@language": "en"}], "url": "tree-ops.csv", "dc:title": "Tree Operations", "dcat:keyword": ["tree", "street", "maintenance"], "dc:publisher": { "schema:name": "Example Municipality", "schema:url": {"@id": "http://example.org"} }, "dc:license": {"@id": "http://opendefinition.org/licenses/cc-by/"}, "dc:modified": {"@value": "2010-12-31", "@type": "xsd:date"}, "tableSchema": { "columns": [{ "name": "GID", "titles": ["GID", "Generic Identifier"], "aboutUrl": "#gid-{GID}", "dc:description": "An identifier for the operation on a tree.", "datatype": "string", "required": true }, { "name": "on_street", "titles": "On Street", "aboutUrl": "#gid-{GID}", "dc:description": "The street that the tree is on.", "datatype": "string" }, { "name": "species", "titles": "Species", "aboutUrl": "#gid-{GID}", "dc:description": "The species of the tree.", "datatype": "string" }, { "name": "trim_cycle", "titles": "Trim Cycle", "aboutUrl": "#gid-{GID}", "dc:description": "The operation performed on the tree.", "datatype": "string" }, { "name": "inventory_date", "titles": "Inventory Date", "aboutUrl": "#gid-{GID}", "dc:description": "The date of the operation that was performed.", "datatype": {"base": "date", "format": "M/d/yyyy"} }], "primaryKey": "GID" } }
Descriptions
of
groups
of
tables,
tables,
schemas
and
columns
MAY
contain
any
common
properties
whose
names
are
either
absolute
URLs
or
prefixed
names
.
For
example,
a
table
description
may
contain
dc:description
,
dcat:keyword
,
or
schema:copyrightHolder
properties
to
provide
a
description,
keywords,
or
the
name
of
the
copyright
holder,
as
defined
in
Dublin
Core
Terms
,
DCAT
,
or
schema.org
.
The
names
of
common
properties
are
prefixed
names
,
in
the
syntax
prefix
:
name
.
Prefixed
names
that
contains
can
be
expanded
to
provide
a
single
string
URI,
by
replacing
the
prefix
and
following
colon
with
the
URI
that
the
prefix
is
associated
with.
Expansion
is
intended
to
be
entirely
consistent
with
Section
6.3
IRI
Expansion
in
[
JSON-LD-API
]
and
implementations
MAY
use
a
JSON-LD
processor
for
performing
prefixed
name
and
IRI
expansion.
The
prefixes
that
are
recognized
are
those
defined
for
[
rdfa-core
]
within
the
main
datatype
of
RDFa
1.1
Initial
Context
and
other
prefixes
defined
within
[
csvw-context
]
and
these
MUST
NOT
be
overridden.
These
prefixes
are
periodically
extended;
refer
to
[
csvw-context
]
for
details.
Properties
from
other
vocabularies
MUST
be
named
using
absolute
URLs.
Forbidding
the
values
declaration
of
new
prefixes
ensures
consistent
processing
between
JSON-LD-aware
and
non-JSON-LD-aware
processors.
This
specification
does
not
define
how
common
properties
are
interpreted
by
implementations.
Implementations
SHOULD
treat
the
cell.
If
prefixed
names
for
common
properties
and
the
URLs
that
they
expand
into
in
the
same
way.
For
example,
if
an
implementation
recognises
and
displays
the
value
of
the
cell
contains
a
list
(ie
separator
dc:description
is
specified
property,
it
should
also
recognise
and
not
display
the
value
of
the
null
http://purl.org/dc/terms/description
)
then
this
is
property
in
the
datatype
same
way.
Common
properties
can
take
any
JSON
value,
so
long
as
any
objects
within
the
list.
Conversion
specifications
value
(for
example
as
items
of
an
array
or
values
of
properties
on
other
objects)
adhere
to
the
following
restrictions,
which
are
designed
to
ensure
compatibility
between
JSON-LD-aware
and
non-JSON-LD-aware
processors:
If
a
@value
property
is
used
on
an
object,
that
object
MUST
NOT
use
the
datatype
have
any
other
properties
aside
from
either
@type
or
@language
,
and
MUST
NOT
have
both
@type
and
@language
as
properties.
The
value
of
the
@value
property
MUST
be
a
string,
number,
or
boolean
value.
If
@type
is
also
used,
its
value
to
determine
the
conversion
of
MUST
be
one
of:
If
a
length
@language
An
atomic
property
that
contains
is
used,
it
MUST
have
a
single
integer
string
value
that
adheres
to
the
syntax
defined
in
[
BCP47
],
or
be
null
.
If
a
@type
property
is
used
on
an
object
without
a
@value
property,
its
value
MUST
be
one
of:
@type
as
defined
for
any
of
the
A
minLength
@type
An
atomic
property
that
contains
can
also
have
a
single
integer
value
that
is
the
minimum
length
an
array
of
the
value
such
values.
The
values
of
the
cell.
See
@id
properties
are
link
properties
and
are
treated
as
URLs.
During
normalization
,
as
described
in
section
3.11.1
6.1
Length
Constraints
Normalization
,
they
will
have
any
prefix
expanded
for
details.
and
the
result
resolved
against
the
base
URL
.
Therefore,
if
an
maxLength
@id
An
atomic
property
that
contains
is
used
on
an
object,
it
MUST
have
a
single
integer
value
that
is
a
string
and
that
string
MUST
NOT
start
with
_:
.
A
@language
property
MUST
NOT
be
used
on
an
object
unless
it
also
has
a
@value
property.
@value
,
@type
,
@language
,
and
@id
,
the
@
.
These
restrictions
are
also
described
in
section
A.
JSON-LD
Dialect
,
from
the
value
perspective
of
a
processor
that
otherwise
supports
JSON-LD.
Examples
of
common
property
values
and
the
cell.
See
impact
of
normalization
are
given
in
section
3.11.1
6.1.1
Length
Constraints
Examples
.
Much
of
the
tabular
data
that
is
published
on
the
web
is
messy,
and
CSV
parsers
frequently
need
to
be
configured
in
order
to
correctly
read
in
CSV.
A
dialect
description
provides
hints
to
parsers
about
how
to
parse
the
file
linked
to
from
the
url
property
in
a
table
description
.
It
can
have
any
of
the
following
properties,
which
relate
to
the
flags
described
in
Section
5
Parsing
Tabular
Data
for
details.
within
the
[
tabular-data-model
]:
minimum
commentPrefix
An
atomic
property
that
contains
sets
the
comment
prefix
flag
to
the
single
provided
value,
which
MUST
be
a
single
number
that
character
string.
The
default
is
the
minimum
value
for
the
cell
(inclusive);
equivalent
to
.
minInclusive
"#"
See
section
3.11.2
Value
Constraints
for
details.
maximum
delimiter
An
atomic
property
that
contains
sets
the
delimiter
flag
to
the
single
provided
value,
which
MUST
be
a
single
number
that
character
string.
The
default
is
the
maximum
value
for
the
cell
(inclusive);
equivalent
to
.
maxInclusive
","
See
section
3.11.2
Value
Constraints
doubleQuote
A
boolean
atomic
property
for
details.
that,
if
true
,
sets
the
escape
character
flag
to
"
.
If
false
,
to
\
.
The
default
is
true
.
minInclusive
encoding
An
atomic
property
that
contains
a
single
number
that
is
sets
the
minimum
value
for
encoding
flag
to
the
cell
(inclusive).
See
section
3.11.2
Value
Constraints
single
provided
string
value,
which
MUST
be
a
defined
in
[
encoding
for
details.
].
The
default
is
"utf-8"
.
maxInclusive
header
An
A
boolean
atomic
property
that
contains
a
single
number
that
that,
if
true
,
sets
the
header
row
count
flag
to
1
,
and
if
false
to
0
,
unless
headerRowCount
is
provided,
in
which
case
the
maximum
value
provided
for
the
cell
(inclusive).
See
section
3.11.2
Value
Constraints
for
details.
header
property
is
ignored.
The
default
is
true
.
minExclusive
headerRowCount
An
numeric
atomic
property
that
contains
a
single
number
that
is
the
minimum
value
for
sets
the
cell
(exclusive).
See
section
3.11.2
Value
Constraints
header
row
count
for
details.
flag
to
the
single
provided
value,
which
MUST
be
a
non-negative
integer.
The
default
is
1
.
maxExclusive
lineTerminators
An
atomic
property
that
contains
a
single
number
that
is
the
maximum
value
for
sets
the
cell
(exclusive).
See
section
3.11.2
Value
Constraints
line
terminators
for
details.
flag
to
either
an
array
containing
the
single
provided
string
value,
or
the
provided
array.
The
default
is
["\r\n",
"\n"]
.
quoteChar
Cells
within
tables
may
An
atomic
property
that
sets
the
quote
character
flag
to
the
single
provided
value,
which
MUST
be
annotated
with
a
single
character
or
.
If
the
value
datatype
which
indicates
the
type
of
the
value
obtained
by
parsing
null
of
the
cell.
The
format
expected
in
the
cell
is
determined
by
the
,
the
escape
character
flag
is
format
annotation,
if
there
null
one,
or
uses
a
also
set
to
null
.
The
default
format
determined
by
the
type.
is
"
.
skipBlankRows
An
boolean
atomic
property
that
sets
the
skip
blank
rows
flag
to
the
single
provided
boolean
value.
The
possible
datatypes
are:
default
is
false
.
skipColumns
An
numeric
atomic
property
that
sets
the
datatypes
defined
in
[
xmlschema-2
skip
columns
]
with
flag
to
the
exception
of
those
that
rely
on
XML
mechanisms
for
definition,
namely:
single
provided
numeric
value,
which
MUST
be
a
non-negative
integer.
The
default
is
0
.
anySimpleType
skipInitialSpace
A
boolean
atomic
property
that,
if
,
sets
the
trim
flag
to
string
;
a
sub-value
of
true
.
If
anySimpleType
"start"
,
to
normalizedString
;
a
sub-value
of
false
.
If
the
string
false
property
is
provided,
the
token
;
a
sub-value
of
normalizedString
trim
language
skipInitialSpace
;
a
sub-value
of
property
is
ignored.
The
default
is
.token
false
Name
skipRows
An
numeric
atomic
property
that
sets
the
skip
rows
flag
to
the
single
provided
numeric
value,
which
MUST
be
a
sub-value
of
non-negative
integer.
The
default
is
.token
0
NCName
;
a
sub-value
of
Name
trim
An
atomic
property
that,
if
the
boolean
;
a
sub-value
of
,
sets
the
trim
flag
to
anySimpleType
true
decimal
true
;
a
sub-value
of
and
if
the
boolean
to
anySimpleType
false
.
If
the
value
provided
is
a
integer
;
false
sub-value
string,
sets
the
trim
flag
to
the
provided
value,
which
MUST
be
one
of
,
decimal
"true"
,
nonPositiveInteger
;
a
sub-value
of
"false"
,
or
integer
"start"
.
The
default
is
negativeInteger
;
a
sub-value
of
"end"
.nonPositiveInteger
false
long
;
a
sub-value
of
integer
@id
If
included,
int
@id
;
is
a
sub-value
of
link
property
that
identifies
the
dialect
described
by
this
dialect
description
.
It
MUST
NOT
start
with
.long
_:
short
@type
If
included,
is
an
atomic
property
that
MUST
be
set
to
int
@type
"Dialect"
.
Publishers
MAY
include
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
Dialect
descriptions
do
not
provide
a
sub-value
of
short
mechanism
for
handling
CSV
files
in
which
there
are
multiple
tables
within
a
single
file
(eg
separated
by
empty
lines).
The default dialect description for CSV files is:
{ "encoding": "utf-8", "lineTerminators": ["\r\n", "\n"], "quoteChar": "\"", "doubleQuote": true, "skipRows": 0, "commentPrefix": "#", "header": true, "headerRowCount": 1, "delimiter": ",", "skipColumns": 0, "skipBlankRows": false, "skipInitialSpace": false, "trim": false }
A
transformation
definition
is
a
sub-value
definition
of
how
tabular
data
can
be
transformed
into
another
format
using
a
script
or
template.
For example, the following transformation definition will enable a processor that supports it to generate an iCalendar document using a Mustache template based on the JSON created from the simple mapping to JSON.
{ "url": "templates/ical.txt", "titles": "iCalendar", "targetFormat": "http://www.iana.org/assignments/media-types/text/calendar", "scriptFormat": "https://mustache.github.io/", "source": "json" }
A
processor
that
recognises
templates
in
the
Mustache
format
indicated
by
and
that
could
convert
tables
into
JSON
based
on
[
csv2json
]
would
retrieve
the
template
from
integer
"https://mustache.github.io/"
unsignedLong
"templates/ical.txt"
;
a
sub-value
of
and
apply
this
to
the
resulting
JSON.
Transformation definitions have the following properties:
Transformation definitions MUST have the following properties:
nonNegativeInteger
url
A link property giving the single URL of the file that the script or template is held in, relative to the location of the metadata document.
unsignedInt
scriptFormat
A
link
property
giving
the
single
URL
for
the
format
that
is
used
by
the
script
or
template.
If
one
has
been
defined,
this
should
be
a
sub-value
of
URL
for
a
media
type,
in
the
form
such
as
unsignedLong
http://www.iana.org/assignments/media-types/
media-type
http://www.iana.org/assignments/media-types/application/javascript
.
Otherwise,
it
can
be
any
URL
that
describes
the
script
or
template
format.
The
URL
is
intended
as
an
informative
identifier
for
the
template
format,
and
applications
SHOULD
NOT
access
the
URL.
The
template
formats
that
an
application
supports
are
implementation
defined.
unsignedShort
;
a
sub-value
of
unsignedInt
scriptFormat
unsignedByte
targetFormat
A
link
property
giving
the
single
URL
for
the
format
that
will
be
created
through
the
transformation.
If
one
has
been
defined,
this
should
be
a
sub-value
of
URL
for
a
media
type,
in
the
form
such
as
unsignedShort
http://www.iana.org/assignments/media-types/
media-type
http://www.iana.org/assignments/media-types/text/calendar
.
Otherwise,
it
can
be
any
URL
that
describes
the
target
format.
The
URL
is
intended
as
an
informative
identifier
for
the
target
format,
and
applications
SHOULD
NOT
access
the
URL.
positiveInteger
;
a
sub-value
of
nonNegativeInteger
targetFormat
Transformation definitions MAY have the following properties:
float
source
A
single
string
atomic
property
that
provides,
if
specified,
the
format
to
which
the
tabular
data
should
be
transformed
prior
to
the
transformation
using
the
script
or
template.
If
the
value
is
,
the
tabular
data
MUST
first
be
transformed
to
JSON
as
defined
by
[
csv2json
]
using
standard
mode
.
If
the
value
is
anySimpleType
json
,
the
tabular
data
MUST
first
be
transformed
to
an
RDF
graph
as
defined
by
[
csv2rdf
]
using
standard
mode
.
If
the
double
;
a
sub-value
of
anySimpleType
rdf
duration
source
;
a
sub-value
of
property
is
missing
or
(the
default)
then
the
source
of
the
transformation
is
the
annotated
tabular
data
model
.
No
other
values
are
valid.
anySimpleType
null
titles
A
natural
language
property
that
describes
the
format
that
will
be
generated
from
the
transformation.
This
is
useful
if
the
target
format
is
a
generic
format
(such
as
dateTime
application/json
;
)
and
the
transformation
is
creating
a
sub-value
specific
profile
of
that
format.
anySimpleType
@id
If
included,
time
@id
;
is
a
sub-value
of
link
property
that
identifies
the
transformation
described
by
this
transformation
definition
.
It
MUST
NOT
start
with
.anySimpleType
_:
date
@type
If
included,
is
an
atomic
property
that
MUST
be
set
to
anySimpleType
@type
"Template"
.
Publishers
MAY
include
this
to
provide
additional
information
to
JSON-LD
based
toolchains.
The transformation definition MAY contain any common properties to provide extra metadata about the transformation.
Implementations
MAY
present
users
with
options
for
transformations
based
on
the
available
transformation
definitions
and
their
properties.
Implementations
SHOULD
filter
this
list
to
only
include
those
transformations
whose
they
understand
and
can
apply,
and
whose
gYearMonth
;
a
sub-value
of
anySimpleType
scriptFormat
gYear
source
;
property,
if
present,
specifies
a
sub-value
of
format
that
the
implementation
can
convert
to.
Users
may
find
the
and
anySimpleType
targetFormat
gMonthDay
titles
;
properties
useful
in
deciding
which
transformation
to
apply.
When
directed
by
a
sub-value
of
user
to
transform
a
table
using
a
transformation
definition
,
implementations
MUST
:
anySimpleType
source
property,
if
this
is
specified
and
not
null
.
gDay
;
a
sub-value
of
anySimpleType
url
property
and
raise
an
error
if
this
does
not
exist.
gMonth
;
a
sub-value
of
anySimpleType
scriptFormat
property
to
determine
how
to
interpret
that
script
or
template,
and
apply
it
to
the
table
(or
the
result
of
converting
the
table).
Cells
within
tables
may
be
annotated
with
a
sub-value
of
which
indicates
the
type
of
the
values
obtained
by
parsing
the
string
value
of
the
cell.
See
[
tabular-data-model
anySimpleType
datatype
base64Binary
;
]
for
a
sub-value
description
of
anySimpleType
annotations
on
a
datatype
.
The possible built-in datatypes, as shown on the diagram , are:
anyURI
;
a
sub-value
of
anySimpleType
anyAtomicType
number
which
is
double
in
the
data
model
binary
which
is
base64Binary
in
the
data
model
datetime
which
is
dateTime
in
the
data
model
any
which
is
anySimpleType
anyAtomicType
in
the
data
model
xml
,
a
sub-type
of
string
,
which
indicates
the
html
,
a
sub-type
of
string
,
which
indicates
the
json
,
a
sub-type
of
string
,
which
indicates
the
More specialised datatypes can be defined through a datatype description . A datatype description may have any of the following properties, all of which are optional.
base
An
atomic
property
that
contains
a
single
string:
a
term
defined
in
the
default
context
representing
a
built-in
datatype
URL,
as
listed
above.
Its
default
is
string
.
All
values
of
the
datatype
MUST
be
valid
values
of
the
base
datatype.
The
value
of
this
property
becomes
the
base
annotation
for
the
described
datatype
.
format
An atomic property that contains either a single string or an object that defines the format of a value of this type, used when parsing a string value as described in Parsing Cells in [ tabular-data-model ]. The value of this property becomes the format annotation for the described datatype .
length
,
A numeric atomic property that contains a single integer that is the exact length of the value. The value of this property becomes the length annotation for the described datatype . See Length Constraints in [ tabular-data-model ] for details.
minLength
An atomic property that contains a single integer that is the minimum length of the value. The value of this property becomes the minimum length annotation for the described datatype . See Length Constraints in [ tabular-data-model ] for details.
maxLength
A
numeric
atomic
property
that
contains
a
single
integer
that
is
the
exact,
maximum
length
of
the
value.
The
value
of
this
property
becomes
the
maximum
length
annotation
for
the
described
datatype
.
See
Length
Constraints
in
[
tabular-data-model
]
for
details.
minimum
and
An
atomic
property
that
contains
a
single
number
or
string
that
is
the
minimum
valid
value
(inclusive);
equivalent
to
minInclusive
.
The
value
of
this
property
becomes
the
minimum
annotation
for
the
described
datatype
.
See
Value
Constraints
in
[
tabular-data-model
]
for
details.
maximum
lengths
An
atomic
property
that
contains
a
single
number
or
string
that
is
the
maximum
valid
value
(inclusive);
equivalent
to
maxInclusive
.
The
value
of
this
property
becomes
the
values
maximum
annotation
for
the
described
datatype
.
See
Value
Constraints
in
[
tabular-data-model
]
for
details.
minInclusive
An
atomic
property
that
contains
a
single
number
or
string
that
is
the
minimum
valid
value
(inclusive).
The
value
of
cells.
this
property
becomes
the
minimum
annotation
for
the
described
datatype
.
See
Value
Constraints
in
[
tabular-data-model
]
for
details.
maxInclusive
An atomic property that contains a single number or string that is the maximum valid value (inclusive). The value of this property becomes the maximum annotation for the described datatype . See Value Constraints in [ tabular-data-model ] for details.
minExclusive
An atomic property that contains a single number or string that is the minimum valid value (exclusive). The value of this property becomes the minimum exclusive annotation for the described datatype . See Value Constraints in [ tabular-data-model ] for details.
maxExclusive
An atomic property that contains a single number or string that is the maximum valid value (exclusive). The value of this property becomes the maximum exclusive annotation for the described datatype . See Value Constraints in [ tabular-data-model ] for details.
The datatype description MAY contain any common properties to provide extra metadata about the datatype, such as a title or description.
Applications
MUST
raise
an
error
if
both
length
and
minLength
are
specified
and
they
do
not
have
the
same
value.
Similarly,
applications
MUST
raise
an
error
if
both
length
and
maxLength
are
specified
and
they
do
not
have
the
same
value.
Applications
MUST
raise
an
error
if
length
,
maxLength
,
or
minLength
are
specified
and
the
cell
value
is
not
a
list
(ie
datatype
is
not
separator
base
specified),
a
string
or
one
of
its
subtypes,
or
a
binary
value.
type.
The
length
of
a
value
of
a
cell
is
determined
as
follows:
if
In
all
ways,
including
the
errors
described
below,
the
cell
is
null
minimum
its
length
is
zero
if
the
value
is
a
list,
its
length
property
is
equivalent
to
the
number
of
items
in
the
list
if
minInclusive
property
and
the
value
is
a
string
or
one
of
its
subtypes,
its
length
maximum
property
is
equivalent
to
the
number
of
characters
in
the
value
maxInclusive
property.
Applications
MUST
raise
an
error
if
both
minimum
and
minInclusive
are
specified
and
they
do
not
have
the
value
is
of
a
binary
type,
its
length
is
the
number
of
bytes
in
same
value.
Similarly,
applications
MUST
raise
an
error
if
both
maximum
and
maxInclusive
are
specified
and
they
do
not
have
the
binary
value
3.11.2
Value
Constraints
same
value.
The
Applications
MUST
raise
an
error
if
both
and
minimum
,
minInclusive
are
specified,
or
if
both
maximum
,
minExclusive
maxInclusive
and
maxExclusive
are
specified.
Applications
MUST
raise
an
error
if
both
minInclusive
and
,
maxInclusive
are
specified
and
maxInclusive
is
less
than
minInclusive
,
or
if
both
and
minExclusive
minInclusive
maxExclusive
properties
indicate
limits
on
the
values
of
cells.
These
apply
to
numeric
are
specified
and
date/time
types.
The
minimum
maxExclusive
property
is
equivalent
less
than
or
equal
to
the
minInclusive
.
Similarly,
applications
MUST
raise
an
error
if
both
minExclusive
property
and
the
are
specified
and
maximum
maxExclusive
maxExclusive
property
is
equivalent
less
than
minExclusive
,
or
if
both
minExclusive
and
maxInclusive
are
specified
and
maxInclusive
is
less
than
or
equal
to
the
minExclusive
.
Applications
MUST
raise
an
error
if
minimum
,
minInclusive
,
maximum
,
maxInclusive
,
minExclusive
,
or
maxExclusive
property.
are
specified
and
the
base
datatype
is
not
a
numeric,
date/time,
or
duration
type.
Validation
against
these
properties
is
as
defined
in
[
xmlschema-2
xmlschema11-2
].
Unlike
many
other
data
formats,
When
processing
a
tabular
data
is
designed
to
be
read
by
humans.
For
that
reason,
it's
common
file,
the
Locating
Metadata
section
in
[
tabular-data-model
]
describes
different
locations
for
data
to
be
represented
within
locating
metadata.
To
properly
transform
a
tabular
data
file,
such
as
a
CSV
file,
processors
MUST
merge
metadata
from
these
separate
sources
to
create
a
single
metadata
document
in
a
human-readable
way.
The
manner
consistent
with
this
algorithm.
Implementations MUST check and issue warnings where merge issues are found as noted below and in the relevant property definitions.
Merging
of
metadata
happens
in
order
from
highest
priority
to
lowest
priority
by
merging
the
first
two
metadata
files
(
and
separator
A
format
B
properties
indicates
the
format
used
)
together
to
represent
data
within
the
table.
create
new
merged
metadata
AB'
.
This
is
used:
by
validators
then
used
to
check
that
the
data
in
the
table
is
merge
in
the
expected
format
by
converters
next
metadata
file
until
all
metadata
have
been
processed
to
parse
the
values
before
mapping
them
into
values
in
create
a
table
group
description
.
If
the
target
top-level
object
of
either
of
the
conversion
when
displaying
data,
to
map
it
metadata
files
are
table
descriptions
,
these
are
turned
into
formats
table
group
descriptions
containing
a
single
table
description
(i.e.,
having
a
tables
property
whose
value
is
an
array
containing
the
original
table
description).
Ensure
that
@context
definitions
are
meaningful
for
those
viewing
moved
from
the
data
(as
opposed
to
those
publishing
it)
when
inputting
data,
table
description
to
turn
entered
values
into
representations
in
a
consistent
format
the
table
group
description
.
The
process
of
parsing
Merging
has
two
stages:
the
string
value
normalization
of
a
cell
into
a
single
value
or
a
list
metadata
documents,
described
in
section
6.1
Normalization
and
the
merging
of
values
is
as
follows:
those
normalized
documents,
described
in
section
6.2
Merging
.
Prior
to
merging,
each
description
object
is
expanded
relative
to
its
@context
and
values
are
normalized
as
follows:
notes
datatype
@value
property
whose
value
is
that
string.
If
a
default
language
is
specified,
add
a
string
@language
anySimpleType
@value
@id
,
@type
,
then
its
value
remains
as
is.
@context
.
Raise
an
error
if
fetching
this
URL
does
not
result
in
a
JSON
object.
Normalize
each
property
in
the
@context
then
remove
the
local
separator
@context
property.
If
the
resulting
object
does
not
have
an
@id
property,
add
an
@id
whose
value
is
the
original
URL.
This
object
becomes
the
value
of
the
original
object
property.
und
MUST
be
used.
Following
this
normalization
process,
the
@base
and
@language
properties
within
the
@context
are
no
longer
relevant;
the
normalized
metadata
can
have
its
@context
set
to
http://www.w3.org/ns/csvw
.
If
the
datatype
This
section
is
non-normative.
The following are examples of how common properties are normalized.
In
this
example,
a
simple
string
type,
is
used
as
the
title
for
a
table
using
the
common
property
format
dc:title
provides
:
{ "@context": { "http://www.w3.org/ns/csvw", { "@language": "en" } }, "@type": "Table", "url": "http://example.com/table.csv", "tableSchema": [...], "dc:title": "The title of this Table" }
Since
there
is
a
regular
expression
for
default
language
,
this
is
equivalent
to
explicitly
specifying
the
language
of
that
title;
the
original
string
values,
in
value
becomes
the
syntax
defined
by
[
ECMASCRIPT
].
value
of
the
@value
property
within
a
value
object
:
{ "@type": "Table", "url": "http://example.com/table.csv", "tableSchema": [...], "dc:title": {"@value": "The title of this Table", "@language": "en"}Issue 55}
It
is
also
possible
to
use
for
regular
expression
syntax.
Other
possibilities
are
a
simple
value
object
to
use
that
defined
by
XML
Schema
or
XPath.
give
a
title.
However,
in
this
case
the
default
language
is
not
applied
to
the
title:
{ "@context": { "http://www.w3.org/ns/csvw", { "@language": "en" } }, "@type": "Table", "url": "http://example.com/table.csv", "tableSchema": [...], "dc:title": {"@value": "The title of this Table"} }
The next example uses an array of a string and a value object to give two titles with different languages:
{ "@context": { "http://www.w3.org/ns/csvw", { "@language": "en" } }, "@type": "Table", "url": "http://example.com/table.csv", "tableSchema": [...], "dc:title": [ "The title of this Table", {"@value": "Der Titel dieser Tabelle", "@language": "de"} ]Formats for numeric types}
It
is
not
uncommon
for
numbers
within
tabular
data
to
be
formatted
for
human
consumption,
which
may
involve
using
commas
for
decimal
points,
grouping
digits
in
the
number
using
commas,
or
adding
currency
symbols
or
percent
signs
to
the
number.
The
normalized
version
of
this
is:
{ "@type": "Table", "url": "http://example.com/table.csv", "tableSchema": [...], "dc:title": [ {"@value": "The title of this Table", "@language": "en"} {"@value": "Der Titel dieser Tabelle", "@language": "de"} ] }
If
the
datatype
is
The
next
example
demonstrates
a
numeric
type,
the
format
property
indicates
the
expected
format
for
that
number.
Validators
MUST
check
that
the
numbers
node
object
,
in
which
the
column
adhere
to
the
specified
format.
Converters
MUST
use
value
of
the
property
format
schema:url
to
parse
the
number
when
mapping
it
into
is
a
suitable
type
in
the
target
language
of
the
conversion.
reference
to
another
resource:
{ "@context": [ "http://www.w3.org/ns/csvw", { "@base": "http://example.com/" } ], "@type": "Table", "url": "table.csv", "tableSchema": [...], "schema:url": {"@id": "table.csv"} }
When
The
value
of
the
property
is
datatype
@id
a
numeric
type,
the
format
property's
value
MUST
be
a
number
format
normalized
as
specified
described
in
[
section
6.1
Normalization
xslt-21
].
against
the
base
URL
provided
through
the
@base
property,
which
means
the
above
example
is
equivalent
to:
{ "@context": "http://www.w3.org/ns/csvw", "@type": "Table", "url": "http://example.com/table.csv", "tableSchema": [...], "schema:url": {"@id": "http://example.com/table.csv"}Issue 54}
The
following
example
shows
the
best
format
to
specify
how
to
parse
numbers.
dc:publisher
property
as
an
array
that
contains
a
single
node
object
:
{ "@context": "http://www.w3.org/ns/csvw", "@type": "Table", "url": "http://example.com/table.csv", "tableSchema": [...], "dc:publisher": [{ "schema:name": "Example Municipality", "schema:url": {"@id": "http://example.org"} }],Issue 65}
Following
normalization,
the
schema:name
property
of
recognised
date-time
picture
string
formats.
the
dc:publisher
is
expanded
as
shown:
"dc:publisher": [{ "schema:name": { "@value": "Example Municipality" }, "schema:url": { "@id": "http://example.org" } }]
Boolean
values
may
be
represented
in
many
ways
aside
from
the
standard
A
description
object
1
B
and
is
merged
into
an
original
description
object
0
A
or
by
merging
each
property
of
true
B
and
into
.
If
the
property
from
false
A
datatype
B
is
does
not
exist
on
,
boolean
A
the
it
is
simply
added
to
.
If
format
A
A
does
have
the
property,
the
way
the
values
are
merged
depends
on
the
type
of
the
property,
as
follows:
format
A
Y|N
B
Y
or
A
.
If
a
value
exists
in
the
array
for
the
undefined
language
(
N
und
Y
und
true
und
N
A
false
B
.
Dates
and
times
are
commonly
represented
in
tabular
data
in
formats
other
than
those
defined
in
[
xmlschema-2
This
section
is
non-normative.
].
If
For
example,
consider
the
following
two
metadata
documents
to
be
merged
(located
at
datatype
http://example.com/metadata.json
is
a
date
or
time
type,
the
and
format
http://example.com/doc1.csv-metadata.json
property
indicates
the
expected
format
for
that
date
or
time.
Validators
MUST
check
that
the
dates
or
times
in
the
column
adhere
to
the
specified
format.
Converters
MUST
use
):
{ "@context": ["http://www.w3.org/ns/csvw", {"@language": "en"}], "tables": [{ "url": "doc1.csv", "dc:title": "foo", "tableDirection": "ltr", "tableSchema": { "aboutUrl": "{#foo}", "columns": [{ "name": "foo", "titles": "Foo", "required": true }, { "name": "bar" }] } }, { "url": "doc2.csv" }] }
{ "@context": "http://www.w3.org/ns/csvw", "url": "http://example.com/doc1.csv", "dc:description": "bar", "tableSchema": { "propertyUrl": "{#_name}", "columns": [{ "titles": "Foo", "required": false }, { "name": "bar" }, { }] } }
The process of merging performs the following steps:
format
A
datatype
@context
titles
url
A
,
http://example.com/metadata.json
: { "tables": [{ "url": "http://example.com/doc1.csv", "dc:title": {"@value": "foo", "@language": "en"}, "tableDirection": "ltr", "tableSchema": { "aboutUrl": "{#foo}", "columns": [{ "name": "foo", "titles": { "en": [ "Foo" ] }, "required": true }, { "name": "bar" }] } }, { "url": "http://example.com/doc2.csv" }]Issue 54}
B
from
a
table
description
to
tables
property,
resolve
the
link
property
url
(which
is
already
an
absolute
URL),
and
normalize
the
titles
und
language:
{ "tables": [{ "url": "http://example.com/doc1.csv", "dc:description": {"@value": "bar"}, "tableSchema": { "propertyUrl": "{#_name}", "columns": [{ "titles": { "und": [ "Foo" ] }, "required": false }, { "name": "bar" }, { }] } }]Issue}
tables
is
an
array
property
with
rules
specified
in
section
table-direction
A
table-direction=ltr
B
{ "url": "http://example.com/doc1.csv", "dc:title": {"@value": "foo", "@language": "en"}, "tableDirection": "ltr", "tableSchema": { "aboutUrl": "{#foo}", "columns": [{ "name": "foo", "titles": { "en": [ "Foo" ] }, "required": true }, { "name": "bar" }] } } { "url": "http://example.com/doc1.csv", "dc:description": {"@value": "bar"}, "tableSchema": { "propertyUrl": "{#_name}", "columns": [{ "titles": { "und": [ "Foo" ] }, "required": false }, { "name": "bar" }, { }] } }
table-direction=rtl
url
table-direction=default
B
url
is
the
dc:description
does
not
exist
in
A
so
it
is
added
to
A
.
tableSchema
properties
are
merged:
B
has
a
propertyUrl
which
is
added
to
A
.
columns
which
is
merged
as
titles
because
they
each
have
the
"Foo"
and
the
en
matches
und
.
Because
the
und
value
is
present
in
the
en
array,
that
value
is
removed
from
the
und
array,
and
und
property
is
removed.
The
value
of
required
in
A
name
.
name
.{ "url": "http://example.com/doc1.csv", "dc:title": {"@value": "foo", "@language": "en"}, "dc:description": {"@value": "bar"}, "tableDirection": "ltr", "tableSchema": { "aboutUrl": "{#foo}", "propertyUrl": "{#_name}", "columns": [{ "name": "foo", "titles": { "en": [ "Foo" ]}, "required": true },{ "name": "bar" }] } }
text-direction
A
The
resulting
merged
metadata
is
displayed
should
be
determined
by
now
the
following:
{ "tables": [{ "url": "http://example.com/doc1.csv", "dc:title": {"@value": "foo", "@language": "en"}, "dc:description": {"@value": "bar"}, "tableDirection": "ltr", "tableSchema": { "aboutUrl": "{#foo}", "propertyUrl": "{#_name}", "columns": [{ "name": "foo", "titles": { "en": [ "Foo" ]}, "required": true },{ "name": "bar" }] } }, { "url": "http://example.com/doc2.csv" }]text-direction property of the cell. However, when the cell contains characters with a strong type (such as letters) then they MUST be displayed according to the Unicode Bidirectional Algorithm as described in [}UNICODE-BIDI
Applications
that
process
tabular
data
may
use
that
data
to
validate
groups
drive
other
actions,
which
may
have
security
implications.
These
behaviors
are
outside
the
scope
of
this
specification.
Third
party
metadata
provided
about
a
tabular
data
files
against
metadata.
This
would
be
normative:
compliant
validators
would
have
file
(such
as
a
CSV
file)
may
rename
or
ignore
headers,
or
exclude
rows
or
columns,
which
may
lead
to
report
data
being
misinterpreted
by
applications
that
process
it.
Transformation
definitions
are
a
possible
security
risk
as
they
enable
the
errors
and
warnings
creators
of
metadata
to
reference
arbitrary
code
that
we
define.
We
invite
comment
on
whether
may
be
executed
to
convert
tabular
data
into
other
formats.
Implementations
should
run
this
is
arbitrary
code
in
a
useful
thing
sandboxed
environment
to
specify.
reduce
the
security
risk.
Conversions
of
tabular
data
to
other
formats
operate
over
The
Metadata
Vocabulary
for
Tabular
Data
uses
a
annotated
table
format
based
on
JSON-LD
[
JSON-LD
constructed
as
]
with
some
restrictions.
The
mechanics
value
of
these
conversions
to
other
formats
are
defined
in
other
specifications.
Conversion
specifications
any
@id
or
@type
contained
within
a
metadata
document
MUST
NOT
define
be
a
default
mapping
from
an
annotated
table
that
lacks
any
annotations
(ie
that
is
equivalent
to
an
un-annotated
table).
blank
node
.
Conversion
specifications
A
metadata
document
MUST
NOT
use
either
the
add
a
new
context
(ie
include
a
property
except
at
the
top
level),
or
extend
the
top-level
context
in
anyway
other
than
as
specifically
allowed
in
section
5.2
Top-Level
Properties
.name
@context
Common properties and notes may contain arbitrary JSON-LD with the following restrictions:
The
value
of
any
member
of
MUST
be
either
a
term
defined
in
[
csvw-context
predicateUrl
@type
of
],
a
column
as
the
basis
for
naming
machine-readable
fields
in
the
target
format,
such
as
the
prefixed
name
of
where
the
equivalent
element
or
attribute
in
XML,
property
prefix
is
a
term
defined
in
JSON
[
csvw-context
],
or
property
URI
in
RDF.
an
absolute
URL.
Conversion
specifications
Values
MAY
use
any
be
a
string
,
native
JSON
type
(such
as
number
,
true
,
or
false
.),
value
object
,
node
object
or
an
array
of
the
properties
defined
in
this
specification
to
adjust
the
mapping
zero
or
more
of
an
annotated
table
into
another
format.
any
of
these.
Conversion
specifications
MAY
Values
MUST
NOT
define
additional
properties,
not
defined
in
this
specification,
which
are
specifically
used
when
converting
to
the
target
format
use
list
objects
or
set
objects
.
Keys
of
the
conversion.
For
example,
a
conversion
to
XML
might
specify
a
node
objects
MUST
NOT
include
,element-or-attribute
property
on
columns
that
determines
whether
a
particular
column
is
represented
through
an
element
@graph
@context
,
terms
,
or
an
attribute
in
the
data.
blank
nodes
.
Conversion
specifications
SHOULD
specify
format-specific
When
normalizing
metadata,
prefixed
names
used
in
common
properties
specifying
external
processing
steps
and
notes
are
expanded
to
provide
absolute
URLs.
For
some
serializations,
these
are
more
control
appropriately
presented
using
prefixed
names
or
terms
.
This
algorithm
compacts
an
absolute
URL
to
people
defining
conversions.
a
prefixed
name
or
term
.
:
(
U+0040
)
to
create
a
rdf:type
,
replace
with
@type
.
This
document
is
largely
a
copy
of
content
from
the
influenced
by
Data
Package
specification
and
the
JSON
Table
Schema
,
which
are
maintained
as
part
of
Data
Protocols
.
Particular
contributors
to
that
work
are
Rufus
Pollock,
Paul
Fitzpatrick,
Andrew
Berkeley,
Francis
Irving,
Benoit
Chesneau,
Leigh
Dodds,
Martin
Keegan,
and
Gunnlaugur
Thor
Briem.
This section has not yet been submitted to IANA for review, approval, and registration.
application/json
text/csv
application/ld+json
text/tab-delimited-values
The
JSON-LD
context,
located
at
http://www.w3.org/ns/csvw.jsonld
is
used
with
metadata
documents.
When
used
within
a
metadata
document,
the
context
can
be
referenced
as
http://www.w3.org/ns/csvw
.
See
[
csvw-context
]
for
a
full
description
of
defined
terms
and
prefixes
.
This
context
may
be
updated
from
time-to-time
to
define
new
terms
and
prefixes.
The document has undergone substantial changes since the last working draft. Below are some of the changes made:
notes
and
common
properties
defined.
resources
property
was
changed
to
tables
.
foreignKeys
.
templates
property
was
changed
to
transformations
.
urlTemplate
property
was
changed
from
a
schema
property
to
the
aboutUrl
common
property,
and
propertyUrl
and
valueUrl
were
added
as
common
properties.
virtual
columns
to
allow
data
to
be
inserted
into
a
row.