Class: RDF::Turtle::FreebaseReader

Inherits:
NTriples::Reader
  • Object
show all
Includes:
Terminals
Defined in:
lib/rdf/turtle/freebase_reader.rb

Overview

Parser specifically for Freebase, which has a very regular form.

Constant Summary

Constants included from Terminals

Terminals::ANON, Terminals::BASE, Terminals::BLANK_NODE_LABEL, Terminals::DECIMAL, Terminals::DOUBLE, Terminals::ECHAR, Terminals::EXPONENT, Terminals::INTEGER, Terminals::IRIREF, Terminals::IRI_RANGE, Terminals::LANGTAG, Terminals::PERCENT, Terminals::PLX, Terminals::PNAME_LN, Terminals::PNAME_NS, Terminals::PN_CHARS, Terminals::PN_CHARS_BASE, Terminals::PN_CHARS_BODY, Terminals::PN_CHARS_U, Terminals::PN_LOCAL, Terminals::PN_LOCAL_BODY, Terminals::PN_LOCAL_ESC, Terminals::PN_PREFIX, Terminals::PREFIX, Terminals::STRING_LITERAL_LONG_QUOTE, Terminals::STRING_LITERAL_LONG_SINGLE_QUOTE, Terminals::STRING_LITERAL_QUOTE, Terminals::STRING_LITERAL_SINGLE_QUOTE, Terminals::UCHAR, Terminals::U_CHARS1, Terminals::U_CHARS2, Terminals::WS

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.formatObject



12
# File 'lib/rdf/turtle/freebase_reader.rb', line 12

def self.format; RDF::Turtle::Format; end

Instance Method Details

#read_booleanRDF::Literal::Boolean

Read a boolean value

Returns:

  • (RDF::Literal::Boolean)


110
111
112
113
114
# File 'lib/rdf/turtle/freebase_reader.rb', line 110

def read_boolean
  if bool_str = match(/^(true|false)/)
    RDF::Literal::Boolean.new(bool_str, canonicalize:  canonicalize?)
  end
end

#read_literalRDF::Literal

Returns:

  • (RDF::Literal)

See Also:



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/rdf/turtle/freebase_reader.rb', line 74

def read_literal
  if literal_str = match(LITERAL_PLAIN)
    literal_str = self.class.unescape(literal_str)
    literal = case
      when language = match(RDF::NTriples::Reader::LANGTAG)
        RDF::Literal.new(literal_str, language:  language)
      when datatype = match(/^(\^\^)/)
        RDF::Literal.new(literal_str, datatype:  read_pname(intern:  true) || read_uriref || fail_object)
      else
        RDF::Literal.new(literal_str) # plain string literal
    end
    literal.validate!     if validate?
    literal.canonicalize! if canonicalize?
    literal
  end
end

#read_numericRDF::Literal::Integer, ...

Read a numeric value

Returns:

  • (RDF::Literal::Integer, RDF::Literal::Float, RDF::Literal::Double)


94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/rdf/turtle/freebase_reader.rb', line 94

def read_numeric
  case
  when double_str = match(/^(#{DOUBLE})/)
    double_str = double_str.sub(/\.([eE])/, '.0\1')
    RDF::Literal::Double.new(double_str, canonicalize:  canonicalize?)
  when decimal_str = match(/^(#{DECIMAL})/)
    decimal_str = "0#{decimal_str}" if decimal_str[0,1] == "."
    RDF::Literal::Decimal.new(decimal_str, canonicalize:  canonicalize?)
  when integer_str = match(/^(#{INTEGER})/)
    RDF::Literal::Integer.new(integer_str, canonicalize:  canonicalize?)
  end
end

#read_pname(options = {}) ⇒ RDF::URI

Read a PNAME of the form ‘prefix:suffix`.

Returns:

  • (RDF::URI)


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/rdf/turtle/freebase_reader.rb', line 54

def read_pname(options = {})
  if pname_str = match(/^(\w+:\S+)/)
    ns, suffix = pname_str.split(':', 2)
    if suffix[-1,1] == "."
      suffix.chop!  # Remove end of statement
      @line.insert(0, ".")
    end
    pfx_iri = prefix(ns)
    raise RDF::ReaderError.new("ERROR [line #{lineno}] prefix #{ns.inspect} is not defined", lineno: lineno) unless pfx_iri
    uri = RDF::URI(pfx_iri + suffix)
    uri.validate!     if validate?
    uri
  end
rescue ArgumentError => e
  raise RDF::ReaderError.new("ERROR [line #{lineno}] invalid PName", lineno: lineno)
end

#read_prefixRDF::URI

Read a prefix of the form ‘@prefix pfx: <uri> .

Add prefix definition to ‘prefixes`

Returns:

  • (RDF::URI)


43
44
45
46
47
48
49
# File 'lib/rdf/turtle/freebase_reader.rb', line 43

def read_prefix
  if prefix_str = match(/^@prefix\s+(\w+:\s+#{IRIREF})\s*.$/)
    prefix, iri = prefix_str.split(/:\s+/)
    return nil unless iri
    prefix(prefix, iri[1..-2])
  end
end

#read_tripleObject

Extension to N-Triples reader, includes reading pnames and prefixes



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/rdf/turtle/freebase_reader.rb', line 17

def read_triple
  loop do
    begin
      readline.strip!
      line = @line
      unless blank? || read_prefix
        subject   = read_pname(intern:  true) || fail_subject
        predicate = read_pname(intern:  true) || fail_predicate
        object    = read_pname || read_uriref || read_boolean || read_numeric || read_literal || fail_object
        if validate? && !read_eos
          raise RDF::ReaderError.new("ERROR [line #{lineno}] Expected end of statement (found: #{current_line.inspect})", lineno: lineno)
        end
        return [subject, predicate, object]
      end
    rescue RDF::ReaderError =>  e
      raise e if validate?
      $stderr.puts e.message
    end
  end
end