bel 0.3.3 → 0.4.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +53 -8
- data/bel.gemspec +10 -15
- data/bin/bel +63 -4
- data/bin/bel2rdf.rb +1 -1
- data/bin/bel_compare.rb +1 -1
- data/bin/bel_parse.rb +1 -1
- data/bin/bel_rdfschema.rb +1 -1
- data/bin/bel_summarize.rb +1 -1
- data/bin/bel_upgrade.rb +1 -1
- data/lib/bel.rb +8 -10
- data/lib/bel/completion.rb +3 -2
- data/lib/bel/completion/value_match_rule.rb +10 -0
- data/lib/bel/evidence_model/citation.rb +101 -43
- data/lib/bel/evidence_model/evidence.rb +2 -2
- data/lib/bel/evidence_model/experiment_context.rb +1 -0
- data/lib/bel/evidence_model/metadata.rb +15 -2
- data/lib/bel/evidence_model/references.rb +10 -10
- data/lib/bel/json.rb +63 -0
- data/lib/bel/json/adapter/multi_json.rb +36 -0
- data/lib/bel/json/adapter/oj.rb +65 -0
- data/lib/bel/json/adapter/ruby_json.rb +28 -0
- data/lib/bel/json/reader.rb +9 -0
- data/lib/bel/json/writer.rb +9 -0
- data/lib/bel/libbel.rb +1 -4
- data/lib/bel/parser.rb +2 -2
- data/lib/bel/rdf_repository.rb +18 -0
- data/lib/bel/rdf_repository/plugins/memory.rb +28 -0
- data/lib/bel/rdf_repository/plugins/mongo.rb +28 -0
- data/lib/bel/resource.rb +24 -0
- data/lib/bel/resource/namespace.rb +122 -0
- data/lib/bel/resource/namespace_value.rb +69 -0
- data/lib/bel/resource/namespaces.rb +83 -0
- data/lib/bel/resource/search.rb +26 -0
- data/lib/bel/resource/search/api.rb +36 -0
- data/lib/bel/resource/search/search_result.rb +32 -0
- data/lib/bel/translate.rb +108 -0
- data/lib/bel/translator.rb +69 -0
- data/lib/bel/translator/plugins/bel_script.rb +36 -0
- data/lib/bel/translator/plugins/bel_script/bel_yielder.rb +144 -0
- data/lib/bel/translator/plugins/bel_script/evidence_yielder.rb +95 -0
- data/lib/bel/translator/plugins/bel_script/translator.rb +24 -0
- data/lib/bel/translator/plugins/jgf.rb +37 -0
- data/lib/bel/translator/plugins/jgf/translator.rb +160 -0
- data/lib/bel/translator/plugins/json_evidence.rb +38 -0
- data/lib/bel/translator/plugins/json_evidence/translator.rb +90 -0
- data/lib/bel/translator/plugins/rdf.rb +48 -0
- data/lib/bel/translator/plugins/rdf/bel_schema.rb +339 -0
- data/lib/bel/translator/plugins/rdf/monkey_patch.rb +310 -0
- data/lib/bel/translator/plugins/rdf/reader.rb +173 -0
- data/lib/bel/translator/plugins/rdf/translator.rb +40 -0
- data/lib/bel/translator/plugins/rdf/writer.rb +45 -0
- data/lib/bel/translator/plugins/xbel.rb +36 -0
- data/lib/bel/translator/plugins/xbel/evidence_handler.rb +468 -0
- data/lib/bel/translator/plugins/xbel/evidence_yielder.rb +24 -0
- data/lib/bel/translator/plugins/xbel/translator.rb +24 -0
- data/lib/bel/translator/plugins/xbel/xbel_yielder.rb +414 -0
- data/lib/bel/vendor/little-plugger.rb +323 -0
- data/lib/bel/version.rb +1 -1
- metadata +44 -158
- data/lib/bel/extension.rb +0 -37
- data/lib/bel/extension_format.rb +0 -207
- data/lib/bel/extensions/bel.rb +0 -258
- data/lib/bel/extensions/jgf.rb +0 -219
- data/lib/bel/extensions/json/jrjackson.rb +0 -31
- data/lib/bel/extensions/json/json.rb +0 -133
- data/lib/bel/extensions/json/multi_json.rb +0 -29
- data/lib/bel/extensions/json/oj.rb +0 -68
- data/lib/bel/extensions/json/ruby_json.rb +0 -29
- data/lib/bel/extensions/rdf/bel_rdf.rb +0 -338
- data/lib/bel/extensions/rdf/rdf.rb +0 -584
- data/lib/bel/extensions/xbel.rb +0 -923
- data/lib/bel/format.rb +0 -58
@@ -0,0 +1,310 @@
|
|
1
|
+
module BEL::Translator::Plugins
|
2
|
+
|
3
|
+
module Rdf
|
4
|
+
|
5
|
+
# OpenClass to contribute RDF functionality to BEL Model.
|
6
|
+
class ::BEL::Namespace::NamespaceDefinition
|
7
|
+
|
8
|
+
def to_uri
|
9
|
+
@rdf_uri
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_rdf_vocabulary
|
13
|
+
::RDF::Vocabulary.new("#{@rdf_uri}/")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class ::BEL::Model::Parameter
|
18
|
+
|
19
|
+
def to_uri
|
20
|
+
@ns.to_rdf_vocabulary[URI::encode(@value)]
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_rdf
|
24
|
+
uri = to_uri
|
25
|
+
encodings = ['A'].concat(@enc.to_s.each_char.to_a).uniq
|
26
|
+
if block_given?
|
27
|
+
encodings.map { |enc| concept_statement(enc, uri) }.each do |stmt|
|
28
|
+
yield stmt
|
29
|
+
end
|
30
|
+
else
|
31
|
+
encodings.map { |enc| concept_statement(enc, uri)}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def concept_statement(encoding_character, uri)
|
38
|
+
case encoding_character
|
39
|
+
when 'G'
|
40
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.GeneConcept)
|
41
|
+
when 'R'
|
42
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.RNAConcept)
|
43
|
+
when 'P'
|
44
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.ProteinConcept)
|
45
|
+
when 'M'
|
46
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.MicroRNAConcept)
|
47
|
+
when 'C'
|
48
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.ComplexConcept)
|
49
|
+
when 'B'
|
50
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.BiologicalProcessConcept)
|
51
|
+
when 'A'
|
52
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.AbundanceConcept)
|
53
|
+
when 'O'
|
54
|
+
::RDF::Statement(uri, ::RDF.type, BEL::RDF::BELV.PathologyConcept)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class ::BEL::Model::Term
|
60
|
+
|
61
|
+
def to_uri
|
62
|
+
tid = to_s.squeeze(')').gsub(/[")\[\]]/, '').gsub(/[(:, ]/, '_')
|
63
|
+
BEL::RDF::BELR[URI::encode(tid)]
|
64
|
+
end
|
65
|
+
|
66
|
+
def rdf_type
|
67
|
+
if respond_to? 'fx'
|
68
|
+
fx = @fx.respond_to?(:short_form) ? @fx.short_form : @fx.to_s.to_sym
|
69
|
+
if [:p, :proteinAbundance].include?(fx) &&
|
70
|
+
@arguments.find{ |x|
|
71
|
+
if x.is_a? ::BEL::Model::Term
|
72
|
+
arg_fx = x.fx
|
73
|
+
arg_fx = arg_fx.respond_to?(:short_form) ? arg_fx.short_form : arg_fx.to_s.to_sym
|
74
|
+
[:pmod, :proteinModification].include?(arg_fx)
|
75
|
+
else
|
76
|
+
false
|
77
|
+
end
|
78
|
+
}
|
79
|
+
|
80
|
+
return BEL::RDF::BELV.ModifiedProteinAbundance
|
81
|
+
end
|
82
|
+
|
83
|
+
if [:p, :proteinAbundance].include?(fx) &&
|
84
|
+
@arguments.find{ |x|
|
85
|
+
if x.is_a? ::BEL::Model::Term
|
86
|
+
arg_fx = x.fx
|
87
|
+
arg_fx = arg_fx.respond_to?(:short_form) ? arg_fx.short_form : arg_fx.to_s.to_sym
|
88
|
+
BEL::RDF::PROTEIN_VARIANT.include?(arg_fx)
|
89
|
+
else
|
90
|
+
false
|
91
|
+
end
|
92
|
+
}
|
93
|
+
|
94
|
+
return BEL::RDF::BELV.ProteinVariantAbundance
|
95
|
+
end
|
96
|
+
|
97
|
+
BEL::RDF::FUNCTION_TYPE[fx] || BEL::RDF::BELV.Abundance
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def to_rdf
|
102
|
+
uri = to_uri
|
103
|
+
statements = []
|
104
|
+
|
105
|
+
# rdf:type
|
106
|
+
type = rdf_type
|
107
|
+
statements << [uri, BEL::RDF::RDF.type, BEL::RDF::BELV.Term]
|
108
|
+
statements << [uri, BEL::RDF::RDF.type, type]
|
109
|
+
fx = @fx.respond_to?(:short_form) ? @fx.short_form : @fx.to_s.to_sym
|
110
|
+
if BEL::RDF::ACTIVITY_TYPE.include? fx
|
111
|
+
statements << [uri, BEL::RDF::BELV.hasActivityType, BEL::RDF::ACTIVITY_TYPE[fx]]
|
112
|
+
end
|
113
|
+
|
114
|
+
# rdfs:label
|
115
|
+
statements << [uri, BEL::RDF::RDFS.label, to_s.force_encoding('UTF-8')]
|
116
|
+
|
117
|
+
# special proteins (does not recurse into pmod)
|
118
|
+
if [:p, :proteinAbundance].include?(fx)
|
119
|
+
pmod =
|
120
|
+
@arguments.find{ |x|
|
121
|
+
if x.is_a? ::BEL::Model::Term
|
122
|
+
arg_fx = x.fx
|
123
|
+
arg_fx = arg_fx.respond_to?(:short_form) ? arg_fx.short_form : arg_fx.to_s.to_sym
|
124
|
+
[:pmod, :proteinModification].include?(arg_fx)
|
125
|
+
else
|
126
|
+
false
|
127
|
+
end
|
128
|
+
}
|
129
|
+
if pmod
|
130
|
+
mod_string = pmod.arguments.map(&:to_s).join(',')
|
131
|
+
mod_type = BEL::RDF::MODIFICATION_TYPE.find {|k,v| mod_string.start_with? k}
|
132
|
+
mod_type = (mod_type ? mod_type[1] : BEL::RDF::BELV.Modification)
|
133
|
+
statements << [uri, BEL::RDF::BELV.hasModificationType, mod_type]
|
134
|
+
last = pmod.arguments.last.to_s
|
135
|
+
if last.match(/^\d+$/)
|
136
|
+
statements << [uri, BEL::RDF::BELV.hasModificationPosition, last.to_i]
|
137
|
+
end
|
138
|
+
# link root protein abundance as hasChild
|
139
|
+
root_param = @arguments.find{|x| x.is_a? ::BEL::Model::Parameter}
|
140
|
+
(root_id, root_statements) = ::BEL::Model::Term.new(:p, [root_param]).to_rdf
|
141
|
+
statements << [uri, BEL::RDF::BELV.hasChild, root_id]
|
142
|
+
statements += root_statements
|
143
|
+
return [uri, statements]
|
144
|
+
elsif @arguments.find{|x| x.is_a? ::BEL::Model::Term and BEL::RDF::PROTEIN_VARIANT.include? x.fx}
|
145
|
+
# link root protein abundance as hasChild
|
146
|
+
root_param = @arguments.find{|x| x.is_a? ::BEL::Model::Parameter}
|
147
|
+
(root_id, root_statements) = ::BEL::Model::Term.new(:p, [root_param]).to_rdf
|
148
|
+
statements << [uri, BEL::RDF::BELV.hasChild, root_id]
|
149
|
+
statements += root_statements
|
150
|
+
return [uri, statements]
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# BEL::RDF::BELV.hasConcept]
|
155
|
+
@arguments.find_all{ |x|
|
156
|
+
x.is_a? ::BEL::Model::Parameter and x.ns != nil
|
157
|
+
}.each do |param|
|
158
|
+
concept_uri = param.ns.to_rdf_vocabulary[param.value.to_s]
|
159
|
+
statements << [uri, BEL::RDF::BELV.hasConcept, BEL::RDF::RDF::URI(Addressable::URI.encode(concept_uri))]
|
160
|
+
end
|
161
|
+
|
162
|
+
# BEL::RDF::BELV.hasChild]
|
163
|
+
@arguments.find_all{|x| x.is_a? ::BEL::Model::Term}.each do |child|
|
164
|
+
(child_id, child_statements) = child.to_rdf
|
165
|
+
statements << [uri, BEL::RDF::BELV.hasChild, child_id]
|
166
|
+
statements += child_statements
|
167
|
+
end
|
168
|
+
|
169
|
+
return [uri, statements]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
class ::BEL::Model::Statement
|
174
|
+
|
175
|
+
def to_uri
|
176
|
+
case
|
177
|
+
when subject_only?
|
178
|
+
tid = @subject.to_s.squeeze(')').gsub(/[")\[\]]/, '').gsub(/[(:, ]/, '_')
|
179
|
+
BEL::RDF::BELR[URI::encode(tid)]
|
180
|
+
when simple?
|
181
|
+
sub_id = @subject.to_s.squeeze(')').gsub(/[")\[\]]/, '').gsub(/[(:, ]/, '_')
|
182
|
+
obj_id = @object.to_s.squeeze(')').gsub(/[")\[\]]/, '').gsub(/[(:, ]/, '_')
|
183
|
+
rel = BEL::RDF::RELATIONSHIP_TYPE[@relationship.to_s]
|
184
|
+
if rel
|
185
|
+
rel = rel.path.split('/')[-1]
|
186
|
+
else
|
187
|
+
rel = @relationship.to_s
|
188
|
+
end
|
189
|
+
BEL::RDF::BELR[URI::encode("#{sub_id}_#{rel}_#{obj_id}")]
|
190
|
+
when nested?
|
191
|
+
sub_id = @subject.to_s.squeeze(')').gsub(/[")\[\]]/, '').gsub(/[(:, ]/, '_')
|
192
|
+
nsub_id = @object.subject.to_s.squeeze(')').gsub(/[")\[\]]/, '').gsub(/[(:, ]/, '_')
|
193
|
+
nobj_id = @object.object.to_s.squeeze(')').gsub(/[")\[\]]/, '').gsub(/[(:, ]/, '_')
|
194
|
+
rel = BEL::RDF::RELATIONSHIP_TYPE[@relationship.to_s]
|
195
|
+
if rel
|
196
|
+
rel = rel.path.split('/')[-1]
|
197
|
+
else
|
198
|
+
rel = @relationship.to_s
|
199
|
+
end
|
200
|
+
nrel = BEL::RDF::RELATIONSHIP_TYPE[@object.relationship.to_s]
|
201
|
+
if nrel
|
202
|
+
nrel = nrel.path.split('/')[-1]
|
203
|
+
else
|
204
|
+
nrel = @object.relationship.to_s
|
205
|
+
end
|
206
|
+
BEL::RDF::BELR[URI::encode("#{sub_id}_#{rel}_#{nsub_id}_#{nrel}_#{nobj_id}")]
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def to_rdf
|
211
|
+
uri = to_uri
|
212
|
+
statements = []
|
213
|
+
|
214
|
+
case
|
215
|
+
when subject_only?
|
216
|
+
(sub_uri, sub_statements) = @subject.to_rdf
|
217
|
+
statements << [uri, BEL::RDF::BELV.hasSubject, sub_uri]
|
218
|
+
statements += sub_statements
|
219
|
+
when simple?
|
220
|
+
(sub_uri, sub_statements) = @subject.to_rdf
|
221
|
+
statements += sub_statements
|
222
|
+
|
223
|
+
(obj_uri, obj_statements) = @object.to_rdf
|
224
|
+
statements += obj_statements
|
225
|
+
|
226
|
+
rel = BEL::RDF::RELATIONSHIP_TYPE[@relationship.to_s]
|
227
|
+
statements << [uri, BEL::RDF::BELV.hasSubject, sub_uri]
|
228
|
+
statements << [uri, BEL::RDF::BELV.hasObject, obj_uri]
|
229
|
+
statements << [uri, BEL::RDF::BELV.hasRelationship, rel]
|
230
|
+
when nested?
|
231
|
+
(sub_uri, sub_statements) = @subject.to_rdf
|
232
|
+
(nsub_uri, nsub_statements) = @object.subject.to_rdf
|
233
|
+
(nobj_uri, nobj_statements) = @object.object.to_rdf
|
234
|
+
statements += sub_statements
|
235
|
+
statements += nsub_statements
|
236
|
+
statements += nobj_statements
|
237
|
+
rel = BEL::RDF::RELATIONSHIP_TYPE[@relationship.to_s]
|
238
|
+
nrel = BEL::RDF::RELATIONSHIP_TYPE[@object.relationship.to_s]
|
239
|
+
nuri = BEL::RDF::BELR["#{strip_prefix(nsub_uri)}_#{nrel}_#{strip_prefix(nobj_uri)}"]
|
240
|
+
|
241
|
+
# inner
|
242
|
+
statements << [nuri, BEL::RDF::BELV.hasSubject, nsub_uri]
|
243
|
+
statements << [nuri, BEL::RDF::BELV.hasObject, nobj_uri]
|
244
|
+
statements << [nuri, BEL::RDF::BELV.hasRelationship, nrel]
|
245
|
+
|
246
|
+
# outer
|
247
|
+
statements << [uri, BEL::RDF::BELV.hasSubject, sub_uri]
|
248
|
+
statements << [uri, BEL::RDF::BELV.hasObject, nuri]
|
249
|
+
statements << [uri, BEL::RDF::BELV.hasRelationship, rel]
|
250
|
+
end
|
251
|
+
|
252
|
+
# common statement triples
|
253
|
+
statements << [uri, BEL::RDF::RDF.type, BEL::RDF::BELV.Statement]
|
254
|
+
statements << [uri, ::RDF::RDFS.label, to_s.force_encoding('UTF-8')]
|
255
|
+
|
256
|
+
# evidence
|
257
|
+
evidence_bnode = BEL::RDF::RDF::Node.uuid
|
258
|
+
statements << [evidence_bnode, BEL::RDF::RDF.type, BEL::RDF::BELV.Evidence]
|
259
|
+
statements << [uri, BEL::RDF::BELV.hasEvidence, evidence_bnode]
|
260
|
+
statements << [evidence_bnode, BEL::RDF::BELV.hasStatement, uri]
|
261
|
+
|
262
|
+
# citation
|
263
|
+
citation = @annotations.delete('Citation')
|
264
|
+
if citation
|
265
|
+
value = citation.value.map{|x| x.gsub('"', '')}
|
266
|
+
if citation and value[0] == 'PubMed'
|
267
|
+
pid = value[2]
|
268
|
+
statements << [
|
269
|
+
evidence_bnode,
|
270
|
+
BEL::RDF::BELV.hasCitation,
|
271
|
+
BEL::RDF::RDF::URI(BEL::RDF::PUBMED[pid])
|
272
|
+
]
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
# evidence
|
277
|
+
evidence_text = @annotations.delete('Evidence')
|
278
|
+
if evidence_text
|
279
|
+
value = evidence_text.value.gsub('"', '').force_encoding('UTF-8')
|
280
|
+
statements << [evidence_bnode, BEL::RDF::BELV.hasEvidenceText, value]
|
281
|
+
end
|
282
|
+
|
283
|
+
# annotations
|
284
|
+
@annotations.each do |name, anno|
|
285
|
+
name = anno.name.gsub('"', '')
|
286
|
+
|
287
|
+
if BEL::RDF::const_defined? name
|
288
|
+
annotation_scheme = BEL::RDF::const_get name
|
289
|
+
[anno.value].flatten.map{|x| x.gsub('"', '')}.each do |val|
|
290
|
+
value_uri = BEL::RDF::RDF::URI(Addressable::URI.encode(annotation_scheme[val.to_s]))
|
291
|
+
statements << [evidence_bnode, BEL::RDF::BELV.hasAnnotation, value_uri]
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
return [uri, statements]
|
297
|
+
end
|
298
|
+
|
299
|
+
private
|
300
|
+
|
301
|
+
def strip_prefix(uri)
|
302
|
+
if uri.to_s.start_with? 'http://www.openbel.org/bel/'
|
303
|
+
uri.to_s[28..-1]
|
304
|
+
else
|
305
|
+
uri
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
module BEL::Translator::Plugins
|
2
|
+
|
3
|
+
module Rdf::Reader
|
4
|
+
|
5
|
+
module EvidenceYielder
|
6
|
+
|
7
|
+
BELV = Rdf::BEL::RDF::BELV
|
8
|
+
|
9
|
+
include ::BEL::Model
|
10
|
+
include ::BEL::Quoting
|
11
|
+
|
12
|
+
# Find described resources by +type+ in +graph+.
|
13
|
+
#
|
14
|
+
# @param [::RDF::Resource] type the RDF type to find instances for
|
15
|
+
# @param [::RDF::Graph] graph the RDF graph to query
|
16
|
+
# @return [Enumerator] an enumerator of described resource instances
|
17
|
+
def resources_of_type(type, graph)
|
18
|
+
graph.query([nil, ::RDF.type, type])
|
19
|
+
.lazy
|
20
|
+
.map { |rdf_statement|
|
21
|
+
describe(rdf_statement.subject, graph)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
# Describes an RDF +resource+ contained within +graph+. Describing an RDF
|
26
|
+
# resource will retrieve the neighborhood of RDF statements with
|
27
|
+
# +resource+ in the subject position.
|
28
|
+
#
|
29
|
+
# @param [::RDF::Resource] resource the RDF resource to describe
|
30
|
+
# @param [::RDF::Graph] graph the RDF graph to query
|
31
|
+
# @return [Hash] a hash of predicate to object in the
|
32
|
+
# neighborhood of +resource+
|
33
|
+
def describe(resource, graph)
|
34
|
+
graph.query([resource, nil, nil]).reduce({}) { |hash, statement|
|
35
|
+
hash[statement.predicate] = statement.object
|
36
|
+
hash
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
# Iterate the {BELV.Evidence} predicated statements, from the
|
41
|
+
# {::RDF::Graph graph}, and yield those correspdonding {Evidence}
|
42
|
+
# objects.
|
43
|
+
#
|
44
|
+
# @param [::RDF::Graph] graph the RDF graph to query
|
45
|
+
# @yield [evidence_model] yields an {Evidence} object
|
46
|
+
def evidence_yielder(graph)
|
47
|
+
resources_of_type(BELV.Evidence, graph).each do |evidence|
|
48
|
+
|
49
|
+
yield make_evidence(evidence, graph)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Create an {Evidence} object from RDF statements found in
|
54
|
+
# the {::RDF::Graph graph}.
|
55
|
+
#
|
56
|
+
# @param [Hash] evidence a hash of predicate to object
|
57
|
+
# representing the described evidence
|
58
|
+
# @param [::RDF::Graph] graph the RDF graph to query
|
59
|
+
# @return [Evidence] the evidence model
|
60
|
+
def make_evidence(evidence, graph)
|
61
|
+
statement = describe(evidence[BELV.hasStatement], graph)
|
62
|
+
|
63
|
+
# values
|
64
|
+
bel_statement = statement[::RDF::RDFS.label].value
|
65
|
+
ev_text = evidence[BELV.hasEvidenceText]
|
66
|
+
citation = evidence[BELV.hasCitation]
|
67
|
+
|
68
|
+
# model
|
69
|
+
ev_model = Evidence.new
|
70
|
+
ev_model.bel_statement = ::BEL::Script.parse(bel_statement)
|
71
|
+
.find { |obj|
|
72
|
+
obj.is_a? Statement
|
73
|
+
}
|
74
|
+
ev_model.summary_text = SummaryText.new(ev_text.value) if ev_text
|
75
|
+
|
76
|
+
if citation.respond_to?(:value)
|
77
|
+
ev_model.citation =
|
78
|
+
case citation.value
|
79
|
+
when /pubmed:(\d+)$/
|
80
|
+
pubmed_id = $1.to_i
|
81
|
+
Citation.new({
|
82
|
+
:type => 'PubMed',
|
83
|
+
:id => pubmed_id,
|
84
|
+
:name => "PubMed Citation - #{pubmed_id}"
|
85
|
+
})
|
86
|
+
else
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
ev_model
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class BufferedEvidenceYielder
|
96
|
+
|
97
|
+
include EvidenceYielder
|
98
|
+
|
99
|
+
def initialize(data, format = :ntriples)
|
100
|
+
@data = data
|
101
|
+
@format = format
|
102
|
+
end
|
103
|
+
|
104
|
+
def each
|
105
|
+
if block_given?
|
106
|
+
graph = RUBYRDF::Graph.new
|
107
|
+
RUBYRDF::Reader.for(@format).new(@data) do |reader|
|
108
|
+
reader.each_statement do |statement|
|
109
|
+
graph << statement
|
110
|
+
end
|
111
|
+
end
|
112
|
+
evidence_yielder(graph) do |evidence_model|
|
113
|
+
yield evidence_model
|
114
|
+
end
|
115
|
+
else
|
116
|
+
to_enum(:each)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class UnbufferedEvidenceYielder
|
122
|
+
|
123
|
+
include EvidenceYielder
|
124
|
+
|
125
|
+
def initialize(data, format = :ntriples)
|
126
|
+
@data = data
|
127
|
+
@format = format
|
128
|
+
end
|
129
|
+
|
130
|
+
def each
|
131
|
+
if block_given?
|
132
|
+
graph = RUBYRDF::Graph.new
|
133
|
+
evidence_resource = nil
|
134
|
+
RUBYRDF::Reader.for(@format).new(@data) do |reader|
|
135
|
+
reader.each_statement do |statement|
|
136
|
+
case
|
137
|
+
when statement.object == BELV.Evidence &&
|
138
|
+
statement.predicate == RUBYRDF.type
|
139
|
+
evidence_resource = statement.subject
|
140
|
+
when evidence_resource &&
|
141
|
+
statement.predicate != BELV.hasEvidence &&
|
142
|
+
statement.subject != evidence_resource
|
143
|
+
|
144
|
+
# yield current graph as evidence model
|
145
|
+
yield make_evidence(
|
146
|
+
describe(evidence_resource, graph),
|
147
|
+
graph
|
148
|
+
)
|
149
|
+
|
150
|
+
# reset parse state
|
151
|
+
graph.clear
|
152
|
+
evidence_resource = nil
|
153
|
+
|
154
|
+
# insert this RDF statement
|
155
|
+
graph << statement
|
156
|
+
else
|
157
|
+
graph << statement
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# yield last graph as evidence model
|
163
|
+
yield make_evidence(
|
164
|
+
describe(evidence_resource, graph),
|
165
|
+
graph
|
166
|
+
)
|
167
|
+
else
|
168
|
+
to_enum(:each)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|