From d8359c77fffda757f7c7fce525ad576ea97f5695 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 7 Jun 2013 18:41:41 +0200 Subject: sort uri-list by date;allow multiple modified entries;split handling for turtle and html --- lib/4store.rb | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/4store.rb b/lib/4store.rb index 7c6be09..1377643 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -8,7 +8,7 @@ module OpenTox def self.list mime_type bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type if mime_type =~ /(uri-list|html)/ - sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s <#{RDF.type}> <#{klass}>; <#{RDF::DC.modified}> ?o.} } ORDER BY ?o" + sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s <#{RDF.type}> <#{klass}>; <#{RDF::DC.date}> ?o.} } ORDER BY ?o" else sparql = "CONSTRUCT {?s ?p ?o.} WHERE {?s <#{RDF.type}> <#{klass}>; ?p ?o. }" end @@ -43,10 +43,7 @@ module OpenTox bad_request_error "Reqest body empty." unless rdf mime_type = "application/x-turtle" if mime_type == "text/plain" RestClientWrapper.put File.join(four_store_uri,"data",uri), rdf, :content_type => mime_type - update "WITH <#{uri}> - DELETE {<#{uri}> <{RDF::DC.modified}> ?o} - WHERE {<#{uri}> <{RDF::DC.modified}> ?o}; - INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" + update "INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" end def self.delete uri @@ -87,24 +84,33 @@ module OpenTox case mime_type when "text/plain", "application/rdf+xml" RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body - when /html|turtle/ - nt = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body # 4store returns ntriples for turtle - rdf = RDF::Graph.new - RDF::Reader.for(:ntriples).new(nt) do |reader| - reader.each_statement { |statement| rdf << statement } - end - if !rdf.empty? + when /turtle/ + nt = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/tab-separated-values").body # 4store returns ntriples for turtle + if !nt.empty? + rdf = RDF::Graph.new + RDF::Reader.for(:ntriples).new(nt) do |reader| + reader.each_statement { |statement| rdf << statement } + end prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } # TODO: fails for large datasets?? multi_cell_call - turtle = RDF::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + turtle = RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| writer << rdf end + else + nt + end + when /html/ + # modified ntriples output, delivers large datasets + #TODO optimize representation + nt = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body + if !nt.empty? regex = Regexp.new '(https?:\/\/[\S]+)([>"])' - turtle = "" + turtle.gsub( regex, '\1\2' ).gsub(/\n/,'
') + "" if mime_type =~ /html/ and !turtle.empty? - turtle + bnode = Regexp.new '_:[a-z0-9]*' + html = "" + nt.gsub(regex, '\1\2').gsub(/\n/,'
').gsub(bnode, '<>') + "" + html else - rdf + nt end end else -- cgit v1.2.3