/**
 * \page soprano_backend_virtuoso Virtuoso Storage Backend
 *
 * The Virtuoso storage backend provides access to Virtuoso servers. It can connect to
 * already running servers as well as spawn its own local instance. The Virtuoso server
 * is accessed via ODBC through the client library <a href="http://www.iodbc.org/">iODBC</a>.
 * Currently no other client libraries are supported (which also means that this backend
 * can only be used on systems that have libiODBC which excludes Windows).
 *
 * The name of the backend is \p virtuosobackend. Thus, to use it one simply has to load it as follows:
 *
 * \code
 * const Soprano::Backend* virtBack = Soprano::PluginManager::instance()->discoverBackendByName("virtuosobackend");
 * \endcode
 *
 * \section soprano_backend_vituoso_settings Supported Settings
 *
 * The Virtuoso backend supports the following settings which can be passed to Soprano::Backend::createModel:
 *
 * - \c indexes - A comma separated list of quadruple indexes to be used (Example: '\c spog,\c posg,\c opsg'). If not
 *                specified, the indexes are not changed, ie. the Virtuoso defaults are used.
 * - \c fulltextindex - Enable or disable the full text index which allows to perform full text queries on
 *                      string literals embedded in SPARQL queries. For more information see the documentation
 *                      on <a href="http://docs.openlinksw.com/virtuoso/rdfsparql.html#sparqlextensions">Virtuoso SPARQL extensions</a>.
 *                      - \c none - disable the index
 *                      - \c sync - enable syncroneous updates of the index (the index is always in sync. This might give a performace penalty)
 *                      - \c N - The interval in minutes after which the index will be updated.
 * - \c NumberOfBuffers - The number of buffers (8k in size) to be used by Virtuoso. Defaults to 2000.
 * - \c ServerThreads   - The number of server threads. Defaults to 100.
 * - \c CheckpointInterval - The interval in minutes at which Virtuoso will automatically make a database checkpoint. Defaults to 60.
 * - \c MinAutoCheckpointSize - The minimum size of the Virtuoso transaction log. An automatic checkpoint will not be made if there is
 *                              less than MinAutoCheckpointSize bytes in the current transaction log. Defaults to 4000000.
 * - \c forcedstart - A boolean property which when set will result in the backend killing any Virtuoso instance accessing the
 *                    data in the storage dir before starting its own instance. This option is ignored when connecting to an already
 *                    running Virtuoso server.
 * - \c QueryTimeout - The maximum time any query may take in milliseconds. See <a href="http://docs.openlinksw.com/virtuoso/anytimequeries.html">
 *                     Virtuoso Anytime Queries</a> for details.
 * - \c noStatementSignals - A boolean property which when set will disable the statement signals like Model::statementsAdded(). The default
 *                           is \p false, ie. to emit the signals.
 *
 * The settings above are user settings and have to be provided using Soprano::BackendOptionUser:
 *
 * \code
 * Soprano::BackendSettings settings;
 * // configure the used indexes
 * settings << Soprano::BackendSetting( "indexes", "spog,posg,opsg" );
 *
 * // set the full text index to be updated every 10 minutes
 * settings << Soprano::BackendSetting( "fulltextindex", "10" );
 * \endcode
 *
 * The following setting is required for starting a local instance of Virtuoso:
 *
 * \li Soprano::BackendOptionStorageDir - Set the storage folder to use when spawning a local
 *      instance of Virtuoso. This can not be combined with any of the settings above.
 *
 * The following settings need to be provided to access an already running Virtuoso server:
 *
 * \li Soprano::BackendOptionHost - Set the host the Virtuoso server is running on.
 * \li Soprano::BackendOptionPort - Set the port the Virtuoso server is running on.
 * \li Soprano::BackendOptionUsername - Set the user name to connect to the Virtuoso server.
 * \li Soprano::BackendOptionPassword - Set the password to connect to the Virtuoso server.
 *
 *
 * \section soprano_backend_vituoso_additions Additional Features
 *
 * \subsection soprano_backend_virtuoso_stopped_signal Server Stopped Signal
 *
 * Models created by the Virtuoso backend emit a non-standard signal which informs the client that the Virtuoso server went down.
 * This signal is only emitted for Virtuoso instances that were started by the backend and has the following signature:
 *
 * \code
 * void virtuosoStopped(bool normalExit);
 * \endcode
 *
 * The parameter \p normalExit is \p true if the instance went down as scheduled (deletion of the model) and \p false if the
 * Virtuoso instance crashed or was killed by a third party. Typically a client would connect to the signal to properly re-create the model.
 *
 * \subsection soprano_backend_virtuoso_sql_queries SQL Queries
 *
 * It is possible to perform plain SQL queries through the %Soprano API by using the \p sql user query language in Model::executeQuery:
 *
 * \code
 * QString query = "select * from DB.DBA.RDF_GRAPH_GROUP";
 * Soprano::QueryResultIterator it = model->executeQuery(query, Soprano::Query::QueryLanguageUser, "sql");
 * \endcode
 *
 * \section soprano_backend_virtuoso_specialities Virtuoso Specialities
 *
 * Since Virtuoso is an SQL server and, thus, does store all RDF data in SQL tables it
 * has some characteristics that are worth mentioning:
 *
 * \subsection soprano_virtuoso_empty_graph The Empty Graph
 *
 * Virtuoso/SPAURL has no notion of the empty/default graph. Thus, by default,
 * it is not possible to add statements to the empty/default graph. The %Soprano backend
 * works around this problem by introducing a special named graph which is used internally
 * to store triples that belong to the default/empty graph.
 *
 * This means that a conversion needs to take place whenever the empty graph or the special
 * graph are encountered. This introduces a slight performance penalty. In the future an option
 * might be introduced to disable this behaviour.
 *
 *
 * \subsection soprano_virtuoso_types SQL Types
 *
 * Virtuoso, being an SQL server, does not have specific types for boolean, decimal and others.
 * They are all represented as SQL integer values.
 *
 * The backend does solve this issue for boolean values only by introducing a fake datatype
 * for boolean literals.
 * This is converted internally so the user of the backend will never notice it. The only exception
 * may be queries that contain filters. More input is needed here.
 */
