## Get or construct RDF Triples

An raptor_statement can be made either by receiving them from a raptor_parser via parsing or can be constructed by hand.

When constructing by hand, the raptor_statement structure should be allocated by the application and the fields filled in. Each triple has three parts. The subject can be a URI or blank node, the predicate can only be a URI and the object can be a URI, blank node or RDF literal. RDF literals can have either just a Unicode string, a Unicode string and a language or a Unicode string and a datatype URI.

The triple part types are set as fields named like `subject_type` for describing field `subject`. So to initialise the subject of the triple, set the field `statement.subject` to point to a previously allocated raptor_uri* object (for URI) or `char*` (for blank node) and set `statement.subject_type` to `RAPTOR_IDENTIFIER_TYPE_RESOURCE` or `RAPTOR_IDENTIFIER_TYPE_ANONYMOUS` respectively. Triple predicates are always of type `RAPTOR_IDENTIFIER_TYPE_RESOURCE`. Triple objects are all all types given above and also `RAPTOR_IDENTIFIER_TYPE_LITERAL` which takes an `unsigned char*` pointer plus an optional language `char*` pointer in the `object_literal_language` field OR a a `raptor_uri*` literal datatype pointer in the `object_literal_datatype` field. The triple part types are described under raptor_identifier_type.

Example 3. `rdfserialize.c`: Serialize 1 triple to RDF/XML (Abbreviated)

    #include <stdio.h>
    #include <raptor.h>
    #include <stdlib.h>

    /* rdfserialize.c: serialize 1 triple to RDF/XML-Abbrev */

    int
    main(int argc, char *argv[])
    {
      raptor_serializer* rdf_serializer=NULL;
      unsigned char *uri_string;
      raptor_uri *base_uri;
      raptor_statement* triple;

      raptor_init();

      uri_string=raptor_uri_filename_to_uri_string(argv[1]);
      base_uri=raptor_new_uri(uri_string);

      rdf_serializer=raptor_new_serializer("rdfxml-abbrev");
      raptor_serialize_start_to_file_handle(rdf_serializer, base_uri, stdout);

      /* Make a triple with URI subject, URI predicate, literal object */
      triple=(raptor_statement*)calloc(1, sizeof(raptor_statement));
      triple->subject=(void*)raptor_new_uri((const unsigned char*)"http://example.org/subject");
      triple->subject_type=RAPTOR_IDENTIFIER_TYPE_RESOURCE;
      triple->predicate=(void*)raptor_new_uri((const unsigned char*)"http://example.org/predicate");
      triple->predicate_type=RAPTOR_IDENTIFIER_TYPE_RESOURCE;
      triple->object="An example literal";
      triple->object_type=RAPTOR_IDENTIFIER_TYPE_LITERAL;
      triple->object_literal_language=(const unsigned char*)"en";

      /* Write the triple */
      raptor_serialize_statement(rdf_serializer, triple);

      /* Delete the triple */
      raptor_free_uri((raptor_uri*)triple->subject);
      raptor_free_uri((raptor_uri*)triple->predicate);
      free(triple);

      raptor_serialize_end(rdf_serializer);
      raptor_free_serializer(rdf_serializer);

      raptor_free_uri(base_uri);
      raptor_free_memory(uri_string);

      raptor_finish();
      return 0;
    }

Compile it like this:

    $ gcc -o rdfserialize rdfserialize.c `raptor-config --cflags` `raptor-config --libs`

and run it with an optional base URI argument

    $ ./rdfserialize
    <?xml version="1.0" encoding="utf-8"?>
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about="http://example.org/subject">
        <ns0:predicate xmlns:ns0="http://example.org/" xml:lang="en">An example</ns0:predicate>
      </rdf:Description>
    </rdf:RDF>