annotate sparql-7785ad38967f/sparql/executor.rb @ 0:46996d3b1cfb default tip

Uploaded
author greg
date Tue, 13 Mar 2012 16:29:09 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
46996d3b1cfb Uploaded
greg
parents:
diff changeset
1 #!/usr/bin/env ruby
46996d3b1cfb Uploaded
greg
parents:
diff changeset
2 $: << File.expand_path('../rubylib/lib', File.dirname(__FILE__))
46996d3b1cfb Uploaded
greg
parents:
diff changeset
3 $: << File.expand_path('sparql/lib', File.dirname(__FILE__))
46996d3b1cfb Uploaded
greg
parents:
diff changeset
4 require "galaxy_tool"
46996d3b1cfb Uploaded
greg
parents:
diff changeset
5 require 'rubygems'
46996d3b1cfb Uploaded
greg
parents:
diff changeset
6 require 'sparql'
46996d3b1cfb Uploaded
greg
parents:
diff changeset
7 require 'rubyrdf'
46996d3b1cfb Uploaded
greg
parents:
diff changeset
8
46996d3b1cfb Uploaded
greg
parents:
diff changeset
9 class SPARQLExecutor < GalaxyTool::Base
46996d3b1cfb Uploaded
greg
parents:
diff changeset
10
46996d3b1cfb Uploaded
greg
parents:
diff changeset
11 option :endpoint,
46996d3b1cfb Uploaded
greg
parents:
diff changeset
12 :short => "-e",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
13 :long => "--endpoint <URL>",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
14 :class => String,
46996d3b1cfb Uploaded
greg
parents:
diff changeset
15 :description => "use <URL> as SPARQL endpoint.",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
16 :proc => proc {|arg| arg.strip },
46996d3b1cfb Uploaded
greg
parents:
diff changeset
17 :required => true
46996d3b1cfb Uploaded
greg
parents:
diff changeset
18
46996d3b1cfb Uploaded
greg
parents:
diff changeset
19 option :query,
46996d3b1cfb Uploaded
greg
parents:
diff changeset
20 :long => "--query-file <filepath>",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
21 :class => String,
46996d3b1cfb Uploaded
greg
parents:
diff changeset
22 :description => "read query expression from <filepath>.",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
23 :proc => proc {|arg| File.read(arg).chomp },
46996d3b1cfb Uploaded
greg
parents:
diff changeset
24 :required => true
46996d3b1cfb Uploaded
greg
parents:
diff changeset
25
46996d3b1cfb Uploaded
greg
parents:
diff changeset
26 option :query,
46996d3b1cfb Uploaded
greg
parents:
diff changeset
27 :short => "-q",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
28 :long => "--query <expression>",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
29 :class => String,
46996d3b1cfb Uploaded
greg
parents:
diff changeset
30 :description => "use <expression> as query expression.",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
31 :proc => proc {|arg| arg.chomp },
46996d3b1cfb Uploaded
greg
parents:
diff changeset
32 :required => true
46996d3b1cfb Uploaded
greg
parents:
diff changeset
33
46996d3b1cfb Uploaded
greg
parents:
diff changeset
34 option_output :short => "-o",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
35 :long => "--output <filepath>",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
36 :description => "use <filepath> as output file path."
46996d3b1cfb Uploaded
greg
parents:
diff changeset
37
46996d3b1cfb Uploaded
greg
parents:
diff changeset
38 option_info :long => "--info <filepath>",
46996d3b1cfb Uploaded
greg
parents:
diff changeset
39 :description => "use <filepath> as info file path. default is standard out (/dev/stdout)."
46996d3b1cfb Uploaded
greg
parents:
diff changeset
40
46996d3b1cfb Uploaded
greg
parents:
diff changeset
41 option_error_handler do |optparse, exception|
46996d3b1cfb Uploaded
greg
parents:
diff changeset
42 $stderr.puts "Error: " + exception.message
46996d3b1cfb Uploaded
greg
parents:
diff changeset
43 $stderr.puts optparse.help
46996d3b1cfb Uploaded
greg
parents:
diff changeset
44 raise exception
46996d3b1cfb Uploaded
greg
parents:
diff changeset
45 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
46
46996d3b1cfb Uploaded
greg
parents:
diff changeset
47 def info(info_out)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
48 info_out.puts "Execute SPARQL query. The endpoint is #{options[:endpoint]}.\n"
46996d3b1cfb Uploaded
greg
parents:
diff changeset
49 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
50
46996d3b1cfb Uploaded
greg
parents:
diff changeset
51 def create_customized_client(endpoint)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
52 client = SPARQL::Client.new(endpoint)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
53
46996d3b1cfb Uploaded
greg
parents:
diff changeset
54 def client.parsed_xml(content)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
55 REXML::Document.new(content).root
46996d3b1cfb Uploaded
greg
parents:
diff changeset
56 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
57
46996d3b1cfb Uploaded
greg
parents:
diff changeset
58 def client.parse_xml(content)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
59 table = []
46996d3b1cfb Uploaded
greg
parents:
diff changeset
60 xml = parsed_xml(content)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
61
46996d3b1cfb Uploaded
greg
parents:
diff changeset
62 head = xml.elements['head']
46996d3b1cfb Uploaded
greg
parents:
diff changeset
63 variables = head.elements.map do |variable|
46996d3b1cfb Uploaded
greg
parents:
diff changeset
64 variable.attributes['name']
46996d3b1cfb Uploaded
greg
parents:
diff changeset
65 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
66 table << variables.map {|v| "?" + v }
46996d3b1cfb Uploaded
greg
parents:
diff changeset
67
46996d3b1cfb Uploaded
greg
parents:
diff changeset
68 case
46996d3b1cfb Uploaded
greg
parents:
diff changeset
69 when boolean = xml.elements['boolean']
46996d3b1cfb Uploaded
greg
parents:
diff changeset
70 boolean.text == 'true'
46996d3b1cfb Uploaded
greg
parents:
diff changeset
71 when results = xml.elements['results']
46996d3b1cfb Uploaded
greg
parents:
diff changeset
72 table += results.elements.map do |result|
46996d3b1cfb Uploaded
greg
parents:
diff changeset
73 row = []
46996d3b1cfb Uploaded
greg
parents:
diff changeset
74 result.elements.each do |binding|
46996d3b1cfb Uploaded
greg
parents:
diff changeset
75 name = binding.attributes['name']
46996d3b1cfb Uploaded
greg
parents:
diff changeset
76 value_node = binding.children.find {|n| !n.is_a?(REXML::Text) }
46996d3b1cfb Uploaded
greg
parents:
diff changeset
77 value = parse_xml_value(value_node)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
78 row[variables.index(name)] = value
46996d3b1cfb Uploaded
greg
parents:
diff changeset
79 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
80 row
46996d3b1cfb Uploaded
greg
parents:
diff changeset
81 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
82 else
46996d3b1cfb Uploaded
greg
parents:
diff changeset
83 raise NotImplementedError # TODO
46996d3b1cfb Uploaded
greg
parents:
diff changeset
84 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
85
46996d3b1cfb Uploaded
greg
parents:
diff changeset
86 table
46996d3b1cfb Uploaded
greg
parents:
diff changeset
87 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
88
46996d3b1cfb Uploaded
greg
parents:
diff changeset
89 def client.graph
46996d3b1cfb Uploaded
greg
parents:
diff changeset
90 @graph ||= RDF::Graph::Memory.new
46996d3b1cfb Uploaded
greg
parents:
diff changeset
91 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
92
46996d3b1cfb Uploaded
greg
parents:
diff changeset
93 def client.parse_xml_value(element)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
94 case element
46996d3b1cfb Uploaded
greg
parents:
diff changeset
95 when REXML::Text
46996d3b1cfb Uploaded
greg
parents:
diff changeset
96 element.value
46996d3b1cfb Uploaded
greg
parents:
diff changeset
97 when REXML::Node
46996d3b1cfb Uploaded
greg
parents:
diff changeset
98 case element.name.to_sym
46996d3b1cfb Uploaded
greg
parents:
diff changeset
99 when :uri
46996d3b1cfb Uploaded
greg
parents:
diff changeset
100 RDF::UriNode.new(element.text)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
101 when :literal
46996d3b1cfb Uploaded
greg
parents:
diff changeset
102 RDF::PlainLiteralNode.new(element.text)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
103 when :bnode
46996d3b1cfb Uploaded
greg
parents:
diff changeset
104 RDF::BlankNode.new(element.text, graph)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
105 else
46996d3b1cfb Uploaded
greg
parents:
diff changeset
106 raise NotImplementedError # TODO
46996d3b1cfb Uploaded
greg
parents:
diff changeset
107 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
108 else
46996d3b1cfb Uploaded
greg
parents:
diff changeset
109 raise NotImplementedError # TODO
46996d3b1cfb Uploaded
greg
parents:
diff changeset
110 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
111 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
112
46996d3b1cfb Uploaded
greg
parents:
diff changeset
113 client
46996d3b1cfb Uploaded
greg
parents:
diff changeset
114 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
115
46996d3b1cfb Uploaded
greg
parents:
diff changeset
116 def search(client, query)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
117 client.query(query)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
118 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
119
46996d3b1cfb Uploaded
greg
parents:
diff changeset
120 def main(output)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
121 client = create_customized_client(options[:endpoint])
46996d3b1cfb Uploaded
greg
parents:
diff changeset
122 search(client, options[:query]).each do |row|
46996d3b1cfb Uploaded
greg
parents:
diff changeset
123 output.puts row.join("\t")
46996d3b1cfb Uploaded
greg
parents:
diff changeset
124 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
125 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
126 end
46996d3b1cfb Uploaded
greg
parents:
diff changeset
127
46996d3b1cfb Uploaded
greg
parents:
diff changeset
128 if $0 == __FILE__
46996d3b1cfb Uploaded
greg
parents:
diff changeset
129 SPARQLExecutor.new.run(ARGV)
46996d3b1cfb Uploaded
greg
parents:
diff changeset
130 end