core: add, put and delete of Description and Graph can handle quads

by just ignoring the graph context
This commit is contained in:
Marcel Otto 2017-06-05 15:50:31 +02:00
parent e1e8769fb2
commit 232e2ac765
2 changed files with 34 additions and 17 deletions

View file

@ -92,6 +92,9 @@ defmodule RDF.Description do
else: description
end
def add(description, {subject, predicate, object, _}),
do: add(description, {subject, predicate, object})
def add(description, statements) when is_list(statements) do
Enum.reduce statements, description, fn (statement, description) ->
add(description, statement)
@ -133,8 +136,8 @@ defmodule RDF.Description do
predications: Map.put(predications, triple_predicate, triple_objects)}
end
def put(desc = %RDF.Description{}, predicate, object),
do: put(desc, predicate, [object])
def put(%RDF.Description{} = description, predicate, object),
do: put(description, predicate, [object])
@doc """
Adds statements to a `RDF.Description` and overwrites all existing statements with already used predicates.
@ -155,16 +158,19 @@ defmodule RDF.Description do
"""
def put(description, statements)
def put(desc = %RDF.Description{}, {predicate, object}),
do: put(desc, predicate, object)
def put(%RDF.Description{} = description, {predicate, object}),
do: put(description, predicate, object)
def put(desc = %RDF.Description{}, {subject, predicate, object}) do
if convert_subject(subject) == desc.subject,
do: put(desc, predicate, object),
else: desc
def put(%RDF.Description{} = description, {subject, predicate, object}) do
if convert_subject(subject) == description.subject,
do: put(description, predicate, object),
else: description
end
def put(desc = %RDF.Description{subject: subject}, statements) when is_list(statements) do
def put(description, {subject, predicate, object, _}),
do: put(description, {subject, predicate, object})
def put(%RDF.Description{subject: subject} = description, statements) when is_list(statements) do
statements
|> Stream.map(fn
{p, o} -> {convert_predicate(p), o}
@ -176,8 +182,9 @@ defmodule RDF.Description do
end)
|> Stream.filter(&(&1)) # filter nil values
|> Enum.group_by(&(elem(&1, 0)), &(elem(&1, 1)))
|> Enum.reduce(desc, fn ({predicate, objects}, desc) ->
put(desc, predicate, objects) end)
|> Enum.reduce(description, fn ({predicate, objects}, description) ->
put(description, predicate, objects)
end)
end
def put(%RDF.Description{subject: subject, predications: predications},
@ -245,6 +252,9 @@ defmodule RDF.Description do
else: description
end
def delete(description, {subject, predicate, object, _}),
do: delete(description, {subject, predicate, object})
def delete(description, statements) when is_list(statements) do
Enum.reduce statements, description, fn (statement, description) ->
delete(description, statement)

View file

@ -114,6 +114,9 @@ defmodule RDF.Graph do
def add(%RDF.Graph{} = graph, {subject, _, _} = statement),
do: do_add(graph, convert_subject(subject), statement)
def add(graph, {subject, predicate, object, _}),
do: add(graph, {subject, predicate, object})
def add(graph, triples) when is_list(triples) do
Enum.reduce triples, graph, fn (triple, graph) ->
add(graph, triple)
@ -168,6 +171,9 @@ defmodule RDF.Graph do
def put(%RDF.Graph{} = graph, {subject, _, _} = statement),
do: do_put(graph, convert_subject(subject), statement)
def put(graph, {subject, predicate, object, _}),
do: put(graph, {subject, predicate, object})
def put(%RDF.Graph{} = graph, %Description{subject: subject} = description),
do: do_put(graph, subject, description)
@ -232,9 +238,11 @@ defmodule RDF.Graph do
"""
def delete(graph, triples)
def delete(%RDF.Graph{} = graph, {subject, _, _} = triple) do
do_delete(graph, convert_subject(subject), triple)
end
def delete(%RDF.Graph{} = graph, {subject, _, _} = triple),
do: do_delete(graph, convert_subject(subject), triple)
def delete(graph, {subject, predicate, object, _}),
do: delete(graph, {subject, predicate, object})
def delete(%RDF.Graph{} = graph, triples) when is_list(triples) do
Enum.reduce triples, graph, fn (triple, graph) ->
@ -242,9 +250,8 @@ defmodule RDF.Graph do
end
end
def delete(%RDF.Graph{} = graph, %Description{subject: subject} = description) do
do_delete(graph, subject, description)
end
def delete(%RDF.Graph{} = graph, %Description{subject: subject} = description),
do: do_delete(graph, subject, description)
def delete(%RDF.Graph{} = graph, %RDF.Graph{descriptions: descriptions}) do
Enum.reduce descriptions, graph, fn ({_, description}, graph) ->