Hello Richard,

On Fri, 2010-08-06 at 09:33 +0100, Richard Dale wrote:
> I would like to be able to get results from CONSTRUCT or DESCRIBE
queries over 
> ODBC as NTriples. At present it is only possible to get the results in 
> RDF/XML 
> or TURTLE by specifying them in the query with output:format:
> 
> define output:format "RDF/XML"
> define output:format "TURTLE"

The attached patch adds support for
define output:format "NT"

to recent VOS releases/snapshots, and the feature will be in future
releases of both VOS and Virtuoso Universal Server.

> The Virtuoso manual doesn't include 'plain/text' as a mime type that >
can be 
> specified in the ACCEPT HTTP header for CONSTRUCT queries, but I've found 
> that 
> DBPedia will return NTriples for plain/text requests. Is that a special 
> feature of DBPedia, or can I assume that all queries to Virtuoso SPARQL 
> endpoints will work that way?

DBPedia runs plain Virtuoso, so it will work everywhere.
The 'plain/text' was left undocumented intentionally, because there was some 
risk that the MIME will be replaced with something less generic.
However the risk of change decreases gradually:
IF (it's bad and it's not terribly bad and it's old) THEN that's tradition.

So maybe it's time to document that, thus making the tradition stronger :)

Best Regards,

Ivan Mikhailov
OpenLink Software
http://virtuoso.openlinksw.com

Index: sparql.sql
===================================================================
RCS file: /home/staff/us-cvs/virtuoso/libsrc/Wi/sparql.sql,v
retrieving revision 1.88.2.174
diff -u -U 10 -r1.88.2.174 sparql.sql
--- sparql.sql	5 Aug 2010 08:55:16 -0000	1.88.2.174
+++ sparql.sql	8 Aug 2010 11:27:51 -0000
@@ -4170,53 +4170,55 @@
 }
 ;
 
 create aggregate DB.DBA.RDF_FORMAT_RESULT_SET_AS_TTL (in colvalues any, in colnames any) returns long varchar
 from DB.DBA.RDF_FORMAT_RESULT_SET_AS_TTL_INIT, DB.DBA.RDF_FORMAT_RESULT_SET_AS_TTL_ACC, DB.DBA.RDF_FORMAT_RESULT_SET_AS_TTL_FIN
 ;
 
 
 create procedure DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_INIT (inout _env any)
 {
-  _env := string_output();
+  _env := vector (0, 0, string_output());
   http ('@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
 @prefix rs: <http://www.w3.org/2005/sparql-results#> .
 @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
-_:_ <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2005/sparql-results#results> .\n', _env);
+_:_ <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2005/sparql-results#results> .\n', _env[2]);
 }
 ;
 
 create procedure DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_ACC (inout _env any, inout colvalues any, inout colnames any)
 {
   declare col_ctr, col_count integer;
   declare rowid varchar;
   declare blank_ids any;
   if (__tag of vector <> __tag(_env))
+    DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_INIT (_env);
+  if (isinteger (_env[1]))
     {
       declare col_buf any;
       col_count := length (colnames);
       if (185 <> __tag(_env))
         DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_INIT (_env);
       col_buf := make_array (col_count * 7, 'any');
       for (col_ctr := 0; col_ctr < col_count; col_ctr := col_ctr + 1)
         col_buf [col_ctr * 7] := colnames[col_ctr];
-      _env := vector (0, col_buf, _env);
+      _env[1] := col_buf;
     }
   sparql_rset_nt_write_row (0, _env, colvalues);
 }
 ;
 
 create function DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_FIN (inout _env any) returns long varchar
 {
-  if (185 <> __tag(_env))
+  if (__tag of vector <> __tag(_env))
     DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_INIT (_env);
-  return string_output_string (_env);
+  return string_output_string (_env[2]);
 }
 ;
 
 create aggregate DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT (in colvalues any, in colnames any) returns long varchar
 from DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_INIT, DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_ACC, DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT_FIN
 ;
 
 create procedure DB.DBA.RDF_FORMAT_RESULT_SET_AS_RDF_XML_INIT (inout _env any)
 {
   _env := string_output();
@@ -4567,21 +4569,23 @@
   if (isinteger (_env) and _env)
     ans := 'true';
   else
     ans := 'false';
   http (sprintf ('_:_ <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2005/sparql-results#results> .\n_:_ <http://www.w3.org/2005/sparql-results#boolean> "%s"^^<http://www.w3.org/2001/XMLSchema#boolean> .\n', ans), ses);
   return ses;
 }
 ;
 
 create aggregate DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT (inout one any) returns long varchar
-from DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT_INIT, DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT_ACC, DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT_FIN
+from DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_TTL_INIT,	-- Not DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT_INIT
+ DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_TTL_ACC,	-- Not DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT_ACC
+ DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT_FIN
 ;
 
 
 -----
 -- Insert, delete, modify operations for lists of triples
 
 create procedure DB.DBA.RDF_INSERT_TRIPLES_CL (inout graph_iri any, inout triples any, in log_mode integer := null)
 {
   declare is_text, ctr, old_log_enable, l integer;
   declare ro_id_dict, dp any;
Index: sparql2sqltext.c
===================================================================
RCS file: /home/staff/us-cvs/virtuoso/libsrc/Wi/sparql2sqltext.c,v
retrieving revision 1.47.2.97
diff -u -U 10 -r1.47.2.97 sparql2sqltext.c
--- sparql2sqltext.c	22 Jul 2010 14:20:14 -0000	1.47.2.97
+++ sparql2sqltext.c	8 Aug 2010 08:23:03 -0000
@@ -300,20 +300,28 @@
       default: return;
       }
   if (!strcmp (name, "TURTLE") || !strcmp (name, "TTL"))
     switch (subtype)
       {
       case SELECT_L: case COUNT_DISTINCT_L: case DISTINCT_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_RESULT_SET_AS_TTL"; return;
       case CONSTRUCT_L: case DESCRIBE_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_TRIPLE_DICT_AS_TTL"; return;
       case ASK_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_TTL"; return;
       default: return;
       }
+  if (!strcmp (name, "NT"))
+    switch (subtype)
+      {
+      case SELECT_L: case COUNT_DISTINCT_L: case DISTINCT_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_RESULT_SET_AS_NT"; return;
+      case CONSTRUCT_L: case DESCRIBE_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_TRIPLE_DICT_AS_NT"; return;
+      case ASK_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_NT"; return;
+      default: return;
+      }
   if (!strcmp (name, "JSON"))
     switch (subtype)
       {
       case SELECT_L: case COUNT_DISTINCT_L: case DISTINCT_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_RESULT_SET_AS_JSON"; return;
       case CONSTRUCT_L: case DESCRIBE_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_TRIPLE_DICT_AS_TALIS_JSON"; return;
       case ASK_L: ret_formatter[0] = "DB.DBA.RDF_FORMAT_BOOL_RESULT_AS_JSON"; return;
       default: return;
       }
   if (!strcmp (name, "RDFA;XHTML"))
     switch (subtype)
@@ -3840,21 +3848,21 @@
 print_name:
   ssg_print_global_param_name (ssg, vname);
 }
 
 void
 ssg_print_global_param_name (spar_sqlgen_t *ssg, caddr_t vname)
 {
   sparp_env_t *env = ssg->ssg_sparp->sparp_env;
   char *coloncolon = strstr (vname, "::");
   if ((NULL != coloncolon) && (vname != coloncolon))
-    vname = coloncolon + 1;      
+    vname = coloncolon + 1;
   switch (env->spare_globals_mode)
     {
     case SPARE_GLOBALS_ARE_COLONUMBERED:
       {
         char buf[30];
         int pos = dk_set_position_of_string (env->spare_global_var_names, vname);
         if (0 > pos)
           spar_sqlprint_error ("ssg_" "print_global_param(): unexpected global variable name");
         snprintf (buf, sizeof (buf), " :%d", pos + env->spare_global_num_offset);
         ssg_puts (buf);
@@ -4500,21 +4508,21 @@
   if (SPART_VARNAME_IS_GLOB(tree->_.retval.vname))
     {
       ssg_print_global_param (ssg, tree, vmode);
       goto print_asname;
     }
   e_varname = ssg->ssg_equivs[tree->_.var.equiv_idx]->e_varnames[0];
   if (NULL != tree->_.retval.gp)
     {
       if (SPAR_BINDINGS_INV == tree->_.retval.gp->type)
         {
-          char buf[20]; sprintf (buf, ":binv_%d", tree->_.retval.equiv_idx);
+          char buf[20]; sprintf (buf, ":binv_%ld", (long)(tree->_.retval.equiv_idx));
           ssg_puts (buf);
           goto print_asname; /* see below */
         }
       if (SERVICE_L == tree->_.retval.gp->_.gp.subtype)
         {
           int pos = -1;
           char buf[50];
           SPART *sinv = sparp_get_option (ssg->ssg_sparp, tree->_.retval.gp->_.gp.options, SPAR_SERVICE_INV);
           DO_BOX_FAST_REV (caddr_t, vname, pos, sinv->_.sinv.rset_varnames)
             {
@@ -5173,21 +5181,21 @@
       ssg_find_external_in_equiv (eq, &vartree, &varname);
       if (NULL != vartree)
         {
           SPART *orig = sparp_find_origin_of_external_var (ssg->ssg_sparp, vartree);
           ssg_print_scalar_expn (ssg, orig, needed, asname);
           return 1;
         }
     }
   if (SPAR_BINDINGS_INV == gp->type)
     {
-      char buf[20]; sprintf (buf, " :binv_%d", eq->e_own_idx);
+      char buf[20]; sprintf (buf, " :binv_%ld", (long)(eq->e_own_idx));
       ssg_puts (buf);
       return 1;
     }
   if (flags & SSG_RETVAL_FROM_JOIN_MEMBER)
     {
       for (var_ctr = 0; var_ctr < var_count; var_ctr++)
         {
           SPART *var = eq->e_vars[var_ctr];
           caddr_t tabid = var->_.var.tabid;
           if (NULL == tabid)

Reply via email to