Thanks again Ivan.

Is there any way I can write out to a file as I go - rather than storing
it all in an in-memory string stream?

- Alex 

> -----Original Message-----
> From: imikhailov [mailto:imikhai...@openlinksw.com] 
> Sent: Monday, April 30, 2007 1:49 PM
> To: Alex Black; virtuoso-users@lists.sourceforge.net
> Subject: RE: [Virtuoso-users] Export RDF to a file
> 
> Alex,
> 
> > Will this method work with relational data that I have setup an RDF 
> > view
> for?
> 
> The idea will work, thw procedure will not. It access 
> directly to RDF_QUAD ignoring any quad maps ('RDF views').
> 
> > When I invoke this method with my graph, I get an empty 
> file, which I
> assume is because I have not figured out how to speicfy my 
> quad storage...?
> 
> 
> Yes,
> To get data from your storage, the loop
> 
> for (select S as subj, P as pred, O as obj from RDF_QUAD 
> where G = iri_to_id
> (graph_iri)) do
> 
> should be replaced with something like
> 
> for (select subq."s" as subj, subq."p" as pred, subq."o" as 
> obj from ( sparql
>   define output:valmode "LONG"
>   define input:storage <http://terapath.net/adb/quad_storage/default>
>   select ?s ?p ?o from <graph-in-question>
>   ) subq) do
> 
> Best Regards,
> IvAn.
> 
> 
> 
> - Alex 
> 
> > -----Original Message-----
> > From: imikhailov [mailto:imikhai...@openlinksw.com]
> > Sent: Monday, April 30, 2007 11:36 AM
> > To: Alex Black; virtuoso-users@lists.sourceforge.net
> > Subject: RE: [Virtuoso-users] Export RDF to a file
> > 
> > Alex,
> > 
> > CONSTRUCT is definitely not the best way, because it 
> creates in-memory 
> > dictionary of created triples, 1.8.Gb dictionary of this sort may 
> > abort client connection by 'memory low' alert.
> > 
> > Latest commercial Virtuoso build contains function
> > 
> > DB.DBA.RDF_GRAPH_TO_TTL (in graph_iri varchar, inout ses any)
> > 
> > that gets a graph IRI and writes the content of the graph 
> into string 
> > output object that is passes as second argument (if second 
> argument is 
> > NULL then it will output to the current HTTP client 
> connection, if the 
> > procedure is called not from an HTTP request then NULL 
> argument will 
> > result in error).
> > 
> > While the patch that contains this function is on its way to public 
> > Virtuoso Open Source repository, you may temporarily clone it.
> > 
> > create procedure DB.DBA.RDF_GRAPH_TO_TTL (in graph_iri 
> varchar, inout 
> > ses
> > any)
> > {
> >   declare tcount integer;
> >   declare res varchar;
> >   declare prev_s, prev_p IRI_ID;
> >   tcount := 0;
> >   prev_s := null;
> >   prev_p := null;
> >   for (select S as subj, P as pred, O as obj from RDF_QUAD 
> where G = 
> > iri_to_id (graph_iri)) do
> >     {
> >       if (prev_s = subj)
> >         {
> >           if (prev_p = pred)
> >             {
> >               http (',\n\t\t', ses);
> >               goto print_o;
> >             }
> >           http (';\n\t', ses);
> >           goto print_p;
> >         }
> >       if (prev_s is not null)
> >         http ('.\n', ses);
> >       if (subj >= #i1000000000)
> >         http (sprintf ('_:b%d ', iri_id_num (subj)), ses);
> >       else
> >         {
> >           res := id_to_iri (subj);
> >           http ('<', ses);
> >           http_escape (res, 12, ses, 1, 1);
> >           http ('> ', ses);
> >         }
> >       prev_s := subj;
> >       prev_p := null;
> > print_p:
> >       if (pred >= #i1000000000)
> >         signal ('RDFXX', 'DB.DBA.RDF_GRAPH_TO_TTL(): blank node as 
> > predicate');
> >       else
> >         {
> >           res := id_to_iri (pred);
> >           http ('<', ses);
> >           http_escape (res, 12, ses, 1, 1);
> >           http ('> ', ses);
> >         }
> >       prev_p := pred;
> > print_o:
> >        DB.DBA.RDF_LONG_TO_TTL (obj, ses);
> >        tcount := tcount + 1;
> >     }
> >   if (0 = tcount)
> >     http ('# Empty TURTLE', ses);
> >   else
> >     http ('.\n', ses);
> > }
> > ;
> > 
> > Please rename it to something else to avoid possible 
> conflict when the 
> > function with this name will appear in the VOS release; you 
> may also 
> > create it without renaming but drop it before the upgrade.
> > You may also replace the condition 'where G = iri_to_id 
> (graph_iri)' 
> > with something else. but in that case you may wish to add 'order by 
> > 1,2,3' or the result may become not so pretty-printed.
> > 
> > Before next major release, Virtuoso will optimize some CONSTRUCT 
> > queries so they will avoid in-memory dictionary in some cases, 
> > including 'dump graph'
> > case; this will eliminate the complication.
> > 
> > Best Regards,
> > IvAn Mikhailov.
> > 
> > 
> > -----Original Message-----
> > From: Alex Black [mailto:alex.bl...@terapath.net]
> > Sent: Monday, April 30, 2007 10:11 PM
> > To: imikhailov; virtuoso-users@lists.sourceforge.net
> > Subject: RE: [Virtuoso-users] Export RDF to a file
> > 
> > Ok, thanks Ivan.
> > 
> > Related to this, are there any other options for exporting 
> triples to 
> > a file?
> > 
> > If I want to export my 1.8gb of data to RDF TTL, is this the most 
> > performant method in Virtuoso?
> > 
> > - Alex
> > 
> > 
> 
> 

Reply via email to