From 537aea2020a7b75d5b669642c7c3d9a715316a31 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Mar 2010 17:35:34 +0100 Subject: OWL-DL export added --- lib/algorithm.rb | 28 -------- lib/dataset.rb | 16 +---- lib/owl.rb | 200 +++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 137 insertions(+), 107 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 11c619d..8083db2 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -4,18 +4,6 @@ module OpenTox module Algorithm class Fminer - include Owl - - def initialize - super - self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer') - self.title = "fminer" - self.source = "http://github.com/amaunz/libfminer" - self.parameters = { - "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" }, - "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" } - } - end def self.create_feature_dataset(params) LOGGER.debug File.basename(__FILE__) + ": creating feature dataset" @@ -29,22 +17,6 @@ module OpenTox end class Lazar - include Owl - - def initialize - super - self.uri = File.join(@@config[:services]["opentox-algorithm"],'lazar') - self.title = "lazar" - self.source = "http://github.com/helma/opentox-algorithm" - self.parameters = { - "Dataset URI" => - { :scope => "mandatory", :value => "dataset_uri" }, - "Feature URI for dependent variable" => - { :scope => "mandatory", :value => "feature_uri" }, - "Feature generation URI" => - { :scope => "mandatory", :value => "feature_generation_uri" } - } - end def self.create_model(params) LOGGER.debug params diff --git a/lib/dataset.rb b/lib/dataset.rb index 468af04..ab363a9 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,7 +3,6 @@ LOGGER.progname = File.expand_path(__FILE__) module OpenTox class Dataset - #include Owl attr_accessor :uri, :title, :source, :identifier, :data, :features, :compounds @@ -14,7 +13,6 @@ module OpenTox end def self.find(uri) - #LOGGER.debug "Getting data from #{uri}" YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s end @@ -23,19 +21,7 @@ module OpenTox LOGGER.debug "Saving dataset" @features.uniq! @compounds.uniq! - #task_uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s - uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s - #task = OpenTox::Task.find(task_uri) - #LOGGER.debug "Waiting for task #{task_uri}" - #task.wait_for_completion - #LOGGER.debug "Dataset task #{task_uri} completed" - #if task.failed? - #LOGGER.error "Saving dataset failed" - #task.failed - #exit - #end - #task.resource - uri + RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end =begin diff --git a/lib/owl.rb b/lib/owl.rb index 146bce7..05152a3 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -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 -- cgit v1.2.3