Ah, I figured out a way to do this.. I write to the string stream as I go, and every N times through the loop I append it to a file and flush the string stream.
- Alex > -----Original Message----- > From: virtuoso-users-boun...@lists.sourceforge.net > [mailto:virtuoso-users-boun...@lists.sourceforge.net] On > Behalf Of Alex Black > Sent: Monday, April 30, 2007 2:14 PM > To: imikhailov; virtuoso-users@lists.sourceforge.net > Subject: Re: [Virtuoso-users] Export RDF to a file > > 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 > > > > > > > > > > > > -------------------------------------------------------------- > ----------- > This SF.net email is sponsored by DB2 Express Download DB2 > Express C - the FREE version of DB2 express and take control > of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Virtuoso-users mailing list > Virtuoso-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/virtuoso-users >