使用CONSTRUCT查询的Ruby RDF / Sparql客户端中的分段错误

时间:2016-11-23 14:15:05

标签: ruby sparql virtuoso

我想从Virtuoso端点检索TTL。

query(construct_query).each_statement do |statement|
  puts statement.inspect
end

CONSTRUCT查询返回 ~652977 语句。

CONSTRUCT {
  ?s ?p ?o
}
FROM <http://tempgraph>
WHERE {
  ?s ?p ?o .
}

但是我遇到了分段错误。

/usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:209: [BUG] Segmentation fault at     0x00000000000000
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0057 p:---- s:0289 e:000288 CFUNC  :raptor_parser_parse_chunk
c:0056 p:0018 s:0282 E:001128 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:209
c:0055 p:0025 s:0278 E:001198 RESCUE /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:163
c:0054 p:0056 s:0275 E:001be0 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:157
c:0053 p:0175 s:0268 E:0006d8 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi/v2/parser.rb:92
c:0052 p:0018 s:0262 E:000110 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi.rb:118
c:0051 p:0048 s:0257 E:001290 METHOD /usr/local/bundle/gems/rdf-raptor-1.99.0/lib/rdf/raptor/ffi.rb:84
c:0050 p:0130 s:0252 E:000f38 METHOD /app/lib/queries.rb:146
... etc

然而,测试直接通过HTTP查询Virtuoso端点,结果已成功获取并创建。

require 'net/http'
require 'linkeddata'
require 'cgi'

query = "CONSTRUCT { ?s ?p ?o  } FROM <http://tempgraph> WHERE { ?s ?p ?o . }"
baseURL = "http://localhost:8890/sparql/"
sparqlURL=baseURL+"?query=#{CGI.escape query}"
response = Net::HTTP.get_response(URI.parse(sparqlURL))


File.open("response.ttl", "wb") do |res|
  res.puts response.body
end                             

它创建了完整的TTL

$ cat response.ttl | wc -l
652996

[编辑] 通过HTTP从端点获取的 response.ttl 可以通过RDF / Ruby库成功地序列化为RDF。因此,可以安全地假设它是SPARQL客户端。

  RDF::Writer.open("/app/output.rdf") do |writer|
    RDF::Reader.open("/app/response.ttl") do |reader|
      reader.each_statement do |statement|
        writer << statement
      end
    end
  end

0 个答案:

没有答案