Method: RDF::Writer#write_statement

Defined in:
lib/rdf/writer.rb

#write_statement(statement) ⇒ self Also known as: insert_statement

Note:

logs error if attempting to write an invalid Statement or if canonicalizing a statement which cannot be canonicalized.

Add a statement to the writer. This will check to ensure that the statement is complete (no nil terms) and is valid, if the :validation option is set.

Additionally, it will de-duplicate BNode terms sharing a common identifier.

Parameters:

Returns:

  • (self)


477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
# File 'lib/rdf/writer.rb', line 477

def write_statement(statement)
  statement = statement.canonicalize! if canonicalize?

  # Make sure BNodes in statement use unique identifiers
  if statement.node?
    statement.to_quad.map do |term|
      if term.is_a?(RDF::Node)
        term = term.original while term.original
        @nodes[term] ||= begin
          # Account for duplicated nodes
          @node_id_map[term.to_s] ||= term
          if !@node_id_map[term.to_s].equal?(term)
            # Rename node
            term.make_unique!
            @node_id_map[term.to_s] = term
          end
        end
      else
        term
      end
    end
    statement = RDF::Statement.from(statement.to_quad)
  end

  if statement.incomplete?
    log_error "Statement #{statement.inspect} is incomplete"
  elsif validate? && statement.invalid?
    log_error "Statement #{statement.inspect} is invalid"
  elsif respond_to?(:write_quad)
    write_quad(*statement.to_quad)
  else
    write_triple(*statement.to_triple)
  end
  self
rescue ArgumentError => e
  log_error e.message + " at #{e.backtrace.first}"
end