bio-publisci 0.0.8 → 0.1.0

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.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -0
  3. data/Rakefile +1 -1
  4. data/bin/bio-publisci-server +50 -0
  5. data/features/reader_steps.rb +1 -1
  6. data/lib/bio-publisci.rb +11 -2
  7. data/lib/bio-publisci/datacube_model.rb +92 -88
  8. data/lib/bio-publisci/dataset/ORM/data_cube_orm.rb +0 -1
  9. data/lib/bio-publisci/dataset/data_cube.rb +78 -44
  10. data/lib/bio-publisci/dataset/dataset_for.rb +26 -27
  11. data/lib/bio-publisci/metadata/metadata_model.rb +21 -23
  12. data/lib/bio-publisci/metadata/prov/model/prov_models.rb +5 -5
  13. data/lib/bio-publisci/output.rb +1 -1
  14. data/lib/bio-publisci/parser.rb +130 -12
  15. data/lib/bio-publisci/post_processor.rb +95 -0
  16. data/lib/bio-publisci/query/query_helper.rb +13 -8
  17. data/lib/bio-publisci/readers/arff.rb +1 -1
  18. data/lib/bio-publisci/readers/base.rb +57 -0
  19. data/lib/bio-publisci/readers/csv.rb +2 -5
  20. data/lib/bio-publisci/readers/dataframe.rb +2 -2
  21. data/lib/bio-publisci/readers/maf.rb +199 -0
  22. data/lib/bio-publisci/readers/r_cross.rb +6 -10
  23. data/lib/bio-publisci/readers/r_matrix.rb +1 -1
  24. data/lib/bio-publisci/writers/base.rb +16 -0
  25. data/lib/bio-publisci/writers/json.rb +18 -0
  26. data/resources/maf_example.maf +10 -0
  27. data/resources/maf_rdf.ttl +1173 -0
  28. data/resources/primer.ttl +38 -0
  29. data/resources/queries/gene.rq +16 -0
  30. data/resources/queries/hugo_to_ensembl.rq +7 -0
  31. data/resources/queries/maf_column.rq +26 -0
  32. data/resources/queries/patient.rq +11 -0
  33. data/resources/queries/patient_list.rq +11 -0
  34. data/resources/queries/patients_with_mutation.rq +18 -0
  35. data/scripts/get_gene_lengths.rb +50 -0
  36. data/scripts/islet_mlratio.rb +1 -1
  37. data/scripts/scan_islet.rb +1 -1
  38. data/scripts/update_reference.rb +8 -3
  39. data/server/helpers.rb +215 -0
  40. data/server/public/src-min-noconflict/LICENSE +24 -0
  41. data/server/public/src-min-noconflict/ace.js +11 -0
  42. data/server/public/src-min-noconflict/ext-chromevox.js +1 -0
  43. data/server/public/src-min-noconflict/ext-elastic_tabstops_lite.js +1 -0
  44. data/server/public/src-min-noconflict/ext-emmet.js +1 -0
  45. data/server/public/src-min-noconflict/ext-keybinding_menu.js +1 -0
  46. data/server/public/src-min-noconflict/ext-language_tools.js +1 -0
  47. data/server/public/src-min-noconflict/ext-modelist.js +1 -0
  48. data/server/public/src-min-noconflict/ext-old_ie.js +1 -0
  49. data/server/public/src-min-noconflict/ext-searchbox.js +1 -0
  50. data/server/public/src-min-noconflict/ext-settings_menu.js +1 -0
  51. data/server/public/src-min-noconflict/ext-spellcheck.js +1 -0
  52. data/server/public/src-min-noconflict/ext-split.js +1 -0
  53. data/server/public/src-min-noconflict/ext-static_highlight.js +1 -0
  54. data/server/public/src-min-noconflict/ext-statusbar.js +1 -0
  55. data/server/public/src-min-noconflict/ext-textarea.js +1 -0
  56. data/server/public/src-min-noconflict/ext-themelist.js +1 -0
  57. data/server/public/src-min-noconflict/ext-whitespace.js +1 -0
  58. data/server/public/src-min-noconflict/keybinding-emacs.js +1 -0
  59. data/server/public/src-min-noconflict/keybinding-vim.js +1 -0
  60. data/server/public/src-min-noconflict/mode-ruby.js +1 -0
  61. data/server/public/src-min-noconflict/snippets/ruby.js +1 -0
  62. data/server/public/src-min-noconflict/theme-twilight.js +1 -0
  63. data/server/public/src-min-noconflict/worker-coffee.js +1 -0
  64. data/server/public/src-min-noconflict/worker-css.js +1 -0
  65. data/server/public/src-min-noconflict/worker-javascript.js +1 -0
  66. data/server/public/src-min-noconflict/worker-json.js +1 -0
  67. data/server/public/src-min-noconflict/worker-lua.js +1 -0
  68. data/server/public/src-min-noconflict/worker-php.js +1 -0
  69. data/server/public/src-min-noconflict/worker-xquery.js +1 -0
  70. data/server/routes.rb +123 -0
  71. data/server/views/dsl.haml +65 -0
  72. data/server/views/dump.haml +3 -0
  73. data/server/views/import.haml +35 -0
  74. data/server/views/new_repository.haml +25 -0
  75. data/server/views/query.haml +28 -0
  76. data/server/views/repository.haml +25 -0
  77. data/spec/ORM/data_cube_orm_spec.rb +1 -0
  78. data/spec/bnode_spec.rb +66 -0
  79. data/spec/data_cube_spec.rb +66 -63
  80. data/spec/dataset_for_spec.rb +36 -16
  81. data/spec/dsl_spec.rb +41 -0
  82. data/spec/generators/csv_spec.rb +3 -3
  83. data/spec/generators/dataframe_spec.rb +2 -2
  84. data/spec/generators/maf_spec.rb +40 -0
  85. data/spec/generators/r_cross_spec.rb +2 -2
  86. data/spec/generators/r_matrix_spec.rb +2 -2
  87. data/spec/length_lookup_spec.rb +0 -0
  88. data/spec/maf_query_spec.rb +343 -0
  89. data/spec/resource/example.Rhistory +1 -1
  90. data/spec/turtle/bacon +9 -9
  91. data/spec/turtle/reference +43 -43
  92. data/spec/turtle/weather +10 -10
  93. data/spec/writer_spec.rb +16 -2
  94. metadata +212 -61
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e7e64a90c4e9a15927e2ef67477298d50d22358e
4
+ data.tar.gz: 18c0ccecba26dc09e9604966b992f2444dbf4b0c
5
+ SHA512:
6
+ metadata.gz: 7bdfa9be8aee03c937b8a4298f05589035ebfbe2ffe8d0ece67da239580f0ab11b192dc3d2e48cb7a2efde2e78ee31f2cc20ba55afdf68c60565a31c8c3251ee
7
+ data.tar.gz: 1d0a10523a45cf231f521f4026fe7672e29143ca68a0d56af8bcc4df4a4b433b286c81eae7d4008944b93e4f9806732aec95b43a9faf2b885673686722eba7a9
data/Gemfile CHANGED
@@ -21,6 +21,16 @@ end
21
21
  gem 'rdf'
22
22
  gem 'rdf-4store', :git => "https://github.com/fumi/rdf-4store.git"
23
23
  gem 'rdf-turtle'
24
+ gem 'rdf-rdfxml'
25
+ gem 'json-ld'
24
26
  gem 'rserve-client'
25
27
  gem 'sparql'
26
28
 
29
+ gem 'slop'
30
+
31
+ gem 'sinatra'
32
+ gem 'sinatra-contrib'
33
+ gem 'sinatra-linkeddata'
34
+ gem 'sinatra-cross_origin'
35
+ gem 'rack-flash3'
36
+ gem 'rest-client'
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ Jeweler::Tasks.new do |gem|
21
21
  gem.description = %Q{A toolkit for publishing scientific results and datasets using RDF, OWL, and related technologies }
22
22
  gem.email = "wstrinz@gmail.com"
23
23
  gem.authors = ["Will Strinz"]
24
- gem.version = "0.0.8"
24
+ gem.version = "0.1.0"
25
25
 
26
26
  # dependencies defined in Gemfile
27
27
  end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ require 'cgi'
3
+ require 'yaml'
4
+
5
+ require 'bio-publisci'
6
+ require 'slop'
7
+
8
+ require 'sinatra/base'
9
+ require "sinatra/linkeddata"
10
+ require "sinatra/cross_origin"
11
+ require 'rack-flash'
12
+
13
+ class PubliSciServer < Sinatra::Base
14
+ configure do
15
+ enable :sessions
16
+ enable :cross_origin
17
+ end
18
+
19
+ set :views, File.dirname(__FILE__) + '/../server/views'
20
+ # set :repository, RDF::Repository.new
21
+ set :sudo_pass, nil
22
+
23
+ use Rack::Flash
24
+
25
+ require_relative '../server/helpers.rb'
26
+
27
+ if ARGV[0]
28
+ opts = Slop.parse do
29
+ banner 'Usage: bio-publisci-server [options]'
30
+
31
+ on 'uri', 'Store URI', argument: :optional
32
+ on 't', 'type', 'The repository type', argument: :optional
33
+ on 'a', 'sudo_pass', 'Password for sudo (currently needed to clear 4store)', argument: :optional
34
+ on 'p', 'port', 'Sinatra port', argument: :optional
35
+ on 'o', 'bind', 'Bind address ', argument: :optional
36
+ end
37
+
38
+ configure_server(opts)
39
+ else
40
+ # set :repository, RDF::FourStore::Repository.new('http://localhost:8080')
41
+ set :repository, RDF::Repository.new
42
+
43
+ settings.repository.load(File.dirname(__FILE__) + '/../resources/primer.ttl')
44
+ end
45
+
46
+ require_relative '../server/routes.rb'
47
+
48
+
49
+ run!
50
+ end
@@ -1,7 +1,7 @@
1
1
  require_relative '../lib/bio-publisci.rb'
2
2
 
3
3
  Given /^a (.*) generator$/ do |generator|
4
- @generator = PubliSci::Reader.const_get(generator).new
4
+ @generator = PubliSci::Readers.const_get(generator).new
5
5
  end
6
6
 
7
7
  When /^I ask for its methods$/ do
@@ -1,12 +1,19 @@
1
1
  # This is temporary, just to help w/ development so I don't have to rewrite r2rdf.rb to be
2
2
  # a standard gem base yet. Also load s the files instead of require for easy reloading
3
3
  require 'tempfile'
4
- require 'rdf'
4
+ require 'fileutils'
5
5
  require 'csv'
6
- require 'rserve'
6
+
7
+ require 'rdf'
7
8
  require 'sparql'
8
9
  require 'sparql/client'
9
10
  require 'rdf/turtle'
11
+ require 'rdf/rdfxml'
12
+ require 'json/ld'
13
+
14
+ require 'rserve'
15
+ require 'rest-client'
16
+
10
17
  begin
11
18
  require 'spira'
12
19
  rescue LoadError
@@ -27,6 +34,7 @@ load_folder('bio-publisci/mixins')
27
34
  load File.dirname(__FILE__) + '/bio-publisci/dataset/interactive.rb'
28
35
  load File.dirname(__FILE__) + '/bio-publisci/query/query_helper.rb'
29
36
  load File.dirname(__FILE__) + '/bio-publisci/parser.rb'
37
+ load File.dirname(__FILE__) + '/bio-publisci/post_processor.rb'
30
38
  load File.dirname(__FILE__) + '/bio-publisci/r_client.rb'
31
39
  load File.dirname(__FILE__) + '/bio-publisci/analyzer.rb'
32
40
  load File.dirname(__FILE__) + '/bio-publisci/store.rb'
@@ -39,6 +47,7 @@ load File.dirname(__FILE__) + '/bio-publisci/output.rb'
39
47
  load File.dirname(__FILE__) + '/bio-publisci/metadata/prov/element.rb'
40
48
  load File.dirname(__FILE__) + '/bio-publisci/metadata/prov/prov.rb'
41
49
  load File.dirname(__FILE__) + '/bio-publisci/writers/base.rb'
50
+ load File.dirname(__FILE__) + '/bio-publisci/readers/base.rb'
42
51
 
43
52
 
44
53
  load_folder('bio-publisci/dsl')
@@ -1,107 +1,111 @@
1
1
  require 'rdf/4store'
2
+ begin
3
+ require 'spira'
4
+ module PubliSci
5
+ module ORM
6
+ # class Observation < Spira::Base
7
+ # type RDF::URI.new('http://purl.org/linked-data/cube#Observation')
8
+ # property :label, predicate: RDFS.label
9
+
10
+ # end
11
+ QB ||= RDF::Vocabulary.new(RDF::URI.new('http://purl.org/linked-data/cube#'))
12
+
13
+ class Component < Spira::Base
14
+ type QB.ComponentSpecification
15
+ property :dimension, predicate: QB.dimension # RDF::URI.new('http://purl.org/linked-data/cube#dimension')
16
+ property :measure, predicate: QB.measure # RDF::URI.new('http://purl.org/linked-data/cube#measure')
17
+ end
2
18
 
3
- module PubliSci
4
- module ORM
5
- # class Observation < Spira::Base
6
- # type RDF::URI.new('http://purl.org/linked-data/cube#Observation')
7
- # property :label, predicate: RDFS.label
8
-
9
- # end
10
- QB ||= RDF::Vocabulary.new(RDF::URI.new('http://purl.org/linked-data/cube#'))
11
-
12
- class Component < Spira::Base
13
- type QB.ComponentSpecification
14
- property :dimension, predicate: QB.dimension # RDF::URI.new('http://purl.org/linked-data/cube#dimension')
15
- property :measure, predicate: QB.measure # RDF::URI.new('http://purl.org/linked-data/cube#measure')
16
- end
19
+ class DataStructureDefinition < Spira::Base
20
+ type QB.DataStructureDefinition
21
+ property :label, predicate: RDFS.label
22
+ has_many :component, predicate: QB.component
23
+ end
17
24
 
18
- class DataStructureDefinition < Spira::Base
19
- type QB.DataStructureDefinition
20
- property :label, predicate: RDFS.label
21
- has_many :component, predicate: QB.component
22
- end
25
+ class DataSet < Spira::Base
26
+ type QB.DataSet
27
+ property :label, predicate: RDFS.label
28
+ property :structure, predicate: QB.structure
29
+ end
23
30
 
24
- class DataSet < Spira::Base
25
- type QB.DataSet
26
- property :label, predicate: RDFS.label
27
- property :structure, predicate: QB.structure
28
- end
31
+ class Dimension < Spira::Base
32
+ type QB.DimensionProperty
33
+ property :range, predicate: RDFS.range
34
+ property :label, predicate: RDFS.label
35
+ end
29
36
 
30
- class Dimension < Spira::Base
31
- type QB.DimensionProperty
32
- property :range, predicate: RDFS.range
33
- property :label, predicate: RDFS.label
34
- end
37
+ class Measure < Spira::Base
38
+ type QB.MeasureProperty
39
+ property :label, predicate: RDFS.label
40
+ end
35
41
 
36
- class Measure < Spira::Base
37
- type QB.MeasureProperty
38
- property :label, predicate: RDFS.label
39
- end
40
42
 
43
+ def load_repo(repo)
44
+ raise "Not an RDF::Repository - #{repo}" unless repo.is_a? RDF::Repository
45
+ Spira.add_repository :default, repo
46
+ end
41
47
 
42
- def load_repo(repo)
43
- raise "Not an RDF::Repository - #{repo}" unless repo.is_a? RDF::Repository
44
- Spira.add_repository :default, repo
45
- end
48
+ # def observation
49
+ # unless PubliSci::ORM.const_defined?("Observation")
50
+ # obs = Class.new(Spira::Base) do
51
+ # type RDF::URI.new('http://purl.org/linked-data/cube#Observation')
52
+
53
+ # property :structure, predicate: QB.dataSet
54
+
55
+ # ((Dimension.each.to_a | Measure.each.to_a) || []).each{|component|
56
+ # property strip_uri(component.subject.to_s), predicate: component.subject
57
+ # }
58
+ # end
59
+ # PubliSci::ORM.const_set("Observation",obs)
60
+ # end
61
+ # Observation
62
+ # end
63
+
64
+ class Observation < Spira::Base
65
+ type QB.Observation
66
+ property :label, predicate: RDFS.label
67
+ property :dataset, predicate: QB.dataSet
68
+
69
+ def load_properties
70
+ comps = dataset.as(DataSet).structure.as(DataStructureDefinition).component.map{|comp| comp.as(Component)}
71
+ props = comps.map{|comp| comp.dimension ? comp.dimension.as(Dimension) : comp.measure.as(Measure) }
72
+ props.each{|prop|
73
+ ss = strip_uri(prop.subject.to_s)
74
+
75
+ self.class.property ss.to_sym, predicate: prop.subject
76
+ }
77
+ end
78
+
79
+ # for testing; DRY up eventually
80
+ def strip_uri(uri)
81
+ uri = uri.to_s.dup
82
+ uri[-1] = '' if uri[-1] == '>'
83
+ uri.to_s.split('/').last.split('#').last
84
+ end
85
+
86
+ # def method_missing(meth, *args, &block)
87
+ # if meth.to_s =~ /^find_by_(.+)$/
88
+ # run_find_by_method($1, *args, &block)
89
+ # else
90
+ # super # You *must* call super if you don't handle the
91
+ # # method, otherwise you'll mess up Ruby's method
92
+ # # lookup.
93
+ # end
94
+ # end
95
+ end
46
96
 
47
- # def observation
48
- # unless PubliSci::ORM.const_defined?("Observation")
49
- # obs = Class.new(Spira::Base) do
50
- # type RDF::URI.new('http://purl.org/linked-data/cube#Observation')
51
-
52
- # property :structure, predicate: QB.dataSet
53
-
54
- # ((Dimension.each.to_a | Measure.each.to_a) || []).each{|component|
55
- # property strip_uri(component.subject.to_s), predicate: component.subject
56
- # }
57
- # end
58
- # PubliSci::ORM.const_set("Observation",obs)
59
- # end
60
- # Observation
61
- # end
62
-
63
- class Observation < Spira::Base
64
- type QB.Observation
65
- property :label, predicate: RDFS.label
66
- property :dataset, predicate: QB.dataSet
67
-
68
- def load_properties
69
- comps = dataset.as(DataSet).structure.as(DataStructureDefinition).component.map{|comp| comp.as(Component)}
70
- props = comps.map{|comp| comp.dimension ? comp.dimension.as(Dimension) : comp.measure.as(Measure) }
71
- props.each{|prop|
72
- ss = strip_uri(prop.subject.to_s)
73
-
74
- self.class.property ss.to_sym, predicate: prop.subject
75
- }
97
+ def reload_observation
98
+ PubliSci::ORM.send(:remove_const, "Observation")
99
+ observation
76
100
  end
77
101
 
78
- # for testing; DRY up eventually
79
102
  def strip_uri(uri)
80
103
  uri = uri.to_s.dup
81
104
  uri[-1] = '' if uri[-1] == '>'
82
105
  uri.to_s.split('/').last.split('#').last
83
106
  end
84
-
85
- # def method_missing(meth, *args, &block)
86
- # if meth.to_s =~ /^find_by_(.+)$/
87
- # run_find_by_method($1, *args, &block)
88
- # else
89
- # super # You *must* call super if you don't handle the
90
- # # method, otherwise you'll mess up Ruby's method
91
- # # lookup.
92
- # end
93
- # end
94
- end
95
-
96
- def reload_observation
97
- PubliSci::ORM.send(:remove_const, "Observation")
98
- observation
99
- end
100
-
101
- def strip_uri(uri)
102
- uri = uri.to_s.dup
103
- uri[-1] = '' if uri[-1] == '>'
104
- uri.to_s.split('/').last.split('#').last
105
107
  end
106
108
  end
109
+ rescue LoadError
110
+ # puts "Skipping ORM load"
107
111
  end
@@ -4,7 +4,6 @@ module PubliSci
4
4
  class DataCube
5
5
  extend PubliSci::Dataset::DataCube
6
6
  extend PubliSci::Analyzer
7
- # extend PubliSci::Metadata
8
7
  extend PubliSci::Query
9
8
  extend PubliSci::Parser
10
9
 
@@ -13,7 +13,7 @@ module PubliSci
13
13
  {
14
14
  type: :dataframe,
15
15
  encode_nulls: false,
16
- base_url: "http://www.rqtl.org",
16
+ base_url: "http://onto.strinz.me",
17
17
  }
18
18
  end
19
19
 
@@ -32,12 +32,10 @@ module PubliSci
32
32
 
33
33
  newd = dimensions.map{|d|
34
34
  if d =~ /^http:\/\//
35
- # newc << "<#{d}>" if codes.include? d
36
35
  "<#{d}>"
37
36
  elsif d =~ /^[a-zA-z]+:[a-zA-z]+$/
38
37
  d
39
38
  else
40
- # newc << "prop:#{d}" if codes.include? d
41
39
  "prop:#{d}"
42
40
  end
43
41
  }
@@ -60,9 +58,10 @@ module PubliSci
60
58
  [newm, newd, newc]
61
59
  end
62
60
 
63
- def component_gen(args,options={})
61
+ def component_gen(args,var,options={})
64
62
  args = Array[args].flatten
65
- args.map{|arg| arg.gsub("prop:","cs:").gsub(%r{<#{options[:base_url]}/.+/(\w.+)>$},'cs:'+'\1')}
63
+ args = args.map{|arg| arg.gsub("prop:","cs:").gsub(%r{<#{options[:base_url]}/.+/(\w.+)>$},'cs:'+'\1')}
64
+ args.map{|arg| arg.gsub(%r{<http://(.+)>},"<#{options[:base_url]}/dc/dataset/#{var}/cs/"+'\1'+'>')}
66
65
  end
67
66
 
68
67
  def encode_data(codes,data,var,options={})
@@ -76,7 +75,7 @@ module PubliSci
76
75
  elsif val =~ /^[a-zA-z]+:[a-zA-z]+$/
77
76
  val
78
77
  else
79
- "<code/#{k.downcase}/#{val}>"
78
+ "<code/#{k.downcase}/#{sanitize(val).first}>"
80
79
  end
81
80
  }
82
81
  else
@@ -120,12 +119,12 @@ module PubliSci
120
119
  options = defaults().merge(options)
121
120
  base = options[:base_url]
122
121
  <<-EOF.unindent
123
- @base <#{base}/ns/dc/> .
124
- @prefix ns: <#{base}/ns/dataset/#{var}/> .
122
+ @base <#{base}/dc/dataset/#{var}/> .
123
+ @prefix ns: <#{base}/dc/dataset/#{var}/> .
125
124
  @prefix qb: <http://purl.org/linked-data/cube#> .
126
125
  @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
127
126
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
128
- @prefix prop: <#{base}/dc/properties/> .
127
+ @prefix prop: <#{base}/properties/> .
129
128
  @prefix dct: <http://purl.org/dc/terms/> .
130
129
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
131
130
  @prefix cs: <#{base}/dc/dataset/#{var}/cs/> .
@@ -143,8 +142,8 @@ module PubliSci
143
142
  var = sanitize([var]).first
144
143
  options = defaults().merge(options)
145
144
  rdf_measures, rdf_dimensions, rdf_codes = generate_resources(measures, dimensions, codes, options)
146
- cs_dims = component_gen(rdf_dimensions,options) #rdf_dimensions.map{|d| d.gsub('prop:','cs:')}
147
- cs_meas = component_gen(rdf_measures,options) #rdf_measures.map!{|m| m.gsub('prop:','cs:')}
145
+ cs_dims = component_gen(rdf_dimensions,var,options) #rdf_dimensions.map{|d| d.gsub('prop:','cs:')}
146
+ cs_meas = component_gen(rdf_measures,var,options) #rdf_measures.map!{|m| m.gsub('prop:','cs:')}
148
147
  str = "ns:dsd-#{var} a qb:DataStructureDefinition;\n"
149
148
  cs_dims.map{|d|
150
149
  str << " qb:component #{d} ;\n"
@@ -172,16 +171,14 @@ module PubliSci
172
171
  def component_specifications(measure_names, dimension_names, codes, var, options={})
173
172
  options = defaults().merge(options)
174
173
  rdf_measures, rdf_dimensions, rdf_codes = generate_resources(measure_names, dimension_names, codes, options)
175
- cs_dims = component_gen(rdf_dimensions,options)
176
- cs_meas = component_gen(rdf_measures,options)
177
- # cs_dims = rdf_dimensions.map{|d| d.gsub('prop:','cs:')}
178
- # cs_meas = rdf_measures.map{|m| m.gsub('prop:','cs:')}
174
+ cs_dims = component_gen(rdf_dimensions,var,options)
175
+ cs_meas = component_gen(rdf_measures,var,options)
179
176
  specs = []
180
177
 
181
178
  rdf_dimensions.each_with_index.map{|d,i|
182
179
  specs << <<-EOF.unindent
183
180
  #{cs_dims[i]} a qb:ComponentSpecification ;
184
- rdfs:label "#{strip_prefixes(strip_uri(dimension_names[i]))} Component" ;
181
+ rdfs:label "#{strip_prefixes(strip_uri(dimension_names[i]))}" ;
185
182
  qb:dimension #{d} .
186
183
 
187
184
  EOF
@@ -190,7 +187,7 @@ module PubliSci
190
187
  rdf_measures.each_with_index.map{|n,i|
191
188
  specs << <<-EOF.unindent
192
189
  #{cs_meas[i]} a qb:ComponentSpecification ;
193
- rdfs:label "#{strip_prefixes(strip_uri(measure_names[i]))} Component" ;
190
+ rdfs:label "#{strip_prefixes(strip_uri(measure_names[i]))}" ;
194
191
  qb:measure #{n} .
195
192
 
196
193
  EOF
@@ -214,6 +211,7 @@ module PubliSci
214
211
 
215
212
  rdf_dimensions.each_with_index{|d,i|
216
213
  if dimension_codes.include?(dimensions[i])
214
+
217
215
  code = rdf_codes[dimension_codes.index(dimensions[i])]
218
216
  props << <<-EOF.unindent
219
217
  #{d} a rdf:Property, qb:DimensionProperty ;
@@ -225,9 +223,13 @@ module PubliSci
225
223
  else
226
224
  props << <<-EOF.unindent
227
225
  #{d} a rdf:Property, qb:DimensionProperty ;
228
- rdfs:label "#{strip_prefixes(strip_uri(d))}"@en .
229
-
226
+ rdfs:label "#{strip_prefixes(strip_uri(d))}"@en ;
230
227
  EOF
228
+ if options[:ranges] && options[:ranges][dimension[i]]
229
+ props.last << "\n rdfs:range #{options[:ranges][dimensions[i]]} .\n\n"
230
+ else
231
+ props.last[-2] = ".\n"
232
+ end
231
233
  end
232
234
  }
233
235
 
@@ -239,14 +241,19 @@ module PubliSci
239
241
  rdf_measures = generate_resources(measures, [], [], options)[0]
240
242
  props = []
241
243
 
242
- rdf_measures.map{ |m|
244
+ rdf_measures.each_with_index{ |m,i|
243
245
 
244
- props << <<-EOF.unindent
245
- #{m} a rdf:Property, qb:MeasureProperty ;
246
- rdfs:label "#{strip_prefixes(strip_uri(m))}"@en .
246
+ props << <<-EOF.unindent
247
+ #{m} a rdf:Property, qb:MeasureProperty ;
248
+ rdfs:label "#{strip_prefixes(strip_uri(m))}"@en ;
249
+ EOF
247
250
 
248
- EOF
249
- }
251
+ if options[:ranges] && options[:ranges][measures[i]]
252
+ props.last << " rdfs:range #{options[:ranges][measures[i]]} .\n\n"
253
+ else
254
+ props.last[-2] = ".\n"
255
+ end
256
+ }
250
257
 
251
258
  props
252
259
  end
@@ -255,7 +262,11 @@ module PubliSci
255
262
  var = sanitize([var]).first
256
263
  measures = sanitize(measures)
257
264
  dimensions = sanitize(dimensions)
265
+
266
+ data.each{|k,v| data[k]=Array(v)}
267
+ observation_labels = Array(observation_labels)
258
268
  options = defaults().merge(options)
269
+
259
270
  rdf_measures, rdf_dimensions, rdf_codes = generate_resources(measures, dimensions, codes, options)
260
271
  data = encode_data(codes, data, var, options)
261
272
  obs = []
@@ -269,7 +280,7 @@ module PubliSci
269
280
  }
270
281
 
271
282
  observation_labels.each_with_index.map{|r, i|
272
- contains_nulls = false
283
+ # contains_nulls = false
273
284
  str = <<-EOF.unindent
274
285
  ns:obs#{r} a qb:Observation ;
275
286
  qb:dataSet ns:dataset-#{var} ;
@@ -277,33 +288,57 @@ module PubliSci
277
288
 
278
289
  str << " rdfs:label \"#{r}\" ;\n" unless options[:no_labels]
279
290
 
291
+ obs_index = 0
292
+ obs_nodes = []
293
+
280
294
  dimensions.each_with_index{|d,j|
281
- contains_nulls = contains_nulls | (data[d][i] == nil)
295
+ contains_nulls = (data[d][i] == nil)
282
296
 
283
- if dimension_codes.include? d
284
- # str << " #{rdf_dimensions[j]} <code/#{d.downcase}/#{data[d][i]}> ;\n"
285
- str << " #{rdf_dimensions[j]} #{to_resource(data[d][i], options)} ;\n"
286
- else
287
- str << " #{rdf_dimensions[j]} #{to_literal(data[d][i], options)} ;\n"
297
+ unless contains_nulls && !options[:encode_nulls]
298
+ if is_complex?(data[d][i])
299
+ str << " #{rdf_dimensions[j]} #{add_node(obs_index,add_node(r))} ;\n"
300
+ obs_nodes << encode_value(data[d][i], options, obs_index, add_node(r))
301
+ else
302
+ str << " #{rdf_dimensions[j]} #{encode_value(data[d][i], options)} ;\n"
303
+ end
288
304
  end
305
+
306
+ obs_index += 1
289
307
  }
290
308
 
291
309
  measures.each_with_index{|m,j|
292
- contains_nulls = contains_nulls | (data[m][i] == nil)
293
- str << " #{rdf_measures[j]} #{to_literal(data[m][i], options)} ;\n"
310
+ contains_nulls = (data[m][i] == nil)
311
+
312
+ unless contains_nulls && !options[:encode_nulls]
313
+ if is_complex?(data[m][i])
314
+ str << " #{rdf_measures[j]} #{add_node(obs_index,add_node(r))} ;\n"
315
+ val = encode_value(data[m][i], options, obs_index, add_node(r))
316
+
317
+ if val.last.is_a? Array
318
+ unless val.last.last[-2] == "."
319
+ val.last.last << ".\n"
320
+ end
321
+ end
322
+
323
+ obs_nodes << val
324
+ else
325
+ str << " #{rdf_measures[j]} #{encode_value(data[m][i], options)} ;\n"
326
+ end
327
+ end
294
328
 
329
+ obs_index += 1
295
330
  }
296
331
 
297
332
  str << " .\n\n"
298
- if contains_nulls && !options[:encode_nulls]
299
- if options[:raise_nils]
300
- raise "missing component for observation, skipping: #{str}, "
301
- elsif options[:whiny_nils]
302
- puts "missing component for observation, skipping: #{str}, "
303
- end
304
- else
305
- obs << str
333
+
334
+ if obs_nodes.size > 0
335
+ flatted = obs_nodes.flatten
336
+ str << turtle_indent(flatted.join("\n"))
337
+ str << " \n\n"
306
338
  end
339
+
340
+ obs << str
341
+
307
342
  }
308
343
  obs
309
344
  end
@@ -356,7 +391,6 @@ module PubliSci
356
391
  else
357
392
  refcode = code[0]
358
393
  end
359
- # puts data[refcode].uniq
360
394
  data[refcode].uniq.each_with_index{|value,i|
361
395
  unless value == nil && !options[:encode_nulls]
362
396
  concepts << <<-EOF.unindent
@@ -377,7 +411,7 @@ module PubliSci
377
411
  def abbreviate_known(turtle_string)
378
412
  #debug method
379
413
  # puts turtle_string
380
- turtle_string.gsub(/<http:\/\/www\.rqtl\.org\/dc\/properties\/(\S+)>/, 'prop:\1').gsub(/<http:\/\/www.rqtl.org\/ns\/dc\/code\/(\S+)\/(\S+)>/, '<code/\1/\2>').gsub(/<http:\/\/www.rqtl.org\/dc\/dataset\/(\S+)\/code\/(\S+)>/, 'code:\2')
414
+ turtle_string.gsub(/<http:\/\/www\.rqtl\.org\/dc\/properties\/(\S+)>/, 'prop:\1').gsub(/<http:\/\/www.rqtl.org\/ns\/dc\/code\/(\S+)\/(\S+)>/, '<code/\1/\2>').gsub(/<http:\/\/www.rqtl.org\/dc\/dataset\/(\S+)\/code\/(\w+)>/, 'code:\2').gsub(/<http:\/\/www.rqtl.org\/dc\/dataset\/(\S+)\/code\/(\S+)>/, '<code/' + '\2' +'>')
381
415
  end
382
416
  end
383
417
  end