Hi Ivan,

thanks a lot for your proposal. It is almost identical to what I ended
up doing. Except for the last few lines where I used:

       foreach(any row in rows) do
        {
            cnt := cnt + 1;
            result(sprintf('sparql clear graph <%s>', row[0]));
            if(state <> '00000')
                signal(state, msg);
       }

Should I rather use "sparql clear graph identified by iri(?:g)"?
Also is the "commit work" necessary?

Cheers,
Sebastian

On 11/24/2011 12:31 PM, Ivan Mikhailov wrote:
> Hello Sebastian,
> 
> Consider this:
> 
> create procedure nrl_drop_graphs(in query_base varchar, in query_params
> any := null)
> {
>   declare stat, msg varchar;
>   declare metas, rset any;
>   stat := '00000';
>   if (query_params is null)
>     query_params := vector ();
>   exec ('sparql ' || query_base, stat, msg, query_params, 1000, metas,
> rset);
>   if ('00000' <> stat) -- If error state is set while the query is
> executed...
>     signal (stat, msg); -- ...then we resignal it.
>   if (1 <> length (metas[0]))
>     signal ('?????', 'The query is supposed to return exactly one
> column, containing graphs to drop');
>   foreach (any row in rset) do
>     {
>       declare g any;
>       g := row[0]; -- The value of first (and the only) columns of row.
>       if (__tag(g) in (__tag of varchar, __tag of nvarchar, __tag of
> IRI_ID))
>         {
>           sparql drop silent graph identified by iri(?:g);
>           commit work;
>         }
>       else
>         signal ('?????', 'Invalid graph IRI');
>     }
> }
> ;
> 
> A basic test is:
> 
> sparql insert in graph <http://test1/> { <s1> <test> <o1> };
> sparql insert in graph <http://test2/> { <s2> <test> <o2> };
> sparql insert in graph <http://test3/> { <s2> <test> <o3> };
> 
> sparql select * where { graph ?g { ?s <test> ?o} };
> --- Should return three rows.
> 
> nrl_drop_graphs ('select ?g where { graph ?g { ?s <test> ?o }}');
> 
> sparql select * where { graph ?g { ?s <test> ?o} };
> --- Should return zero rows because graphs are just dropped.
> 
> Best Regards,
> 
> Ivan Mikhailov
> OpenLink Software
> http://virtuoso.openlinksw.com
> 
> On Wed, 2011-11-23 at 21:04 +0100, Sebastian Trüg wrote:
>> Hello list,
>>
>> I am trying to write a stored procedure which deletes a set of graphs
>> matching a query. This is what I have so far:
>>
>> create procedure nrl_drop_graphs(IN QUERY_BASE STRING)
>> {
>>     DECLARE query STRING;
>>     query := query_base + ' LIMIT 1000';
>>
>>     declare cnt integer;
>>     cnt := 0;
>>
>>     while(1)
>>     {
>>         declare it cursor for sparql query;
>>         open it;
>>         declare v any;
>>         while(1)
>>         {
>>             WHENEVER NOT FOUND goto done;
>>             FETCH it INTO g;
>>             vector_concat(v, g);
>>         }
>>         done: ;
>>         close it;
>>
>>         if(length(v)=0) return;
>>
>>         for(any g in v)
>>         {
>>             cnt := cnt + 1;
>>             sparql drop graph g;
>>         }
>>     }
>> }
>>
>> The idea is to get all the graphs in batches of 1000 and drop them one
>> by one since that is not possible with SPARUL (at least not in 6.1.4).
>>
>> It fails at the "declare cursor" since it is not happy with the
>> "sparql". This is the first time I try my luck with stored procedures so
>> the code may contains lots of stupidities. :P
>>
>> Thanks for your help.
>>
>> Cheers,
>> Sebastian
>>
>> ------------------------------------------------------------------------------
>> All the data continuously generated in your IT infrastructure 
>> contains a definitive record of customers, application performance, 
>> security threats, fraudulent activity, and more. Splunk takes this 
>> data and makes sense of it. IT sense. And common sense.
>> http://p.sf.net/sfu/splunk-novd2d
>> _______________________________________________
>> Virtuoso-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/virtuoso-users
> 
> 
> 

Reply via email to