RDF.Graph (RDF.ex v0.9.1) View Source
A set of RDF triples with an optional name.
RDF.Graph
implements:
- Elixir's
Access
behaviour - Elixir's
Enumerable
protocol - Elixir's
Inspect
protocol - the
RDF.Data
protocol
Link to this section Summary
Functions
Adds triples to a RDF.Graph
.
Adds prefixes
to the given graph
.
Returns the base IRI of the given graph
.
Changes the graph name of graph
.
Removes all triples from graph
.
Clears the base IRI of the given graph
.
Clears the base IRI and all prefixes of the given graph
.
Clears all prefixes of the given graph
.
Deletes statements from a RDF.Graph
.
Deletes all statements with the given subjects
.
Deletes prefixes
from the given graph
.
Checks if a RDF.Graph
contains statements about the given resource.
The RDF.Description
of the given subject.
All RDF.Description
s within a RDF.Graph
.
Checks if two RDF.Graph
s are equal.
Fetches the description of the given subject.
Gets the description of the given subject.
Gets and updates the description of the given subject, in a single pass.
Checks if the given input
statements exist within graph
.
Returns a nested map of a RDF.Graph
where each element from its triples is mapped with the given function.
Returns the graph name IRI of graph
.
Creates an RDF.Graph
.
Creates an RDF.Graph
initialized with data.
The set of all resources used in the objects within a RDF.Graph
.
Pops an arbitrary triple from a RDF.Graph
.
Pops the description of the given subject.
The set of all properties used in the predicates of the statements within a RDF.Graph
.
Returns the prefixes of the given graph
as a RDF.PrefixMap
.
Adds statements to a RDF.Graph
overwriting existing statements with the subjects given in the input
data.
Adds statements to a RDF.Graph
and overwrites all existing statements with the same subject-predicate combinations given in the input
data.
Execute the given query
against the given graph
.
Returns a Stream
for the execution of the given query
against the given graph
.
The set of all resources used within a RDF.Graph
.
Sets the base IRI of the given graph
.
The number of statements within a RDF.Graph
.
The number of subjects within a RDF.Graph
.
The set of all subjects used in the statements within a RDF.Graph
.
Creates a graph from another one by limiting its statements to those using one of the given subjects
.
The list of all statements within a RDF.Graph
.
Updates the description of the subject
in graph
with the given function.
Returns a nested map of the native Elixir values of a RDF.Graph
.
Link to this section Types
Specs
get_and_update_description_fun() :: (RDF.Description.t() -> {RDF.Description.t(), input()} | :pop)
Specs
graph_description() :: %{ required(RDF.Statement.subject()) => RDF.Description.t() }
Specs
input() :: RDF.Statement.coercible_t() | {RDF.Statement.coercible_subject(), RDF.Description.input()} | RDF.Description.t() | t() | %{ required(RDF.Statement.coercible_subject()) => %{ required(RDF.Statement.coercible_predicate()) => RDF.Statement.coercible_object() | [RDF.Statement.coercible_object()] } } | [input()]
Specs
t() :: %RDF.Graph{ base_iri: RDF.IRI.t() | nil, descriptions: graph_description(), name: RDF.IRI.t() | nil, prefixes: RDF.PrefixMap.t() | nil }
Specs
update_description_fun() :: (RDF.Description.t() -> RDF.Description.t())
Link to this section Functions
Specs
Adds triples to a RDF.Graph
.
The input
can be provided
- as a single statement tuple
- a
RDF.Description
- a
RDF.Graph
- or a list with any combination of the former
When the statements to be added are given as another RDF.Graph
,
the graph name must not match graph name of the graph to which the statements
are added. As opposed to that, RDF.Data.merge/2
will produce a RDF.Dataset
containing both graphs.
Also when the statements to be added are given as another RDF.Graph
, the
prefixes of this graph will be added. In case of conflicting prefix mappings
the original prefix from graph
will be kept.
Specs
add_prefixes( t(), RDF.PrefixMap.t() | map() | keyword() | nil, RDF.PrefixMap.conflict_resolver() | nil ) :: t()
Adds prefixes
to the given graph
.
The prefixes
mappings can be given as any structure convertible to a
RDF.PrefixMap
.
When a prefix with another mapping already exists it will be overwritten with
the new one. This behaviour can be customized by providing a conflict_resolver
function. See RDF.PrefixMap.merge/3
for more on that.
Specs
Returns the base IRI of the given graph
.
Specs
change_name(t(), RDF.Statement.coercible_graph_name()) :: t()
Changes the graph name of graph
.
Specs
Removes all triples from graph
.
This function is useful for getting an empty graph based on the settings of another graph, as this function keeps graph name, base IRI and default prefixes as they are and just removes the triples.
Specs
Clears the base IRI of the given graph
.
Specs
Clears the base IRI and all prefixes of the given graph
.
Specs
Clears all prefixes of the given graph
.
Specs
Deletes statements from a RDF.Graph
.
Note: When the statements to be deleted are given as another RDF.Graph
,
the graph name must not match graph name of the graph from which the statements
are deleted. If you want to delete only graphs with matching names, you can
use RDF.Data.delete/2
.
Specs
delete_descriptions( t(), RDF.Statement.coercible_subject() | [RDF.Statement.coercible_subject()] ) :: t()
Deletes all statements with the given subjects
.
If subjects
contains subjects that are not in graph
, they're simply ignored.
Specs
delete_prefixes(t(), RDF.PrefixMap.t()) :: t()
Deletes prefixes
from the given graph
.
The prefixes
can be a single prefix or a list of prefixes.
Prefixes not in prefixes of the graph are simply ignored.
Specs
describes?(t(), RDF.Statement.coercible_subject()) :: boolean()
Checks if a RDF.Graph
contains statements about the given resource.
Examples
iex> RDF.Graph.new([{EX.S1, EX.p1, EX.O1}]) |> RDF.Graph.describes?(EX.S1)
true
iex> RDF.Graph.new([{EX.S1, EX.p1, EX.O1}]) |> RDF.Graph.describes?(EX.S2)
false
Specs
description(t(), RDF.Statement.coercible_subject()) :: RDF.Description.t() | nil
The RDF.Description
of the given subject.
Specs
descriptions(t()) :: [RDF.Description.t()]
All RDF.Description
s within a RDF.Graph
.
Specs
Checks if two RDF.Graph
s are equal.
Two RDF.Graph
s are considered to be equal if they contain the same triples
and have the same name. The prefixes of the graph are irrelevant for equality.
Specs
fetch(t(), RDF.Statement.coercible_subject()) :: {:ok, RDF.Description.t()} | :error
Fetches the description of the given subject.
When the subject can not be found :error
is returned.
Examples
iex> RDF.Graph.new([{EX.S1, EX.P1, EX.O1}, {EX.S2, EX.P2, EX.O2}])
...> |> RDF.Graph.fetch(EX.S1)
{:ok, RDF.Description.new(EX.S1, init: {EX.P1, EX.O1})}
iex> RDF.Graph.new() |> RDF.Graph.fetch(EX.foo)
:error
Specs
get(t(), RDF.Statement.coercible_subject(), RDF.Description.t() | nil) :: RDF.Description.t() | nil
Gets the description of the given subject.
When the subject can not be found the optionally given default value or nil
is returned.
Examples
iex> RDF.Graph.new([{EX.S1, EX.P1, EX.O1}, {EX.S2, EX.P2, EX.O2}])
...> |> RDF.Graph.get(EX.S1)
RDF.Description.new(EX.S1, init: {EX.P1, EX.O1})
iex> RDF.Graph.new() |> RDF.Graph.get(EX.Foo)
nil
iex> RDF.Graph.new() |> RDF.Graph.get(EX.Foo, :bar)
:bar
Specs
get_and_update( t(), RDF.Statement.coercible_subject(), get_and_update_description_fun() ) :: {RDF.Description.t(), input()}
Gets and updates the description of the given subject, in a single pass.
Invokes the passed function on the RDF.Description
of the given subject;
this function should return either {description_to_return, new_description}
or :pop
.
If the passed function returns {description_to_return, new_description}
, the
return value of get_and_update
is {description_to_return, new_graph}
where
new_graph
is the input Graph
updated with new_description
for
the given subject.
If the passed function returns :pop
the description for the given subject is
removed and a {removed_description, new_graph}
tuple gets returned.
Examples
iex> RDF.Graph.new({EX.S, EX.P, EX.O})
...> |> RDF.Graph.get_and_update(EX.S, fn current_description ->
...> {current_description, {EX.P, EX.NEW}}
...> end)
{RDF.Description.new(EX.S, init: {EX.P, EX.O}), RDF.Graph.new({EX.S, EX.P, EX.NEW})}
Specs
Checks if the given input
statements exist within graph
.
Specs
map(t(), RDF.Statement.term_mapping()) :: map()
Returns a nested map of a RDF.Graph
where each element from its triples is mapped with the given function.
The function fun
will receive a tuple {statement_position, rdf_term}
where
statement_position
is one of the atoms :subject
, :predicate
or :object
,
while rdf_term
is the RDF term to be mapped. When the given function returns
nil
this will be interpreted as an error and will become the overhaul result
of the map/2
call.
Examples
iex> RDF.Graph.new([
...> {~I<http://example.com/S1>, ~I<http://example.com/p>, ~L"Foo"},
...> {~I<http://example.com/S2>, ~I<http://example.com/p>, RDF.XSD.integer(42)}
...> ])
...> |> RDF.Graph.map(fn
...> {:predicate, predicate} ->
...> predicate
...> |> to_string()
...> |> String.split("/")
...> |> List.last()
...> |> String.to_atom()
...> {_, term} ->
...> RDF.Term.value(term)
...> end)
%{
"http://example.com/S1" => %{p: ["Foo"]},
"http://example.com/S2" => %{p: [42]}
}
Specs
name(t()) :: RDF.Statement.graph_name()
Returns the graph name IRI of graph
.
Specs
new() :: t()
Creates an empty unnamed RDF.Graph
.
Specs
Creates an RDF.Graph
.
If a keyword list with options is given an empty graph is created. Otherwise an unnamed graph initialized with the given data is created.
See new/2
for available arguments and the different ways to provide data.
Examples
RDF.Graph.new(name: EX.GraphName)
RDF.Graph.new(init: {EX.S, EX.p, EX.O})
RDF.Graph.new({EX.S, EX.p, EX.O})
Specs
Creates an RDF.Graph
initialized with data.
The initial RDF triples can be provided
- as a single statement tuple
- a
RDF.Description
- a
RDF.Graph
- or a list with any combination of the former
Available options:
name
: the name of the graph to be createdprefixes
: some prefix mappings which should be stored alongside the graph and will be used for example when serializing in a format with prefix supportbase_iri
: a base IRI which should be stored alongside the graph and will be used for example when serializing in a format with base IRI supportinit
: some data with which the graph should be initialized; the data can be provided in any form accepted byadd/3
and above that also with a function returning the initialization data in any of these forms
Examples
RDF.Graph.new({EX.S, EX.p, EX.O})
RDF.Graph.new({EX.S, EX.p, EX.O}, name: EX.GraphName)
RDF.Graph.new({EX.S, EX.p, [EX.O1, EX.O2]})
RDF.Graph.new([{EX.S1, EX.p1, EX.O1}, {EX.S2, EX.p2, EX.O2}])
RDF.Graph.new(RDF.Description.new(EX.S, EX.P, EX.O))
RDF.Graph.new([graph, description, triple])
RDF.Graph.new({EX.S, EX.p, EX.O}, name: EX.GraphName, base_iri: EX.base)
The set of all resources used in the objects within a RDF.Graph
.
Note: This function does collect only IRIs and BlankNodes, not Literals.
Examples
iex> RDF.Graph.new([
...> {EX.S1, EX.p1, EX.O1},
...> {EX.S2, EX.p2, EX.O2},
...> {EX.S3, EX.p1, EX.O2},
...> {EX.S4, EX.p2, RDF.bnode(:bnode)},
...> {EX.S5, EX.p3, "foo"}])
...> |> RDF.Graph.objects()
MapSet.new([RDF.iri(EX.O1), RDF.iri(EX.O2), RDF.bnode(:bnode)])
Specs
pop(t()) :: {RDF.Statement.t() | nil, t()}
Pops an arbitrary triple from a RDF.Graph
.
Specs
pop(t(), RDF.Statement.coercible_subject()) :: {RDF.Description.t() | nil, t()}
Pops the description of the given subject.
When the subject can not be found the optionally given default value or nil
is returned.
Examples
iex> RDF.Graph.new([{EX.S1, EX.P1, EX.O1}, {EX.S2, EX.P2, EX.O2}])
...> |> RDF.Graph.pop(EX.S1)
{RDF.Description.new(EX.S1, init: {EX.P1, EX.O1}), RDF.Graph.new({EX.S2, EX.P2, EX.O2})}
iex> RDF.Graph.new({EX.S, EX.P, EX.O}) |> RDF.Graph.pop(EX.Missing)
{nil, RDF.Graph.new({EX.S, EX.P, EX.O})}
The set of all properties used in the predicates of the statements within a RDF.Graph
.
Examples
iex> RDF.Graph.new([
...> {EX.S1, EX.p1, EX.O1},
...> {EX.S2, EX.p2, EX.O2},
...> {EX.S1, EX.p2, EX.O3}])
...> |> RDF.Graph.predicates()
MapSet.new([EX.p1, EX.p2])
Specs
prefixes(t()) :: RDF.PrefixMap.t() | nil
Returns the prefixes of the given graph
as a RDF.PrefixMap
.
Specs
Adds statements to a RDF.Graph
overwriting existing statements with the subjects given in the input
data.
When the statements to be added are given as another RDF.Graph
, the prefixes
of this graph will be added. In case of conflicting prefix mappings the
original prefix from graph
will be kept.
Examples
iex> RDF.Graph.new([{EX.S1, EX.P1, EX.O1}, {EX.S2, EX.P2, EX.O2}])
...> |> RDF.Graph.put([{EX.S1, EX.P3, EX.O3}])
RDF.Graph.new([{EX.S1, EX.P3, EX.O3}, {EX.S2, EX.P2, EX.O2}])
Specs
Adds statements to a RDF.Graph
and overwrites all existing statements with the same subject-predicate combinations given in the input
data.
When the statements to be added are given as another RDF.Graph
, the prefixes
of this graph will be added. In case of conflicting prefix mappings the
original prefix from graph
will be kept.
Examples
iex> RDF.Graph.new([{EX.S1, EX.P1, EX.O1}, {EX.S2, EX.P2, EX.O2}])
...> |> RDF.Graph.put_properties([{EX.S1, EX.P2, EX.O3}, {EX.S2, EX.P2, EX.O3}])
RDF.Graph.new([{EX.S1, EX.P1, EX.O1}, {EX.S1, EX.P2, EX.O3}, {EX.S2, EX.P2, EX.O3}])
Execute the given query
against the given graph
.
This is just a convenience delegator function to RDF.Query.execute!/3
with
the first two arguments swapped so it can be used in a pipeline on a RDF.Graph
.
See RDF.Query.execute/3
and RDF.Query.execute!/3
for more information and examples.
Returns a Stream
for the execution of the given query
against the given graph
.
This is just a convenience delegator function to RDF.Query.stream!/3
with
the first two arguments swapped so it can be used in a pipeline on a RDF.Graph
.
See RDF.Query.stream/3
and RDF.Query.stream!/3
for more information and examples.
The set of all resources used within a RDF.Graph
.
Examples
iex> RDF.Graph.new([
...> {EX.S1, EX.p1, EX.O1},
...> {EX.S2, EX.p1, EX.O2},
...> {EX.S2, EX.p2, RDF.bnode(:bnode)},
...> {EX.S3, EX.p1, "foo"}])
...> |> RDF.Graph.resources()
MapSet.new([RDF.iri(EX.S1), RDF.iri(EX.S2), RDF.iri(EX.S3),
RDF.iri(EX.O1), RDF.iri(EX.O2), RDF.bnode(:bnode), EX.p1, EX.p2])
Specs
Sets the base IRI of the given graph
.
The base_iri
can be given as anything accepted by RDF.IRI.coerce_base/1
.
Specs
statement_count(t()) :: non_neg_integer()
The number of statements within a RDF.Graph
.
Examples
iex> RDF.Graph.new([
...> {EX.S1, EX.p1, EX.O1},
...> {EX.S2, EX.p2, EX.O2},
...> {EX.S1, EX.p2, EX.O3}])
...> |> RDF.Graph.statement_count()
3
See RDF.Graph.triples/1
.
Specs
subject_count(t()) :: non_neg_integer()
The number of subjects within a RDF.Graph
.
Examples
iex> RDF.Graph.new([
...> {EX.S1, EX.p1, EX.O1},
...> {EX.S2, EX.p2, EX.O2},
...> {EX.S1, EX.p2, EX.O3}])
...> |> RDF.Graph.subject_count()
2
The set of all subjects used in the statements within a RDF.Graph
.
Examples
iex> RDF.Graph.new([
...> {EX.S1, EX.p1, EX.O1},
...> {EX.S2, EX.p2, EX.O2},
...> {EX.S1, EX.p2, EX.O3}])
...> |> RDF.Graph.subjects()
MapSet.new([RDF.iri(EX.S1), RDF.iri(EX.S2)])
Specs
take( t(), [RDF.Statement.coercible_subject()] | Enum.t() | nil, [RDF.Statement.coercible_predicate()] | Enum.t() | nil ) :: t()
Creates a graph from another one by limiting its statements to those using one of the given subjects
.
If subjects
contains IRIs that are not used in the graph
, they're simply ignored.
The optional properties
argument allows to limit also properties of the subject descriptions.
If nil
is passed as the subjects
, the subjects will not be limited.
Specs
triples(t()) :: [RDF.Statement.t()]
The list of all statements within a RDF.Graph
.
Examples
iex> RDF.Graph.new([
...> {EX.S1, EX.p1, EX.O1},
...> {EX.S2, EX.p2, EX.O2},
...> {EX.S1, EX.p2, EX.O3}])
...> |> RDF.Graph.triples()
[{RDF.iri(EX.S1), RDF.iri(EX.p1), RDF.iri(EX.O1)},
{RDF.iri(EX.S1), RDF.iri(EX.p2), RDF.iri(EX.O3)},
{RDF.iri(EX.S2), RDF.iri(EX.p2), RDF.iri(EX.O2)}]
Specs
update( t(), RDF.Statement.coercible_subject(), RDF.Description.input() | nil, update_description_fun() ) :: t()
Updates the description of the subject
in graph
with the given function.
If subject
is present in graph
with description
as description,
fun
is invoked with argument description
and its result is used as the new
description of subject
. If subject
is not present in graph
,
initial
is inserted as the description of subject
. The initial value will
not be passed through the update function.
The initial value and the returned objects by the update function will be tried
te coerced to proper RDF descriptions before added. If the initial or returned
description is a RDF.Description
with another subject, the respective
statements are added with subject
as subject.
Examples
iex> RDF.Graph.new({EX.S, EX.p, EX.O})
...> |> RDF.Graph.update(EX.S,
...> fn description -> Description.add(description, {EX.p, EX.O2})
...> end)
RDF.Graph.new([{EX.S, EX.p, EX.O}, {EX.S, EX.p, EX.O2}])
iex> RDF.Graph.new({EX.S, EX.p, EX.O})
...> |> RDF.Graph.update(EX.S,
...> fn _ -> Description.new(EX.S2, init: {EX.p2, EX.O2})
...> end)
RDF.Graph.new([{EX.S, EX.p2, EX.O2}])
iex> RDF.Graph.new()
...> |> RDF.Graph.update(EX.S, Description.new(EX.S, init: {EX.p, EX.O}),
...> fn description -> Description.add(description, {EX.p, EX.O2})
...> end)
RDF.Graph.new([{EX.S, EX.p, EX.O}])
Specs
Returns a nested map of the native Elixir values of a RDF.Graph
.
When a :context
option is given with a RDF.PropertyMap
, predicates will
be mapped to the terms defined in the RDF.PropertyMap
, if present.
Examples
iex> RDF.Graph.new([
...> {~I<http://example.com/S1>, ~I<http://example.com/p>, ~L"Foo"},
...> {~I<http://example.com/S2>, ~I<http://example.com/p>, RDF.XSD.integer(42)}
...> ])
...> |> RDF.Graph.values()
%{
"http://example.com/S1" => %{"http://example.com/p" => ["Foo"]},
"http://example.com/S2" => %{"http://example.com/p" => [42]}
}
iex> RDF.Graph.new([
...> {~I<http://example.com/S1>, ~I<http://example.com/p>, ~L"Foo"},
...> {~I<http://example.com/S2>, ~I<http://example.com/p>, RDF.XSD.integer(42)}
...> ])
...> |> RDF.Graph.values(context: [p: ~I<http://example.com/p>])
%{
"http://example.com/S1" => %{p: ["Foo"]},
"http://example.com/S2" => %{p: [42]}
}