rdf-marmotta 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/README.md +23 -0
- data/lib/rdf/marmotta.rb +79 -0
- data/rdf-marmotta.gemspec +27 -0
- data/spec/marmotta_spec.rb +124 -0
- data/spec/spec_helper.rb +15 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca8d084b6dd3a1127eace872b52c7b6ca941b766
|
4
|
+
data.tar.gz: 22b92c906a5e092328e735fa60b8b00f3963b7c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a15e863ab6c6af68a43c7ff133fa608bfe45159ebdbb7d82665b2a5e4a346483e05c504275314d79dc9a84f9c58efe928cae6e28708ac8cd05d6d3733739adc8
|
7
|
+
data.tar.gz: 309eba551ec09d8b647476d3d9daf0615afca7ccc663633a08189b6e6dd4f07f1219234bcbcd611456da2defbf80ba52dca8792c8a32abbb1f2203184b0006d8
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
RDF::Marmotta
|
2
|
+
=============
|
3
|
+
|
4
|
+
A Ruby RDF::Repository implementation for Apache Marmotta.
|
5
|
+
|
6
|
+
Installing & Using
|
7
|
+
------------------
|
8
|
+
|
9
|
+
Add `gem rdf-marmotta` to `Gemfile` and run:
|
10
|
+
|
11
|
+
```bash
|
12
|
+
$ bundle install
|
13
|
+
```
|
14
|
+
|
15
|
+
To use, `require rdf/marmotta` and initialize a repository with
|
16
|
+
`RDF::Marmotta.new('http://path.to/marmotta_base')`.
|
17
|
+
|
18
|
+
NOTE: WIP
|
19
|
+
---------
|
20
|
+
|
21
|
+
This software implements simple RDF::Repository functionality, but is
|
22
|
+
likely riddled with problems and non-performant. Don't point it at a
|
23
|
+
datastore you care about.
|
data/lib/rdf/marmotta.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'rdf'
|
2
|
+
require 'rdf/rdfxml'
|
3
|
+
require 'sparql/client'
|
4
|
+
require 'enumerator'
|
5
|
+
|
6
|
+
module RDF
|
7
|
+
class Marmotta < ::RDF::Repository
|
8
|
+
|
9
|
+
attr_accessor :endpoints
|
10
|
+
|
11
|
+
DEFAULT_OPTIONS = {
|
12
|
+
:sparql => 'sparql/select',
|
13
|
+
:sparql_update => 'sparql/update',
|
14
|
+
:ldpath => 'ldpath'
|
15
|
+
}
|
16
|
+
|
17
|
+
def initialize(base_url, options = {})
|
18
|
+
@endpoints = DEFAULT_OPTIONS
|
19
|
+
@endpoints.merge!(options)
|
20
|
+
@endpoints.each do |k, v|
|
21
|
+
@endpoints[k] = URI(base_url.to_s + v.to_s) unless v.is_a? ::URI
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def query_client
|
26
|
+
@query_client ||= Client.new(endpoints[:sparql])
|
27
|
+
end
|
28
|
+
|
29
|
+
def update_client
|
30
|
+
@update_client ||= Client.new(endpoints[:sparql_update])
|
31
|
+
end
|
32
|
+
|
33
|
+
# @see RDF::Enumerable#each.
|
34
|
+
def each(&block)
|
35
|
+
query_client.construct([:s, :p, :o]).where([:s, :p, :o]).each_statement(&block)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @see RDF::Mutable#insert_statement
|
39
|
+
def insert_statement(statement)
|
40
|
+
insert_statements([statement])
|
41
|
+
end
|
42
|
+
|
43
|
+
def insert_statements(statements)
|
44
|
+
update_client.insert_data(statements)
|
45
|
+
end
|
46
|
+
|
47
|
+
# @see RDF::Mutable#delete_statement
|
48
|
+
def delete_statement(statement)
|
49
|
+
delete_statements([statement])
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete_statements(statements)
|
53
|
+
constant = statements.all? do |value|
|
54
|
+
!value.respond_to?(:each_statement) && begin
|
55
|
+
statement = RDF::Statement.from(value)
|
56
|
+
statement.constant? && !statement.has_blank_nodes?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
if constant
|
61
|
+
update_client.delete_data(statements)
|
62
|
+
else
|
63
|
+
update_client.delete_insert(statements)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def clear
|
68
|
+
update_client.query("DELETE { ?s ?p ?o } WHERE { ?s ?p ?o }")
|
69
|
+
end
|
70
|
+
|
71
|
+
class Client < SPARQL::Client
|
72
|
+
def initialize(url, options = {}, &block)
|
73
|
+
options[:method] ||= :get
|
74
|
+
options[:protocol] ||= '1.1'
|
75
|
+
super
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "rdf-marmotta"
|
6
|
+
s.version = '0.0.4'
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Tom Johnson"]
|
9
|
+
s.homepage = 'https://github.com/dpla/rdf-marmotta'
|
10
|
+
s.email = 'tom@dp.la'
|
11
|
+
s.summary = %q{RDF::Repository layer for Apache Marmotta.}
|
12
|
+
s.description = %q{RDF::Repository layer for Apache Marmotta.}
|
13
|
+
s.license = "undeclared"
|
14
|
+
s.required_ruby_version = '>= 1.9.3'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
18
|
+
|
19
|
+
s.add_dependency('rdf', '~> 1.1')
|
20
|
+
s.add_dependency('nokogiri')
|
21
|
+
s.add_dependency('rdf-rdfxml', '~> 1.1')
|
22
|
+
s.add_dependency('sparql-client', '~> 1.1')
|
23
|
+
s.add_development_dependency('rspec')
|
24
|
+
s.add_development_dependency('rspec-its')
|
25
|
+
s.add_development_dependency('rdf-spec')
|
26
|
+
s.add_development_dependency('pry')
|
27
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
$:.unshift File.dirname(__FILE__) + "/../lib/"
|
4
|
+
|
5
|
+
require 'rdf'
|
6
|
+
require 'rdf/spec/repository'
|
7
|
+
require 'rdf/marmotta'
|
8
|
+
|
9
|
+
describe RDF::Marmotta do
|
10
|
+
|
11
|
+
let(:base_url) { 'http://localhost:8080/marmotta/' }
|
12
|
+
let(:opts) { {} }
|
13
|
+
let(:statement) { RDF::Statement(RDF::URI('http://api.dp.la/example/item/1234'), RDF::DC.title, 'Moomin') }
|
14
|
+
let(:statements) {
|
15
|
+
nodes = [RDF::Node.new, RDF::Node.new, RDF::Node.new]
|
16
|
+
[
|
17
|
+
RDF::Statement(RDF::URI('http://dbpedia.org/resource/Moomin'), RDF::URI('http://dbpedia.org/ontology/author'), RDF::URI('http://dbpedia.org/resource/Tove_Jansson')),
|
18
|
+
RDF::Statement(RDF::URI('http://dbpedia.org/resource/Moomin'), RDF::URI('http://dbpedia.org/ontology/country'), RDF::URI('http://dbpedia.org/resource/Finland')),
|
19
|
+
RDF::Statement(RDF::URI('http://dbpedia.org/resource/Moomin'), RDF::URI('http://dbpedia.org/ontology/country'), RDF::URI('http://dbpedia.org/resource/Finland')),
|
20
|
+
RDF::Statement(RDF::URI('http://dbpedia.org/resource/Moomin'), RDF::URI('http://dbpedia.org/ontology/illustrator'), RDF::URI('http://dbpedia.org/resource/Tove_Jansson')),
|
21
|
+
RDF::Statement(RDF::URI('http://dbpedia.org/resource/Moomin'), RDF::URI('http://dbpedia.org/ontology/abstract'), RDF::Literal.new("Muminki (szw. Mumintroll, fiń. Muumi) – fikcyjne istoty o antropomorficznej budowie ciała (nieco podobne do hipopotamów, ale dwunożne), zamieszkujące pewną dolinę gdzieś w Finlandii, bohaterowie cyklu dziewięciu książek fińskiej (piszącej po szwedzku) pisarki Tove Jansson. Są one odmianą trolli. Pierwsza książka o Muminkach, Małe trolle i duża powódź, została opublikowana przez Tove Jansson w 1945 (pierwsza wersja powstała już zimą 1939 roku).Wszystkie książki o Muminkach odniosły sukces: zostały przełożone na ponad trzydzieści języków. Muminki doczekały się też swojej wersji teatralnej, filmowej (między innymi serial zrealizowany w Polsce w Studio Małych Form Filmowych Se-ma-for), radiowej, telewizyjnej i komiksowej. Świat, w którym żyją Muminki, pełen jest rozmaitych stworzeń – żyją w nim Paszczaki, Hatifnatowie, Mimble – każde z nich ma swój punkt widzenia na świat, swój charakter i temperament.W Tampere, trzecim co do wielkości fińskim mieście, mieści się Muzeum „Dolina Muminków”. Natomiast w Naantali, miejscowości położonej niedaleko Turku, powstał park rozrywki \"Dolina Muminków\".", :language => 'pl')),
|
22
|
+
RDF::Statement(RDF::URI('http://dbpedia.org/resource/Moomin'), RDF::DC.relation, nodes[0]),
|
23
|
+
RDF::Statement(nodes[0], RDF::DC.title, "Comet in Moominland"),
|
24
|
+
RDF::Statement(nodes[0], RDF::DC.subject, nodes[1]),
|
25
|
+
RDF::Statement(nodes[1], RDF::SKOS.prefLabel, 'Moomin Valley'),
|
26
|
+
RDF::Statement(nodes[0], RDF::DC.subject, nodes[2]),
|
27
|
+
RDF::Statement(nodes[2], RDF::SKOS.prefLabel, 'Astronomical Events (apocryphal)')
|
28
|
+
]
|
29
|
+
}
|
30
|
+
|
31
|
+
subject { RDF::Marmotta.new(base_url, opts) }
|
32
|
+
|
33
|
+
after do
|
34
|
+
subject.clear
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'initializing' do
|
38
|
+
describe 'webservice endpoints' do
|
39
|
+
it 'has sparql endpoint' do
|
40
|
+
expect(subject.query_client).to be_a SPARQL::Client
|
41
|
+
expect(subject.update_client).to be_a SPARQL::Client
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# We probably want to pursue skolemization and/or talk to Marmotta
|
48
|
+
# folks about how they currently/should handle bnodes.
|
49
|
+
describe 'bnode handling' do
|
50
|
+
|
51
|
+
let(:node_triple) { RDF::Statement(RDF::Node.new, RDF::DC.title, 'Moomin') }
|
52
|
+
|
53
|
+
xit 'deletes only the relevant bnode' do
|
54
|
+
subject << node_triple
|
55
|
+
subject << [RDF::Node.new, RDF::DC.title, 'Moomin']
|
56
|
+
subject << [RDF::Node.new, RDF::DC.title, 'Moomin']
|
57
|
+
subject.delete_statement(node_triple)
|
58
|
+
expect(subject.count).to eq 2 # returns 0
|
59
|
+
end
|
60
|
+
|
61
|
+
xit 'identifies triples with bnodes as existing' do
|
62
|
+
subject << node_triple
|
63
|
+
expect(subject).to have_triple node_triple # returns false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'inserting' do
|
68
|
+
before do
|
69
|
+
subject << statement
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'writes values' do
|
73
|
+
expect(subject.count).to eq 1
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'writes correct values' do
|
77
|
+
expect(subject).to have_triple statement
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# This tests an issue that may be an upstream Marmotta problem
|
82
|
+
xit 'handles large inserts (marmotta)' do
|
83
|
+
expect { subject.insert_statements(statements) }.not_to raise_error
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# This tests an issue that may be an upstream RDF.rb problem
|
88
|
+
xit 'handles large inserts (rdf.rb)' do
|
89
|
+
expect { subject << statements }.not_to raise_error
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe 'deleting' do
|
94
|
+
|
95
|
+
it 'delete triples' do
|
96
|
+
subject.delete(statement)
|
97
|
+
expect(subject.count).to eq 0
|
98
|
+
end
|
99
|
+
|
100
|
+
##
|
101
|
+
# This tests an issue that may be an upstream Marmotta problem.
|
102
|
+
# It may be the same issue as above. Could be same issue as above,
|
103
|
+
# or at least related.
|
104
|
+
xit 'deletes triples even when some are not in store' do
|
105
|
+
statement.object = RDF::Literal('Moominpapa')
|
106
|
+
subject << statement
|
107
|
+
subject.delete_statements(statements)
|
108
|
+
expect(subject.count).to eq 0
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
# describe 'Repository' do
|
114
|
+
# before do
|
115
|
+
# @repository = subject
|
116
|
+
# end
|
117
|
+
|
118
|
+
# after do
|
119
|
+
# @repository.clear
|
120
|
+
# end
|
121
|
+
|
122
|
+
# include RDF_Repository
|
123
|
+
# end
|
124
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.setup
|
3
|
+
|
4
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.color = true
|
8
|
+
config.tty = true
|
9
|
+
|
10
|
+
# Uncomment the following line to get errors and backtrace for deprecation warnings
|
11
|
+
# config.raise_errors_for_deprecations!
|
12
|
+
|
13
|
+
# Use the specified formatter
|
14
|
+
config.formatter = :progress
|
15
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdf-marmotta
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Johnson
|
@@ -127,7 +127,13 @@ email: tom@dp.la
|
|
127
127
|
executables: []
|
128
128
|
extensions: []
|
129
129
|
extra_rdoc_files: []
|
130
|
-
files:
|
130
|
+
files:
|
131
|
+
- Gemfile
|
132
|
+
- README.md
|
133
|
+
- lib/rdf/marmotta.rb
|
134
|
+
- rdf-marmotta.gemspec
|
135
|
+
- spec/marmotta_spec.rb
|
136
|
+
- spec/spec_helper.rb
|
131
137
|
homepage: https://github.com/dpla/rdf-marmotta
|
132
138
|
licenses:
|
133
139
|
- undeclared
|