core: add RDF.Data.description/2

This commit is contained in:
Marcel Otto 2017-06-05 02:48:39 +02:00
parent 9a128858b6
commit 96447ec258
2 changed files with 70 additions and 3 deletions

View file

@ -23,6 +23,14 @@ defprotocol RDF.Data do
"""
def statements(data)
@doc """
Returns a `RDF.Description` of the given subject.
Note: On a `RDF.Dataset` this will return an aggregated `RDF.Description` with
the statements about this subject from all graphs.
"""
def description(data, subject)
@doc """
Returns the set of all resources which are subject of the statements of a RDF data structure.
"""
@ -66,9 +74,18 @@ defimpl RDF.Data, for: RDF.Description do
do: RDF.Description.include?(description, statements)
def statements(description), do: RDF.Description.statements(description)
def description(%RDF.Description{subject: subject} = description, requested_subject) do
with ^subject <- RDF.Statement.convert_subject(requested_subject) do
description
else
_ -> RDF.Description.new(requested_subject)
end
end
def subjects(%RDF.Description{subject: subject}), do: MapSet.new([subject])
def predicates(description), do: RDF.Description.predicates(description)
def objects(description), do: RDF.Description.objects(description)
def subjects(%RDF.Description{subject: subject}), do: MapSet.new([subject])
def resources(%RDF.Description{subject: subject} = description),
do: RDF.Description.resources(description) |> MapSet.put(subject)
@ -86,6 +103,10 @@ defimpl RDF.Data, for: RDF.Graph do
def include?(graph, statements), do: RDF.Graph.include?(graph, statements)
def statements(graph), do: RDF.Graph.statements(graph)
def description(graph, subject),
do: RDF.Graph.description(graph, subject) || RDF.Description.new(subject)
def subjects(graph), do: RDF.Graph.subjects(graph)
def predicates(graph), do: RDF.Graph.predicates(graph)
def objects(graph), do: RDF.Graph.objects(graph)
@ -104,6 +125,18 @@ defimpl RDF.Data, for: RDF.Dataset do
def include?(dataset, statements), do: RDF.Dataset.include?(dataset, statements)
def statements(dataset), do: RDF.Dataset.statements(dataset)
def description(dataset, subject) do
with subject = RDF.Statement.convert_subject(subject) do
Enum.reduce RDF.Dataset.graphs(dataset), RDF.Description.new(subject), fn
%RDF.Graph{descriptions: %{^subject => graph_description}}, description ->
RDF.Description.add(description, graph_description)
_, description ->
description
end
end
end
def subjects(dataset), do: RDF.Dataset.subjects(dataset)
def predicates(dataset), do: RDF.Dataset.predicates(dataset)
def objects(dataset), do: RDF.Dataset.objects(dataset)

View file

@ -20,7 +20,8 @@ defmodule RDF.DataTest do
|> Dataset.add((
Graph.new(EX.NamedGraph)
|> Graph.add(description)
|> Graph.add({EX.S3, EX.p3, EX.O5})), EX.NamedGraph
|> Graph.add({EX.S3, EX.p3, EX.O5})
|> Graph.add({EX.S, EX.p3, EX.O5})), EX.NamedGraph
)
{:ok,
description: description,
@ -55,6 +56,18 @@ defmodule RDF.DataTest do
assert RDF.Data.statements(description) == Description.statements(description)
end
test "description when the requested subject matches the Description.subject",
%{description: description} do
assert RDF.Data.description(description, description.subject) == description
assert RDF.Data.description(description, to_string(description.subject)) == description
assert RDF.Data.description(description, EX.S) == description
end
test "description when the requested subject does not match the Description.subject",
%{description: description} do
assert RDF.Data.description(description, uri(EX.Other)) == Description.new(EX.Other)
end
test "subjects", %{description: description} do
assert RDF.Data.subjects(description) == MapSet.new([uri(EX.S)])
end
@ -109,6 +122,16 @@ defmodule RDF.DataTest do
assert RDF.Data.statements(graph) == Graph.statements(graph)
end
test "description when a description is present",
%{graph: graph, description: description} do
assert RDF.Data.description(graph, uri(EX.S)) == description
assert RDF.Data.description(graph, EX.S) == description
end
test "description when a description is not present", %{graph: graph} do
assert RDF.Data.description(graph, uri(EX.Other)) == Description.new(EX.Other)
end
test "subjects", %{graph: graph} do
assert RDF.Data.subjects(graph) == MapSet.new([uri(EX.S), uri(EX.S2)])
end
@ -164,6 +187,17 @@ defmodule RDF.DataTest do
refute RDF.Data.include?(dataset, {EX.Other, EX.p1, EX.O2})
end
test "description when a description is present",
%{dataset: dataset, description: description} do
description_aggregate = Description.add(description, {EX.S, EX.p3, EX.O5})
assert RDF.Data.description(dataset, uri(EX.S)) == description_aggregate
assert RDF.Data.description(dataset, EX.S) == description_aggregate
end
test "description when a description is not present", %{dataset: dataset} do
assert RDF.Data.description(dataset, uri(EX.Other)) == Description.new(EX.Other)
end
test "statements", %{dataset: dataset} do
assert RDF.Data.statements(dataset) == Dataset.statements(dataset)
end
@ -193,7 +227,7 @@ defmodule RDF.DataTest do
end
test "statement_count", %{dataset: dataset} do
assert RDF.Data.statement_count(dataset) == 13
assert RDF.Data.statement_count(dataset) == 14
end
end