ppe-4store-ruby 0.0.3

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.
@@ -0,0 +1,15 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "ppe-4store-ruby"
3
+ s.version = "0.0.3"
4
+ s.date = "2009-10-01"
5
+ s.summary = "4Store Ruby library"
6
+ s.email = "yves@dbtune.org"
7
+ s.homepage = "http://github.com/moustaki/4store-ruby"
8
+ s.description = "A Ruby library to interact with a 4store instance (a scalable RDF store), see http://4store.org/"
9
+ s.has_rdoc = true
10
+ s.authors = ['Yves Raimond']
11
+ s.files = ["README", "4store-ruby.gemspec", "lib", "examples", "lib/4store-ruby.rb", "lib/four_store/store.rb", "lib/four_store/namespace.rb"]
12
+ #s.test_files = ["spec/activerdf_reddy_spec.rb"]
13
+ #s.rdoc_options = ["--main", "README.txt"]
14
+ #s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
15
+ end
data/README ADDED
@@ -0,0 +1,5 @@
1
+ 4store-ruby by Yves Raimond
2
+
3
+ A small Ruby library to interact with a Garlik's 4Store instance over HTTP
4
+
5
+ See examples in the examples/ directory
@@ -0,0 +1 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'four_store', 'store.rb')
@@ -0,0 +1,49 @@
1
+ module FourStore
2
+
3
+ class Namespace
4
+
5
+ @namespaces = {
6
+ 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
7
+ 'dc' => 'http://purl.org/dc/elements/1.1/',
8
+ 'foaf' => 'http://xmlns.com/foaf/0.1/',
9
+ 'rdfs' => 'http://www.w3.org/2000/01/rdf-schema#',
10
+ 'xsd' => 'http://www.w3.org/2001/XMLSchema#',
11
+ 'activ' => 'http://www.bbc.co.uk/ontologies/activity/',
12
+ 'event' => 'http://purl.org/NET/c4dm/event.owl#',
13
+ 'po' => 'http://purl.org/ontology/po/',
14
+ 'timeline' => 'http://purl.org/NET/c4dm/timeline.owl#',
15
+ 'skos' => 'http://www.w3.org/2008/05/skos#',
16
+ 'time' => 'http://www.w3.org/2006/time#',
17
+ 'mo' => 'http://purl.org/ontology/mo/',
18
+ 'dcterms' => 'http://purl.org/dc/terms/',
19
+ 'wgs84_pos' => 'http://www.w3.org/2003/01/geo/wgs84_pos#',
20
+ 'owl' => 'http://www.w3.org/2002/07/owl#'
21
+ }
22
+
23
+ def self.add(short, long)
24
+ @namespaces[short] = long
25
+ end
26
+
27
+ def self.get(short)
28
+ @namespaces[short]
29
+ end
30
+
31
+ def self.to_sparql()
32
+ sparql = ""
33
+ @namespaces.keys.each do |short|
34
+ sparql += "PREFIX #{short}: <#{@namespaces[short]}>\n"
35
+ end
36
+ sparql
37
+ end
38
+
39
+ def self.to_turtle()
40
+ turtle = ""
41
+ @namespaces.keys.each do |short|
42
+ turtle += "@prefix #{short}: <#{@namespaces[short]}>.\n"
43
+ end
44
+ turtle
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,103 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'rexml/document'
4
+ require File.expand_path(File.dirname(__FILE__)) + '/namespace'
5
+
6
+ module FourStore
7
+
8
+ class Store
9
+
10
+ def initialize(endpoint, options = nil)
11
+ raise "4Store SPARQL end-point URI must end by '/sparql/'" if endpoint.split("/sparql/").size != 1
12
+ @endpoint = URI.parse(endpoint)
13
+ @proxy = URI.parse(ENV['HTTP_PROXY']) if ENV['HTTP_PROXY']
14
+ @certificate = options["certificate"] if options
15
+ @key = options["key"] if options
16
+ @softlimit = options["soft-limit"] if options
17
+ end
18
+
19
+ def select(query)
20
+ http.start do |h|
21
+ request = Net::HTTP::Post.new(@endpoint.path)
22
+ request.set_form_data({ 'query' => Namespace::to_sparql + query, 'soft-limit' => @softlimit })
23
+ response = h.request(request)
24
+ parse_sparql_xml_results(response.body)
25
+ end
26
+ end
27
+
28
+ def set(graph, turtle)
29
+ http.start do |h|
30
+ request = Net::HTTP::Put.new(@endpoint.path + graph)
31
+ request.body = Namespace::to_turtle + turtle
32
+ request.content_type = 'application/x-turtle'
33
+ response = h.request(request)
34
+ end
35
+ end
36
+
37
+ def add(graph, turtle)
38
+ http.start do |h|
39
+ request = Net::HTTP::Post.new((@endpoint.path.split("/sparql/")[0] or "") + "/data/")
40
+ request.set_form_data({
41
+ 'graph' => graph,
42
+ 'data' => Namespace::to_turtle + turtle,
43
+ 'mime-type' => 'application/x-turtle'
44
+ })
45
+ response = h.request(request)
46
+ end
47
+ end
48
+
49
+ def delete(graph)
50
+ http.start do |h|
51
+ request = Net::HTTP::Delete.new(@endpoint.path + graph)
52
+ response = h.request(request)
53
+ end
54
+ end
55
+
56
+ def load(uri)
57
+ # WARNING - relies on the -U flag being set when running 4s-httpd
58
+ http.start do |h|
59
+ request = Net::HTTP::Post.new((@endpoint.path.split("/sparql/")[0] or "") + "/update/")
60
+ request.set_form_data({
61
+ 'update' => "LOAD <#{uri}>"
62
+ })
63
+ response = h.request(request)
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def http
70
+ if @proxy
71
+ h = Net::HTTP::Proxy(@proxy.host, @proxy.port).new(@endpoint.host, @endpoint.port)
72
+ else
73
+ h = Net::HTTP.new(@endpoint.host, @endpoint.port)
74
+ end
75
+ if @certificate && @key
76
+ require 'net/https'
77
+ h.use_ssl = true
78
+ h.cert = OpenSSL::X509::Certificate.new( File.read(@certificate) )
79
+ h.key = OpenSSL::PKey::RSA.new( File.read(@key) )
80
+ h.verify_mode = OpenSSL::SSL::VERIFY_NONE
81
+ end
82
+ h
83
+ end
84
+
85
+ def parse_sparql_xml_results(xml)
86
+ results = []
87
+ doc = REXML::Document.new xml
88
+ doc.elements.each("*/results/result") do |result|
89
+ result_hash = {}
90
+ result.elements.each do |binding|
91
+ key = binding.attributes["name"]
92
+ value = binding.elements[1].text
93
+ type = binding.elements[1].name
94
+ result_hash[key] = value
95
+ end
96
+ results.push result_hash
97
+ end
98
+ results
99
+ end
100
+
101
+ end
102
+
103
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ppe-4store-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Yves Raimond
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-01 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A Ruby library to interact with a 4store instance (a scalable RDF store), see http://4store.org/
17
+ email: yves@dbtune.org
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README
26
+ - 4store-ruby.gemspec
27
+ - lib/4store-ruby.rb
28
+ - lib/four_store/store.rb
29
+ - lib/four_store/namespace.rb
30
+ has_rdoc: true
31
+ homepage: http://github.com/moustaki/4store-ruby
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options: []
36
+
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ requirements: []
52
+
53
+ rubyforge_project:
54
+ rubygems_version: 1.3.5
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: 4Store Ruby library
58
+ test_files: []
59
+