core: add statements from one graph to another

This commit is contained in:
Marcel Otto 2017-03-31 15:55:56 +02:00
parent daba9d9667
commit f49828b76b
2 changed files with 32 additions and 4 deletions

View file

@ -120,11 +120,18 @@ defmodule RDF.Graph do
def add(%RDF.Graph{name: name, descriptions: descriptions},
%Description{subject: subject} = description) do
description = if existing_description = descriptions[subject],
do: Description.add(existing_description, description),
else: description
%RDF.Graph{name: name,
descriptions: Map.put(descriptions, subject, description)}
descriptions:
Map.update(descriptions, subject, description, fn current ->
current |> Description.add(description)
end)
}
end
def add(graph, %RDF.Graph{descriptions: descriptions}) do
Enum.reduce descriptions, graph, fn ({_, description}, graph) ->
add(graph, description)
end
end

View file

@ -143,6 +143,27 @@ defmodule RDF.GraphTest do
assert Graph.add(g, {EX.Subject, EX.predicate, EX.Object}) == g
end
test "a Graph" do
g = Graph.add(graph(), Graph.new([
{EX.Subject1, EX.predicate1, EX.Object1},
{EX.Subject2, EX.predicate2, EX.Object2},
{EX.Subject3, EX.predicate3, EX.Object3}
]))
assert graph_includes_statement?(g, {EX.Subject1, EX.predicate1, EX.Object1})
assert graph_includes_statement?(g, {EX.Subject2, EX.predicate2, EX.Object2})
assert graph_includes_statement?(g, {EX.Subject3, EX.predicate3, EX.Object3})
g = Graph.add(g, Graph.new([
{EX.Subject1, EX.predicate1, EX.Object2},
{EX.Subject2, EX.predicate4, EX.Object4},
]))
assert graph_includes_statement?(g, {EX.Subject1, EX.predicate1, EX.Object1})
assert graph_includes_statement?(g, {EX.Subject1, EX.predicate1, EX.Object2})
assert graph_includes_statement?(g, {EX.Subject2, EX.predicate2, EX.Object2})
assert graph_includes_statement?(g, {EX.Subject2, EX.predicate4, EX.Object4})
assert graph_includes_statement?(g, {EX.Subject3, EX.predicate3, EX.Object3})
end
test "non-convertible Triple elements are causing an error" do
assert_raise RDF.InvalidURIError, fn ->
Graph.add(graph(), {"not a URI", EX.predicate, uri(EX.Object)})