Use RDF.PrefixMap.prefixed_name/2 in Turtle encoder
This commit is contained in:
parent
27a4c177e2
commit
929e2a8c81
3 changed files with 14 additions and 39 deletions
|
@ -17,6 +17,8 @@ This project adheres to [Semantic Versioning](http://semver.org/) and
|
|||
|
||||
- more compact Inspect form for `RDF.PrefixMap`
|
||||
- the `RDF.Turtle.Encoder` accepts `RDF.Vocabulary.Namespace` modules as `base`
|
||||
- the performance of the `RDF.Turtle.Encoder` was improved (by using a more
|
||||
efficient method for resolving IRIs to prefixed names for most use cases)
|
||||
- `RDF.BlankNode.new/0` creates integer-based blank nodes, which is much more
|
||||
efficient in terms of performance and memory consumption than the previous
|
||||
ref-based blank nodes
|
||||
|
|
|
@ -46,7 +46,6 @@ defmodule RDF.Turtle.Encoder do
|
|||
prefixes =
|
||||
Keyword.get(opts, :prefixes)
|
||||
|> prefixes(data)
|
||||
|> init_prefixes()
|
||||
|
||||
with {:ok, state} = State.start_link(data, base, prefixes) do
|
||||
try do
|
||||
|
@ -111,12 +110,6 @@ defmodule RDF.Turtle.Encoder do
|
|||
defp prefixes(nil, _), do: RDF.default_prefixes()
|
||||
defp prefixes(prefixes, _), do: PrefixMap.new(prefixes)
|
||||
|
||||
defp init_prefixes(prefixes) do
|
||||
Enum.reduce(prefixes, %{}, fn {prefix, iri}, reverse ->
|
||||
Map.put(reverse, iri, to_string(prefix))
|
||||
end)
|
||||
end
|
||||
|
||||
defp base_directive(nil, _), do: ""
|
||||
|
||||
defp base_directive({_, base}, opts) do
|
||||
|
@ -126,7 +119,7 @@ defmodule RDF.Turtle.Encoder do
|
|||
end <> "\n\n"
|
||||
end
|
||||
|
||||
defp prefix_directive({ns, prefix}, opts) do
|
||||
defp prefix_directive({prefix, ns}, opts) do
|
||||
case Keyword.get(opts, :directive_style) do
|
||||
:sparql -> "PREFIX #{prefix}: <#{to_string(ns)}>\n"
|
||||
_ -> "@prefix #{prefix}: <#{to_string(ns)}> .\n"
|
||||
|
@ -390,28 +383,7 @@ defmodule RDF.Turtle.Encoder do
|
|||
}]
|
||||
|
||||
def prefixed_name(iri, prefixes) do
|
||||
with {ns, name} <- split_iri(iri) do
|
||||
case prefixes[ns] do
|
||||
nil -> nil
|
||||
prefix -> prefix <> ":" <> name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
defp split_iri(%IRI{} = iri),
|
||||
do: iri |> IRI.parse() |> split_iri()
|
||||
|
||||
defp split_iri(%URI{fragment: fragment} = uri) when not is_nil(fragment),
|
||||
do: {RDF.iri(%URI{uri | fragment: ""}), fragment}
|
||||
|
||||
defp split_iri(%URI{path: nil}),
|
||||
do: nil
|
||||
|
||||
defp split_iri(%URI{path: path} = uri) do
|
||||
with [{pos, _}] = Regex.run(~r"[^/]*$"u, path, return: :index),
|
||||
{ns_path, name} = String.split_at(path, pos) do
|
||||
{RDF.iri(%URI{uri | path: ns_path}), name}
|
||||
end
|
||||
PrefixMap.prefixed_name(prefixes, iri)
|
||||
end
|
||||
|
||||
defp quoted(string) do
|
||||
|
|
|
@ -5,7 +5,7 @@ defmodule RDF.Turtle.EncoderTest do
|
|||
|
||||
doctest Turtle.Encoder
|
||||
|
||||
alias RDF.Graph
|
||||
alias RDF.{Graph, PrefixMap}
|
||||
alias RDF.NS
|
||||
alias RDF.NS.{RDFS, OWL}
|
||||
|
||||
|
@ -202,9 +202,9 @@ defmodule RDF.Turtle.EncoderTest do
|
|||
"""
|
||||
@base <#{to_string(EX.__base_iri__())}> .
|
||||
|
||||
@prefix owl: <#{to_string(OWL.__base_iri__())}> .
|
||||
@prefix rdf: <#{to_string(RDF.__base_iri__())}> .
|
||||
@prefix rdfs: <#{to_string(RDFS.__base_iri__())}> .
|
||||
@prefix owl: <#{to_string(OWL.__base_iri__())}> .
|
||||
|
||||
<>
|
||||
a owl:Ontology .
|
||||
|
@ -331,9 +331,9 @@ defmodule RDF.Turtle.EncoderTest do
|
|||
assert Turtle.Encoder.encode!(dataset) ==
|
||||
"""
|
||||
@prefix ex: <http://example.org/#> .
|
||||
@prefix owl: <http://www.w3.org/2002/07/owl#> .
|
||||
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
||||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
||||
@prefix owl: <http://www.w3.org/2002/07/owl#> .
|
||||
|
||||
<http://other.example.com/S2>
|
||||
a rdfs:Class .
|
||||
|
@ -366,10 +366,11 @@ defmodule RDF.Turtle.EncoderTest do
|
|||
describe "prefixed_name/2" do
|
||||
setup do
|
||||
{:ok,
|
||||
prefixes: %{
|
||||
RDF.iri(EX.__base_iri__()) => "ex",
|
||||
~I<http://example.org/> => "ex2"
|
||||
}}
|
||||
prefixes:
|
||||
PrefixMap.new(
|
||||
ex: EX,
|
||||
ex2: ~I<http://example.org/>
|
||||
)}
|
||||
end
|
||||
|
||||
test "hash iri with existing prefix", %{prefixes: prefixes} do
|
||||
|
@ -383,7 +384,7 @@ defmodule RDF.Turtle.EncoderTest do
|
|||
end
|
||||
|
||||
test "hash iri with non-existing prefix" do
|
||||
refute Turtle.Encoder.prefixed_name(EX.foo(), %{})
|
||||
refute Turtle.Encoder.prefixed_name(EX.foo(), PrefixMap.new())
|
||||
end
|
||||
|
||||
test "slash iri with existing prefix", %{prefixes: prefixes} do
|
||||
|
@ -397,7 +398,7 @@ defmodule RDF.Turtle.EncoderTest do
|
|||
end
|
||||
|
||||
test "slash iri with non-existing prefix" do
|
||||
refute Turtle.Encoder.prefixed_name(~I<http://example.org/foo>, %{})
|
||||
refute Turtle.Encoder.prefixed_name(~I<http://example.org/foo>, PrefixMap.new())
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue