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)