# Lists
RDF lists can be represented with the RDF.List
structure.
An existing RDF.List
in a given graph can be created with RDF.List.new
or its alias RDF.list
, passing it the head node of a list and the graph containing the statements constituting the list.
graph =
Graph.new(
~B<Foo>
|> RDF.first(1)
|> RDF.rest(EX.Foo)
)
|> Graph.add(
EX.Foo
|> RDF.first(2)
|> RDF.rest(RDF.nil)
)
list = RDF.List.new(~B<Foo>, graph)
If the given head node does not refer to a well-formed RDF list in the graph, nil
is returned.
An entirely new RDF.List
can be created with RDF.List.from
or RDF.list
and a native Elixir list or an Elixir Enumerable
with values of all types that are allowed for objects of statements (including nested lists).
list = RDF.list(["foo", EX.bar, ~B<bar>, [1, 2, 3]])
If you want to add the graph statements to an existing graph, you can do that via the graph
option.
existing_graph = RDF.Graph.new({EX.S, EX.p, EX.O})
RDF.list([1, 2, 3], graph: existing_graph)
The head
option also allows to specify a custom node for the head of the list.
The function RDF.List.values/1
allows to get the values of a RDF list (including nested lists) as a native Elixir list.
iex> RDF.list(["foo", EX.Bar, ~B<bar>, [1, 2]]) |> RDF.List.values
[
~L"foo",
~I<http://example.com/Bar>,
~B<bar>,
[RDF.XSD.Integer.new(1), RDF.XSD.Integer.new(2)]
]