---
name: "RDF::Closure::DatatypeHandling"
section: "3pm"
platform: "linux"
package: "librdf-closure-perl"
version: "0.001-5"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/RDF::Closure::DatatypeHandling"
---

# RDF::Closure::DatatypeHandling(3pm)

validate and canonicalise typed literals

## NAME

RDF::Closure::DatatypeHandling - validate and canonicalise typed literals

## ANALOGOUS PYTHON

RDFClosure/DatatypeHandling.py

## DESCRIPTION

Provides datatype handling functions for OWL 2 RL and RDFS datatypes.

### Functional Interface

This module can export four functions:

- •

  `"literal_canonical($lit)"`

  Given an RDF::Trine::Node::Literal, returns a literal with the canonical lexical value for its given datatype. If the literal is not a valid lexical form for its datatype throws an Error.

  If the literal is a plain literal, returns an rdf:PlainLiteral typed literal; if the literal is of an unrecognised datatype, simply returns the original literal.

  Note that as per OWL 2 RL rules, xsd:dateTime literals are *not* shifted to UTC, even though XSD says that UTC is the canonical form. By setting the `"force_utc"` to true, you can force XSD-style canonicalisation. (See the object-oriented interface.)

- •

  `"literal_canonical_safe($lit)"`

  As per `"literal_canonical"`, but in the case where a literal is not a valid lexical form, simply returns the original literal.

- •

  `"literal_valid($lit)"`

  Returns true iff the literal is a valid lexical form for its datatype. An example of an invalid literal might be:

  ```
    "2011-02-29"^^xsd:date
  ```

- •

  `"literals_identical($lit1, $lit2)"`

  Returns true iff the two literals are identical according to OWL 2 RL. Here are some example pairs that are identical:

  ```
    # integers and decimals are drawn from the same pool of values
    "1.000"^^xsd:decimal
    "1"^^xsd:integer

    # different ways of writing the same datetime
    "2010-01-01T12:00:00.000Z"^^xsd:dateTime
    "2010-01-01T12:00:00+00:00"^^xsd:dateTime
  ```

  Here are some example literals that are not identical:

  ```
    # floats and decimals are drawn from different pools of values
    "1.000"^^xsd:float
    "1"^^xsd:integer

    # according to OWL 2 these are "equal but not identical".
    "2010-01-01T12:00:00+00:00"^^xsd:dateTime
    "2010-01-01T11:00:00-01:00"^^xsd:dateTime
  ```

  This latter example is affected by `"force_utc"`.

- •

  `"literal_to_perl($lit)"`

  Returns a scalar value for the literal, or an appropriate object with overloaded operators (e.g. DateTime, Math::BigInt).

Variables `$RDF`, `$RDFS`, `$OWL` and `$XSD` may also be exported as a convenience. These are RDF::Trine::Namespace objects. Don't modify them.

### Object-Oriented Interface

```
  use RDF::Trine;
  use RDF::Closure::DatatypeHandling qw[$XSD];

  my $lit     = RDF::Trine::Node::Literal->new(
    "2010-01-01T11:00:00-01:00", undef, $XSD->dateTime);
  my $handler = RDF::Closure::DatatypeHandling->new(force_utc => 1);
  print $handler->literal_canonical($lit)->as_ntriples;
```

## SEE ALSO

RDF::Closure.

\<http://www.perlrdf.org/\>.

## AUTHOR

Toby Inkster \<tobyink@cpan.org\>.

## COPYRIGHT

Copyright 2008-2011 Ivan Herman

Copyright 2011-2012 Toby Inkster

This library is free software; you can redistribute it and/or modify it under any of the following licences:

- •

  The Artistic License 1.0 \<http://www.perlfoundation.org/artistic\_license\_1\_0\>.

- •

  The GNU General Public License Version 1 \<http://www.gnu.org/licenses/old-licenses/gpl-1.0.txt\>, or (at your option) any later version.

- •

  The W3C Software Notice and License \<http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231\>.

- •

  The Clarified Artistic License \<http://www.ncftp.com/ncftp/doc/LICENSE.txt\>.

## DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
