pho 0.5 → 0.6
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.
- data/CHANGES +17 -0
- data/Rakefile +10 -2
- data/bin/talis_store +37 -92
- data/doc/rdoc/classes/Pho.html +11 -0
- data/doc/rdoc/classes/Pho/CommandLine.html +508 -0
- data/doc/rdoc/classes/Pho/DatatypeProperty.html +15 -15
- data/doc/rdoc/classes/Pho/Enrichment.html +1 -1
- data/doc/rdoc/classes/Pho/Enrichment/{ResourceEnricher.html → StoreEnricher.html} +158 -58
- data/doc/rdoc/classes/Pho/Etags.html +36 -36
- data/doc/rdoc/classes/Pho/Facet/Results.html +19 -19
- data/doc/rdoc/classes/Pho/Facet/Term.html +6 -6
- data/doc/rdoc/classes/Pho/FieldPredicateMap.html +94 -94
- data/doc/rdoc/classes/Pho/FieldWeighting.html +14 -14
- data/doc/rdoc/classes/Pho/FileManagement/AbstractFileManager.html +126 -91
- data/doc/rdoc/classes/Pho/FileManagement/FileManager.html +68 -62
- data/doc/rdoc/classes/Pho/FileManagement/RDFManager.html +22 -57
- data/doc/rdoc/classes/Pho/Job.html +68 -67
- data/doc/rdoc/classes/Pho/Jobs.html +62 -62
- data/doc/rdoc/classes/Pho/QueryProfile.html +64 -64
- data/doc/rdoc/classes/Pho/RDF.html +120 -0
- data/doc/rdoc/classes/Pho/RDF/Parser.html +277 -0
- data/doc/rdoc/classes/Pho/ResourceHash.html +1 -1
- data/doc/rdoc/classes/Pho/ResourceHash/Converter.html +48 -46
- data/doc/rdoc/classes/Pho/ResourceHash/SetAlgebra.html +15 -14
- data/doc/rdoc/classes/Pho/Snapshot.html +36 -36
- data/doc/rdoc/classes/Pho/Sparql.html +50 -0
- data/doc/rdoc/classes/Pho/Sparql/SparqlClient.html +147 -68
- data/doc/rdoc/classes/Pho/Sparql/SparqlHelper.html +195 -114
- data/doc/rdoc/classes/Pho/Status.html +26 -26
- data/doc/rdoc/classes/Pho/Store.html +271 -264
- data/doc/rdoc/classes/Pho/StoreSparqlClient.html +183 -0
- data/doc/rdoc/classes/Pho/Update.html +1 -0
- data/doc/rdoc/classes/Pho/Update/Changeset.html +69 -68
- data/doc/rdoc/classes/Pho/Update/ChangesetBuilder.html +24 -24
- data/doc/rdoc/classes/Pho/Update/Changesets.html +15 -14
- data/doc/rdoc/classes/Pho/Update/LiteralStatement.html +18 -18
- data/doc/rdoc/classes/Pho/Update/ResourceStatement.html +24 -24
- data/doc/rdoc/classes/Pho/Update/Statement.html +28 -27
- data/doc/rdoc/classes/String.html +1 -1
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/CHANGES.html +53 -1
- data/doc/rdoc/files/lib/pho/changeset_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/command_line_rb.html +101 -0
- data/doc/rdoc/files/lib/pho/converter_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/enrichment_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/file_management_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/file_manager_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/rdf_collection_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/rdf_rb.html +108 -0
- data/doc/rdoc/files/lib/pho/sparql_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/store_rb.html +8 -1
- data/doc/rdoc/files/lib/pho_rb.html +4 -2
- data/doc/rdoc/fr_class_index.html +6 -1
- data/doc/rdoc/fr_file_index.html +2 -0
- data/doc/rdoc/fr_method_index.html +192 -172
- data/examples/calais/bio.txt +7 -0
- data/examples/calais/dump.rb +17 -0
- data/examples/calais/enlighten.rb +23 -0
- data/examples/calais/output.rdf +25 -0
- data/examples/sinatra/viewer.rb +20 -0
- data/lib/pho.rb +4 -1
- data/lib/pho/changeset.rb +17 -1
- data/lib/pho/command_line.rb +166 -0
- data/lib/pho/converter.rb +8 -3
- data/lib/pho/enrichment.rb +93 -28
- data/lib/pho/file_management.rb +32 -19
- data/lib/pho/file_manager.rb +22 -26
- data/lib/pho/rdf.rb +74 -0
- data/lib/pho/rdf_collection.rb +2 -17
- data/lib/pho/sparql.rb +150 -38
- data/lib/pho/store.rb +28 -2
- data/tests/tc_contentbox.rb +41 -0
- data/tests/tc_enrichment.rb +41 -4
- data/tests/tc_file_manager.rb +97 -7
- data/tests/tc_rdf_collection.rb +25 -13
- data/tests/tc_rdf_parser.rb +37 -0
- data/tests/tc_sparql.rb +72 -2
- data/tests/tc_sparql_helper.rb +16 -0
- data/tests/ts_pho.rb +2 -1
- metadata +20 -3
data/lib/pho/file_manager.rb
CHANGED
|
@@ -6,44 +6,40 @@ module Pho
|
|
|
6
6
|
|
|
7
7
|
class FileManager < AbstractFileManager
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
attr_reader :base
|
|
10
|
+
|
|
11
|
+
def initialize(store, dir, base = nil, ok_suffix=OK, fail_suffix=FAIL, sleep=1)
|
|
10
12
|
super(store, dir, ok_suffix, fail_suffix, sleep)
|
|
13
|
+
@base = base
|
|
11
14
|
end
|
|
12
|
-
|
|
15
|
+
|
|
13
16
|
#List files being managed, i.e. everything not .ok or .fail
|
|
14
|
-
def list()
|
|
17
|
+
def list(recursive=false)
|
|
15
18
|
files = []
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
if recursive
|
|
20
|
+
pattern = "**/*"
|
|
21
|
+
else
|
|
22
|
+
pattern = "*"
|
|
23
|
+
end
|
|
24
|
+
Dir.glob( File.join(@dir, pattern) ) do |file|
|
|
25
|
+
if File.extname(file) != ".#{@ok_suffix}" && File.extname(file) != ".#{@fail_suffix}" && !File.directory?(file)
|
|
18
26
|
files << file
|
|
19
27
|
end
|
|
20
28
|
end
|
|
21
29
|
return files
|
|
22
30
|
end
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
ok_file = get_ok_file_for(file)
|
|
31
|
-
fail_file = get_fail_file_for(file)
|
|
32
|
-
if !( File.exists?(ok_file) or File.exists?(fail_file) )
|
|
33
|
-
newfiles << file
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
end
|
|
39
|
-
return newfiles
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
|
|
31
|
+
|
|
32
|
+
def FileManager.name_for_file(dir, file, base=nil)
|
|
33
|
+
uri = file.path.gsub(dir, "")
|
|
34
|
+
uri = "#{base}#{uri}" if base != nil
|
|
35
|
+
return uri
|
|
36
|
+
end
|
|
37
|
+
|
|
43
38
|
protected
|
|
44
39
|
|
|
45
40
|
def store_file(file, filename)
|
|
46
|
-
|
|
41
|
+
uri = FileManager.name_for_file(@dir, file, @base)
|
|
42
|
+
response = @store.upload_item(file, MIME::Types.type_for(filename)[0].to_s, uri )
|
|
47
43
|
if (response.status < 300 )
|
|
48
44
|
File.open(get_ok_file_for(filename), "w") do |file|
|
|
49
45
|
file.print( "OK" )
|
data/lib/pho/rdf.rb
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Pho
|
|
2
|
+
|
|
3
|
+
#Module containing general RDF utilities and classes
|
|
4
|
+
#
|
|
5
|
+
#Dependent on the redland ruby bindings
|
|
6
|
+
module RDF
|
|
7
|
+
|
|
8
|
+
begin
|
|
9
|
+
require 'rdf/redland'
|
|
10
|
+
rescue LoadError
|
|
11
|
+
$stderr.puts "WARNING: Unable to load redland-ruby bindings. Some RDF utils will be unavailable"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
#General RDF parsing utilities.
|
|
15
|
+
#
|
|
16
|
+
#Currently a convenience wrapper around the Redland Ruby bindings
|
|
17
|
+
class Parser
|
|
18
|
+
|
|
19
|
+
#Parse a file containing ntriples into RDF/XML. Returns a string
|
|
20
|
+
#
|
|
21
|
+
# file:: File object
|
|
22
|
+
# base_uri:: optional base uri to be used when parsing. If not set, then uris are resolved
|
|
23
|
+
# relative to the File
|
|
24
|
+
def Parser.parse_ntriples(file, base_uri=nil)
|
|
25
|
+
model = Redland::Model.new()
|
|
26
|
+
parser = Redland::Parser.new("ntriples", "")
|
|
27
|
+
uri = "file:#{file.path}"
|
|
28
|
+
base_uri = uri unless base_uri
|
|
29
|
+
parser.parse_into_model(model, uri, base_uri)
|
|
30
|
+
serializer = Redland::Serializer.new( "rdfxml", "application/rdf+xml" )
|
|
31
|
+
data = serializer.model_to_string(Redland::Uri.new(base_uri), model)
|
|
32
|
+
return data
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#Parse a string containing ntriples into RDF/XML. Returns a string
|
|
36
|
+
#
|
|
37
|
+
# string:: the string containing the data
|
|
38
|
+
# base_uri:: base uri for parsing the data
|
|
39
|
+
def Parser.parse_ntriples_from_string(string, base_uri)
|
|
40
|
+
model = Redland::Model.new()
|
|
41
|
+
parser = Redland::Parser.new("ntriples", "")
|
|
42
|
+
parser.parse_string_into_model(model, string, Redland::Uri.new(base_uri))
|
|
43
|
+
serializer = Redland::Serializer.new( "rdfxml", "application/rdf+xml" )
|
|
44
|
+
data = serializer.model_to_string(Redland::Uri.new(base_uri), model)
|
|
45
|
+
return data
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#Convenience method to parse an ntriples file and store it a Platform store
|
|
49
|
+
#
|
|
50
|
+
# file:: the file to parse
|
|
51
|
+
# store:: the store to receive the data
|
|
52
|
+
# base_uri:: base uri against which the data is parsed
|
|
53
|
+
# graph_name:: uri of graph in store
|
|
54
|
+
def Parser.store_ntriples(file, store, base_uri=nil, graph_name=nil)
|
|
55
|
+
data = Parser.parse_ntriples(file, base_uri)
|
|
56
|
+
return store.store_data(data, graph_name)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
#Convenience method to parse an ntriples string and store it a Platform store
|
|
60
|
+
#
|
|
61
|
+
# string:: the data to parse
|
|
62
|
+
# store:: the store to receive the data
|
|
63
|
+
# base_uri:: base uri against which the data is parsed
|
|
64
|
+
# graph_name:: uri of graph in store
|
|
65
|
+
def Parser.store_ntriples_from_string(string, store, base_uri, graph_name=nil)
|
|
66
|
+
data = Parser.parse_ntriples_from_string(string, base_uri)
|
|
67
|
+
return store.store_data(data, graph_name)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
data/lib/pho/rdf_collection.rb
CHANGED
|
@@ -14,26 +14,11 @@ module Pho
|
|
|
14
14
|
super(store, dir, ok_suffix, fail_suffix, sleep)
|
|
15
15
|
@rdf_suffix = rdf_suffix
|
|
16
16
|
end
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
|
|
19
18
|
#List files being managed
|
|
20
|
-
def list()
|
|
19
|
+
def list(recursive=false)
|
|
21
20
|
return Dir.glob( File.join(@dir, "*.#{@rdf_suffix}") )
|
|
22
21
|
end
|
|
23
|
-
|
|
24
|
-
#List any new files in the directory
|
|
25
|
-
def new_files()
|
|
26
|
-
newfiles = Array.new
|
|
27
|
-
Dir.glob( File.join(@dir, "*.#{@rdf_suffix}") ) do |file|
|
|
28
|
-
ok_file = get_ok_file_for(file)
|
|
29
|
-
fail_file = get_fail_file_for(file)
|
|
30
|
-
if !( File.exists?(ok_file) or File.exists?(fail_file) )
|
|
31
|
-
newfiles << file
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
return newfiles
|
|
35
|
-
end
|
|
36
|
-
|
|
37
22
|
|
|
38
23
|
protected
|
|
39
24
|
|
data/lib/pho/sparql.rb
CHANGED
|
@@ -7,6 +7,90 @@ module Pho
|
|
|
7
7
|
SPARQL_RESULTS_XML = "application/sparql-results+xml"
|
|
8
8
|
SPARQL_RESULTS_JSON = "application/sparql-results+json"
|
|
9
9
|
|
|
10
|
+
#Includes all statements along both in-bound and out-bound arc paths
|
|
11
|
+
#
|
|
12
|
+
#See http://n2.talis.com/wiki/Bounded_Descriptions_in_RDF
|
|
13
|
+
SYMMETRIC_BOUNDED_DESCRIPTION = <<-EOL
|
|
14
|
+
CONSTRUCT {?uri ?p ?o . ?s ?p2 ?uri .} WHERE { {?uri ?p ?o .} UNION {?s ?p2 ?uri .} }
|
|
15
|
+
EOL
|
|
16
|
+
|
|
17
|
+
#Similar to Concise Bounded Description but includes labels for referenced resources
|
|
18
|
+
#
|
|
19
|
+
#See http://n2.talis.com/wiki/Bounded_Descriptions_in_RDF
|
|
20
|
+
LABELLED_BOUNDED_DESCRIPTION = <<-EOL
|
|
21
|
+
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
|
|
22
|
+
CONSTRUCT {
|
|
23
|
+
?uri ?p ?o .
|
|
24
|
+
?o rdfs:label ?label .
|
|
25
|
+
?o rdfs:comment ?comment .
|
|
26
|
+
?o <http://www.w3.org/2004/02/skos/core#prefLabel> ?plabel .
|
|
27
|
+
?o rdfs:seeAlso ?seealso.
|
|
28
|
+
} WHERE {
|
|
29
|
+
?uri ?p ?o .
|
|
30
|
+
OPTIONAL {
|
|
31
|
+
?o rdfs:label ?label .
|
|
32
|
+
}
|
|
33
|
+
OPTIONAL {
|
|
34
|
+
?o <http://www.w3.org/2004/02/skos/core#prefLabel> ?plabel .
|
|
35
|
+
}
|
|
36
|
+
OPTIONAL {
|
|
37
|
+
?o rdfs:comment ?comment .
|
|
38
|
+
}
|
|
39
|
+
OPTIONAL {
|
|
40
|
+
?o rdfs:seeAlso ?seealso.
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
EOL
|
|
44
|
+
|
|
45
|
+
#Derived from both the Symmetric and Labelled Bounded Descriptions. Includes all in-bound
|
|
46
|
+
#and out-bound arc paths, with labels for any referenced resources.
|
|
47
|
+
#
|
|
48
|
+
#See http://n2.talis.com/wiki/Bounded_Descriptions_in_RDF
|
|
49
|
+
SYMMETRIC_LABELLED_BOUNDED_DESCRIPTION = <<-EOL
|
|
50
|
+
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
|
|
51
|
+
CONSTRUCT {
|
|
52
|
+
?uri ?p ?o .
|
|
53
|
+
?o rdfs:label ?label .
|
|
54
|
+
?o rdfs:comment ?comment .
|
|
55
|
+
?o rdfs:seeAlso ?seealso.
|
|
56
|
+
?s ?p2 ?uri .
|
|
57
|
+
?s rdfs:label ?label .
|
|
58
|
+
?s rdfs:comment ?comment .
|
|
59
|
+
?s rdfs:seeAlso ?seealso.
|
|
60
|
+
} WHERE {
|
|
61
|
+
{ ?uri ?p ?o .
|
|
62
|
+
OPTIONAL {
|
|
63
|
+
?o rdfs:label ?label .
|
|
64
|
+
}
|
|
65
|
+
OPTIONAL {
|
|
66
|
+
?o rdfs:comment ?comment .
|
|
67
|
+
}
|
|
68
|
+
OPTIONAL {
|
|
69
|
+
?o rdfs:seeAlso ?seealso.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
UNION {
|
|
73
|
+
?s ?p2 ?uri .
|
|
74
|
+
OPTIONAL {
|
|
75
|
+
?s rdfs:label ?label .
|
|
76
|
+
}
|
|
77
|
+
OPTIONAL {
|
|
78
|
+
?s rdfs:comment ?comment .
|
|
79
|
+
}
|
|
80
|
+
OPTIONAL {
|
|
81
|
+
?s rdfs:seeAlso ?seealso.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
EOL
|
|
86
|
+
|
|
87
|
+
DESCRIPTIONS = {
|
|
88
|
+
:cbd => "DESCRIBE ?uri",
|
|
89
|
+
:scbd => SYMMETRIC_BOUNDED_DESCRIPTION,
|
|
90
|
+
:lcbd => LABELLED_BOUNDED_DESCRIPTION,
|
|
91
|
+
:slcbd => SYMMETRIC_LABELLED_BOUNDED_DESCRIPTION
|
|
92
|
+
}
|
|
93
|
+
|
|
10
94
|
#A simple SPARQL client that handles the basic HTTP traffic
|
|
11
95
|
class SparqlClient
|
|
12
96
|
|
|
@@ -29,8 +113,8 @@ module Pho
|
|
|
29
113
|
|
|
30
114
|
#Initialize a client for a specific endpoint
|
|
31
115
|
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
116
|
+
#endpoint:: uri of the SPARQL endpoint
|
|
117
|
+
#client:: optionally, a reference to an existing HTTPClient object instance
|
|
34
118
|
def initialize(endpoint, client=HTTPClient.new() )
|
|
35
119
|
@endpoint = endpoint
|
|
36
120
|
@graphs = nil
|
|
@@ -59,10 +143,10 @@ module Pho
|
|
|
59
143
|
|
|
60
144
|
#Perform a sparql query
|
|
61
145
|
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
#
|
|
146
|
+
#sparql:: a valid SPARQL query
|
|
147
|
+
#format:: specific a request format. Usually a media-type, but may be a name for a type, if not using Conneg
|
|
148
|
+
#graphs:: an array of default graphs
|
|
149
|
+
#named_graphs:: an array of named graphs
|
|
66
150
|
def query(sparql, format=nil, graphs=nil, named_graphs=nil)
|
|
67
151
|
|
|
68
152
|
params = {}
|
|
@@ -94,10 +178,24 @@ module Pho
|
|
|
94
178
|
return @client.get( @endpoint, params, headers )
|
|
95
179
|
end
|
|
96
180
|
|
|
181
|
+
#Describe a uri, optionally specifying a form of bounded description
|
|
182
|
+
#
|
|
183
|
+
#uri:: the uri to describe
|
|
184
|
+
#format:: mimetype for results
|
|
185
|
+
#type:: symbol indicating type of description, i.e. +:cbd+, +:scbd+, +:lcbd+, or +:slcbd+
|
|
186
|
+
def describe_uri(uri, format="application/rdf+xml", type=:cbd)
|
|
187
|
+
template = Pho::Sparql::DESCRIPTIONS[type]
|
|
188
|
+
if template == nil
|
|
189
|
+
raise "Unknown description type"
|
|
190
|
+
end
|
|
191
|
+
query = Pho::Sparql::SparqlHelper.apply_initial_bindings(template, {"uri" => "<#{uri}>"} )
|
|
192
|
+
return describe(query, format)
|
|
193
|
+
end
|
|
194
|
+
|
|
97
195
|
#Perform a SPARQL DESCRIBE query.
|
|
98
196
|
#
|
|
99
|
-
#
|
|
100
|
-
#
|
|
197
|
+
#query:: the SPARQL query
|
|
198
|
+
#format:: the preferred response format
|
|
101
199
|
def describe(query, format="application/rdf+xml")
|
|
102
200
|
return query(query, format)
|
|
103
201
|
end
|
|
@@ -108,8 +206,8 @@ module Pho
|
|
|
108
206
|
#This will generate a query like:
|
|
109
207
|
# DESCRIBE <http://www.example.org> <http://www.example.com> ...
|
|
110
208
|
#
|
|
111
|
-
#
|
|
112
|
-
#
|
|
209
|
+
#uris:: list of the uris to be described
|
|
210
|
+
#format:: the preferred response format. Default is RDF/XML
|
|
113
211
|
def multi_describe(uris, format="application/rdf+xml")
|
|
114
212
|
query = "DESCRIBE " + uris.map {|u| "<#{u}>" }.join(" ")
|
|
115
213
|
return query(query, format)
|
|
@@ -117,24 +215,24 @@ module Pho
|
|
|
117
215
|
|
|
118
216
|
#Perform a SPARQL CONSTRUCT query.
|
|
119
217
|
#
|
|
120
|
-
#
|
|
121
|
-
#
|
|
218
|
+
#query:: the SPARQL query
|
|
219
|
+
#format:: the preferred response format
|
|
122
220
|
def construct(query, format="application/rdf+xml")
|
|
123
221
|
return query(query, format)
|
|
124
222
|
end
|
|
125
223
|
|
|
126
224
|
#Perform a SPARQL ASK query.
|
|
127
225
|
#
|
|
128
|
-
#
|
|
129
|
-
#
|
|
226
|
+
#query:: the SPARQL query
|
|
227
|
+
#format:: the preferred response format
|
|
130
228
|
def ask(query, format=Pho::Sparql::SPARQL_RESULTS_XML)
|
|
131
229
|
return query(query, format)
|
|
132
230
|
end
|
|
133
231
|
|
|
134
232
|
#Perform a SPARQL SELECT query.
|
|
135
233
|
#
|
|
136
|
-
#
|
|
137
|
-
#
|
|
234
|
+
#query:: the SPARQL query
|
|
235
|
+
#format:: the preferred response format
|
|
138
236
|
def select(query, format=Pho::Sparql::SPARQL_RESULTS_XML)
|
|
139
237
|
return query(query, format)
|
|
140
238
|
end
|
|
@@ -154,8 +252,8 @@ module Pho
|
|
|
154
252
|
#Any keys in the hash that are not in the query are ignored. Any variables not found
|
|
155
253
|
#in the hash remain unbound.
|
|
156
254
|
#
|
|
157
|
-
#
|
|
158
|
-
#
|
|
255
|
+
#query:: the query whose initial bindings are to be set
|
|
256
|
+
#values:: hash of query name to value
|
|
159
257
|
def SparqlHelper.apply_initial_bindings(query, bindings={})
|
|
160
258
|
copy = query.clone()
|
|
161
259
|
copy.gsub!(VARIABLE_MATCHER) do |pattern|
|
|
@@ -180,7 +278,7 @@ module Pho
|
|
|
180
278
|
#performed to extract some variables that can later be plugged into a subsequent
|
|
181
279
|
#query
|
|
182
280
|
#
|
|
183
|
-
#
|
|
281
|
+
#result:: hash conforming to structure of a <tt>binding</tt> in the SPARQL JSON format
|
|
184
282
|
def SparqlHelper.result_to_query_binding(result)
|
|
185
283
|
hash = {}
|
|
186
284
|
result.each_pair do |key, value|
|
|
@@ -202,10 +300,10 @@ module Pho
|
|
|
202
300
|
#into the results.
|
|
203
301
|
#
|
|
204
302
|
#E.g:
|
|
205
|
-
|
|
206
|
-
|
|
303
|
+
#<tt>results = Pho::Sparql::SparqlHelper.select(query, sparql_client)</tt>
|
|
304
|
+
#<tt>bindings = Pho::Sparql::SparqlHelper.results_to_query_bindings(results)</tt>
|
|
207
305
|
#
|
|
208
|
-
#
|
|
306
|
+
#results:: hash conforming to SPARQL SELECT structure
|
|
209
307
|
def SparqlHelper.results_to_query_bindings(results)
|
|
210
308
|
bindings = []
|
|
211
309
|
|
|
@@ -221,8 +319,8 @@ module Pho
|
|
|
221
319
|
#
|
|
222
320
|
#An error will be raised if the response is HTTP OK.
|
|
223
321
|
#
|
|
224
|
-
#
|
|
225
|
-
#
|
|
322
|
+
#query:: the SPARQL SELECT query
|
|
323
|
+
#sparql_client:: a configured SparqlClient object
|
|
226
324
|
def SparqlHelper.select(query, sparql_client)
|
|
227
325
|
#TODO: test whether endpoint supports json, and if not, switch to parsing XML
|
|
228
326
|
resp = sparql_client.select(query, Pho::Sparql::SPARQL_RESULTS_JSON)
|
|
@@ -237,8 +335,8 @@ module Pho
|
|
|
237
335
|
#Will request the results using the SPARQL JSON results format, parse the
|
|
238
336
|
#resulting JSON results, and extract the true/false response.
|
|
239
337
|
#
|
|
240
|
-
#
|
|
241
|
-
#
|
|
338
|
+
#query:: the SPARQL SELECT query
|
|
339
|
+
#sparql_client:: a configured SparqlClient object
|
|
242
340
|
def SparqlHelper.ask(query, sparql_client)
|
|
243
341
|
json = SparqlHelper.select(query, sparql_client)
|
|
244
342
|
return json["boolean"] == "true"
|
|
@@ -252,8 +350,8 @@ module Pho
|
|
|
252
350
|
#
|
|
253
351
|
#Note this will lose any type information, only the value of the bindings are returned
|
|
254
352
|
#
|
|
255
|
-
#
|
|
256
|
-
#
|
|
353
|
+
#query:: the SPARQL SELECT query
|
|
354
|
+
#sparql_client:: a configured SparqlClient object
|
|
257
355
|
def SparqlHelper.select_values(query, sparql_client)
|
|
258
356
|
results = SparqlHelper.select(query, sparql_client)
|
|
259
357
|
v = results["head"]["vars"][0];
|
|
@@ -272,8 +370,8 @@ module Pho
|
|
|
272
370
|
#
|
|
273
371
|
#Note this will lose any type information, only the value of the binding is returned
|
|
274
372
|
#
|
|
275
|
-
#
|
|
276
|
-
#
|
|
373
|
+
#query:: the SPARQL SELECT query
|
|
374
|
+
#sparql_client:: a configured SparqlClient object
|
|
277
375
|
def SparqlHelper.select_single_value(query, sparql_client)
|
|
278
376
|
results = SparqlHelper.select(query, sparql_client)
|
|
279
377
|
v = results["head"]["vars"][0];
|
|
@@ -285,8 +383,8 @@ module Pho
|
|
|
285
383
|
#Will request the results as application/json (with the expectation that it returns RDF_JSON),
|
|
286
384
|
#and parses the resulting JSON document.
|
|
287
385
|
#
|
|
288
|
-
#
|
|
289
|
-
#
|
|
386
|
+
#query:: the SPARQL SELECT query
|
|
387
|
+
#sparql_client:: a configured SparqlClient object
|
|
290
388
|
def SparqlHelper.construct_to_resource_hash(query, sparql_client)
|
|
291
389
|
#TODO: test whether endpoint supports json, and if not, switch to parsing XML
|
|
292
390
|
resp = sparql_client.construct(query, "application/json")
|
|
@@ -301,8 +399,8 @@ module Pho
|
|
|
301
399
|
#Will request the results as application/json (with the expectation that it returns RDF_JSON),
|
|
302
400
|
#and parses the resulting JSON document.
|
|
303
401
|
#
|
|
304
|
-
#
|
|
305
|
-
#
|
|
402
|
+
#query:: the SPARQL SELECT query
|
|
403
|
+
#sparql_client:: a configured SparqlClient object
|
|
306
404
|
def SparqlHelper.describe_to_resource_hash(query, sparql_client)
|
|
307
405
|
#TODO: test whether endpoint supports json, and if not, switch to parsing XML
|
|
308
406
|
resp = sparql_client.describe(query, "application/json")
|
|
@@ -311,11 +409,11 @@ module Pho
|
|
|
311
409
|
end
|
|
312
410
|
return Pho::ResourceHash::Converter.parse_json( resp.content )
|
|
313
411
|
end
|
|
314
|
-
|
|
412
|
+
|
|
315
413
|
#DESCRIBE multiple resources in a single SPARQL request
|
|
316
414
|
#
|
|
317
|
-
#
|
|
318
|
-
#
|
|
415
|
+
#uris:: an array of URIs
|
|
416
|
+
#sparql_client:: a configured SparqlClient objec
|
|
319
417
|
def SparqlHelper.multi_describe(uris, sparql_client)
|
|
320
418
|
#TODO: test whether endpoint supports json, and if not, switch to parsing XML
|
|
321
419
|
resp = sparql_client.multi_describe(uris, "application/json")
|
|
@@ -324,7 +422,21 @@ module Pho
|
|
|
324
422
|
end
|
|
325
423
|
return Pho::ResourceHash::Converter.parse_json( resp.content )
|
|
326
424
|
end
|
|
327
|
-
|
|
425
|
+
|
|
426
|
+
#Describe a single URI using one of several forms of Bounded Description
|
|
427
|
+
#See SparqlClient.describe_uri
|
|
428
|
+
#
|
|
429
|
+
#uri:: resource to describe
|
|
430
|
+
#sparql_client:: configured SPARQL client
|
|
431
|
+
#type:: form of bounded description to generate
|
|
432
|
+
def SparqlHelper.describe_uri(uri, sparql_client, type=:cbd)
|
|
433
|
+
#TODO: test whether endpoint supports json, and if not, switch to parsing XML
|
|
434
|
+
resp = sparql_client.describe_uri(uri, "application/json", type)
|
|
435
|
+
if resp.status != 200
|
|
436
|
+
raise "Error performing sparql query: #{resp.status} #{resp.reason}\n#{resp.content}"
|
|
437
|
+
end
|
|
438
|
+
return Pho::ResourceHash::Converter.parse_json( resp.content )
|
|
439
|
+
end
|
|
328
440
|
end
|
|
329
441
|
|
|
330
442
|
end
|