# `RDF.Term`
[🔗](https://github.com/rdf-elixir/rdf-ex/blob/v3.0.1/lib/rdf/model/term.ex#L1)

Shared behaviour for all RDF terms.

A `RDF.Term` is anything which can be an element of RDF statements of an RDF graph:

- `RDF.IRI`s
- `RDF.BlankNode`s
- `RDF.Literal`s

see <https://www.w3.org/TR/sparql11-query/#defn_RDFTerm>

# `t`

```elixir
@type t() :: RDF.Resource.t() | RDF.Literal.t()
```

# `coerce`

Converts a given value into an RDF term.

Returns `nil` if the given value is not convertible into any valid RDF.Term.

## Examples

    iex> RDF.Term.coerce("foo")
    ~L"foo"
    iex> RDF.Term.coerce(42)
    RDF.XSD.integer(42)

# `equal?`

Tests for term equality.

see <http://www.w3.org/TR/rdf-sparql-query/#func-sameTerm>

# `equal_value?`

Tests for equality of values.

Non-RDF terms are tried to be coerced via `RDF.Term.coerce/1` before comparison.

Returns `nil` if the given terms are not comparable.

see <http://www.w3.org/TR/rdf-sparql-query/#func-RDFterm-equal>
and the value equality semantics of the different literal datatypes here:
 <https://www.w3.org/TR/sparql11-query/#OperatorMapping>

# `term?`

Checks if the given value is an RDF term.

Note: As opposed to `RDF.term?` this function returns `false` on atoms and does
not try to resolve them to IRIs.

## Examples

    iex> RDF.Term.term?(RDF.iri("http://example.com/resource"))
    true
    iex> RDF.Term.term?(EX.Resource)
    false
    iex> RDF.Term.term?(RDF.bnode)
    true
    iex> RDF.Term.term?(RDF.XSD.integer(42))
    true
    iex> RDF.Term.term?(42)
    false

# `value`

Returns the native Elixir value of an RDF term.

Returns `nil` if the given value is not a valid RDF term or a value convertible to an RDF term.

## Examples

    iex> RDF.Term.value(~I<http://example.com/>)
    "http://example.com/"
    iex> RDF.Term.value(~L"foo")
    "foo"
    iex> RDF.XSD.integer(42) |> RDF.Term.value()
    42

---

*Consult [api-reference.md](api-reference.md) for complete listing*
