Thanks Ivan, that looks promising. Will this method work with relational data that I have setup an RDF view for?
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...? I'm trying this, and it doesn't like my define 'input:storage' line Create procedure TEST() { declare ses any; ses := string_output(); RDF_GRAPH_TO_TTL( 'http://terapath.net/adb/source/data/concepts#', ses ); string_to_file( 'test.ttl', ses, -2); }; sparql define input:storage <http://terapath.net/adb/quad_storage/default>; TEST(); - 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 > >