diff options
author | Christoph Helma <helma@in-silico.de> | 2010-03-16 17:35:34 +0100 |
---|---|---|
committer | Christoph Helma <helma@in-silico.de> | 2010-03-16 17:35:34 +0100 |
commit | 537aea2020a7b75d5b669642c7c3d9a715316a31 (patch) | |
tree | 49ca384c98616a62ded932c70a9231c825a3c190 /lib/owl.rb | |
parent | 1c9b874b8db1a2ae27fd97137d7a014188531bc1 (diff) |
OWL-DL export added
Diffstat (limited to 'lib/owl.rb')
-rw-r--r-- | lib/owl.rb | 200 |
1 files changed, 136 insertions, 64 deletions
@@ -1,31 +1,132 @@ module OpenTox - module Owl + class Owl - attr_reader :uri + attr_reader :uri, :ot_class - def initialize - - @model = Redland::Model.new Redland::MemoryStore.new - @parser = Redland::Parser.new - #@serializer = Redland::Serializer.ntriples + def initialize(ot_class,uri) # read OT Ontology #@parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") #@parser.parse_string_into_model(@model,File.read(File.join(File.dirname(__FILE__),"opentox.owl")),'/') - # reate an anonymous resource for metadata - # this has to be rewritten with an URI as soon as the resource has been saved at an definitive location - tmp = @model.create_resource - @model.add tmp, RDF['type'], OT[self.owl_class] + + @model = Redland::Model.new Redland::MemoryStore.new + @parser = Redland::Parser.new + @ot_class = ot_class + @uri = Redland::Uri.new(uri.chomp) + @model.add @uri, RDF['type'], OT[@ot_class] + + end + + def method_missing(name, *args) + methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariable'] + if methods.include? name.to_s.sub(/=/,'') + if /=/ =~ name.to_s # setter + name = name.to_s.sub(/=/,'') + begin # delete existing entry + t = @model.object(@uri, DC[name]) + @model.delete @uri, DC[name], t + rescue + end + @model.add @uri, DC[name], args.first + else # getter + @model.object(@uri, DC['title']).to_s + end + else + raise "Method '#{name.to_s}' not found." + end + end + + def parameters=(params) + params.each do |name, settings| + parameter = @model.create_resource + @model.add parameter, RDF['type'], OT['Parameter'] + @model.add parameter, DC['title'], name + @model.add parameter, OT['paramScope'], settings[:scope] + @model.add parameter, OT['paramValue'], settings[:value] + end + end + + def add_data_entries(compound_uri,features) + # add compound + compound = @model.subject(DC["identifier"], compound_uri) + if compound.nil? + compound = @model.create_resource(compound_uri) + @model.add compound, RDF['type'], OT["Compound"] + @model.add compound, DC["identifier"], compound_uri + end + features.each do |f| + f.each do |feature_uri,value| + # add feature + feature = find_or_create_feature feature_uri + if value.class.to_s == 'Hash' + # create tuple + tuple = @model.create_resource + @model.add tuple, RDF['type'], OT["Tuple"] + @model.add tuple, OT['feature'], feature + value.each do |uri,v| + f = find_or_create_feature uri + complex_value = @model.create_resource + @model.add tuple, OT['complexValue'], complex_value + @model.add complex_value, RDF['type'], OT["FeatureValue"] + @model.add complex_value, OT['feature'], f + @model.add complex_value, OT['value'], v.to_s + end + # add data entry + data_entry = @model.subject OT['compound'], compound + if data_entry.nil? + data_entry = @model.create_resource + @model.add @uri, OT['dataEntry'], data_entry + @model.add data_entry, RDF['type'], OT["DataEntry"] + @model.add data_entry, OT['compound'], compound + end + @model.add data_entry, OT['values'], tuple + else + data_entry = @model.subject OT['compound'], compound + if data_entry.nil? + data_entry = @model.create_resource + @model.add @uri, OT['dataEntry'], data_entry + @model.add data_entry, RDF['type'], OT["DataEntry"] + @model.add data_entry, OT['compound'], compound + end + values = @model.create_resource + @model.add data_entry, OT['values'], values + @model.add values, RDF['type'], OT['FeatureValue'] + @model.add values, OT['feature'], feature + @model.add values, OT['value'], value.to_s + end + end + end + end + + def find_or_create_feature(feature_uri) + feature = @model.subject(DC["identifier"], feature_uri) + if feature.nil? + feature = @model.create_resource(feature_uri) + @model.add feature, RDF['type'], OT["Feature"] + @model.add feature, DC["identifier"], feature_uri + @model.add feature, DC["title"], File.basename(feature_uri).split(/#/)[1] + @model.add feature, DC['source'], feature_uri + end + feature + end + + def rdf + @model.to_string + end + +=begin + + def to_ntriples + @serializer.model_to_string(Redland::Uri.new(@uri), @model) end def uri=(uri) @uri = uri.chomp - uri = Redland::Uri.new(uri) # rewrite uri - @model.subjects(RDF['type'],OT[self.owl_class]).each do |me| - @model.delete(me,RDF['type'],OT[self.owl_class]) - @model.add(uri,RDF['type'],OT[self.owl_class]) + @model.subjects(RDF['type'],OT[@ot_class]).each do |me| + @model.delete(me,RDF['type'],OT[@ot_class]) + @model.add(uri,RDF['type'],OT[@ot_class]) id = @model.object(me, DC['identifier']) @model.delete me, DC['identifier'], id # find/replace metadata @@ -37,17 +138,18 @@ module OpenTox end end - def title - # I have no idea, why 2 subjects are returned - # iterating over all subjects leads to memory allocation problems - # SPARQL queries also do not work - #me = @model.subjects(RDF['type'],OT[self.owl_class])[1] - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['title']).to_s + def read(uri) + @parser.parse_into_model(@model,uri) + @uri = uri + end + + def identifier + me = @model.subject(RDF['type'],OT[@ot_class]) + @model.object(me, DC['identifier']).to_s unless me.nil? end def title=(title) - me = @model.subject(RDF['type'],OT[self.owl_class]) + me = @model.subject(RDF['type'],OT[@ot_class]) begin t = @model.object(me, DC['title']) @model.delete me, DC['title'], t @@ -56,13 +158,8 @@ module OpenTox @model.add me, DC['title'], title end - def source - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['source']).to_s unless me.nil? - end - def source=(source) - me = @model.subject(RDF['type'],OT[self.owl_class]) + me = @model.subject(RDF['type'],OT[@ot_class]) begin t = @model.object(me, DC['source']) @model.delete me, DC['source'], t @@ -71,44 +168,19 @@ module OpenTox @model.add me, DC['source'], source end - def identifier - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['identifier']).to_s unless me.nil? - end - - def owl_class - self.class.to_s.sub(/^OpenTox::/,'').sub(/::.*$/,'') - end - - def read(uri) - @parser.parse_into_model(@model,uri) - @uri = uri - end - - def rdf=(rdf) - @uri = '/' unless @uri - @parser.parse_string_into_model(@model,rdf,@uri) - end - - def rdf - @model.to_string - end - - def to_ntriples - @serializer.model_to_string(Redland::Uri.new(@uri), @model) + def title + # I have no idea, why 2 subjects are returned + # iterating over all subjects leads to memory allocation problems + # SPARQL queries also do not work + #me = @model.subjects(RDF['type'],OT[@ot_class])[1] + me = @model.subject(RDF['type'],OT[@ot_class]) + @model.object(me, DC['title']).to_s end - def parameters=(params) - params.each do |name, settings| - parameter = @model.create_resource - @model.add parameter, RDF['type'], OT['Parameter'] - @model.add parameter, DC['title'], name - @model.add parameter, OT['paramScope'], settings[:scope] - @model.add parameter, OT['paramValue'], settings[:value] - end + def source + me = @model.subject(RDF['type'],OT[@ot_class]) + @model.object(me, DC['source']).to_s unless me.nil? end - -=begin def create_owl_statement(name,value) r = @model.create_resource dc_class = DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter |