Pilot error: The issue was caused by my using
SELECT DISTINCT ?g WHERE{GRAPH ?g {?s ?p ?o}}

Which finds non empty named graphs (containing one or more statements).  I 
should have been using:

SELECT DISTINCT ?g WHERE {GRAPH ?g{}} 

Which finds empty graphs

On Aug 1, 2014, at 3:49 PM, Arthur Keen <[email protected]> wrote:

> Andy,
> 
> Thanks for clearing that up.  One cannot underestimate Occam's Razor.  I 
> switched my code back to update and replaced DELETE with DROP and that is 
> working, and INSERT also works to create graphs, but using CREATE on update 
> is not creating graphs.  
> 
> When I tried the same queries from the Fuseki control panel and observed the 
> same behavior, ie., the CREATE query
> 
> In SPARQL Update Panel
>       CREATE SILENT GRAPH <http://testGraph10.com/graph10>
> 
> In SPARQL Query Panel
>       SELECT DISTINCT ?g WHERE{GRAPH ?g {?s ?p ?o}}
>       ---------------------------
>       | g                       |
>       ===========================
>       | <http://testGraph1>     |
>       | <http://booger.com/boo> |
>       | <http://queries>        |
>       ---------------------------
> Am I missing something in the CREATE?
> 
> Arthur
> 
> On Aug 1, 2014, at 5:44 AM, Andy Seaborne <[email protected]> wrote:
> 
>> It's DROP not DELETE in SPARQL Update.
>> 
>> DELETE is for triples, DROP is for whole graphs.
>> 
>> http://www.w3.org/TR/sparql11-update/#graphManagement
>> 
>> On 31/07/14 22:47, Arthur Keen wrote:
>>> For executing CREATE or DELETE GRAPH in Fuseki
>>> I tried to use them the same way as SPARQL INSERT/DELETE by posting to 
>>> ../ds/update, but this did not work
>>> 
>>> Which Endpoint URL pattern I should use:
>>> http://localhost:8080/ds/update,
>>> http://localhost:8080/ds/graph
>> 
>> There are two things here:
>> 
>> 1/ SPARQL Update -- CREATE and DROP -- use the "update" endpoint
>> 
>> 2/ SPARQL Graph Store Protocol -- this is not SPARQL Update -- use a 
>> writeable GSP endpoint.
>> 
>> GSP is normal HTTP usage on web resource GET/PUT/POST/DELETE/HEAD
>> 
>> http://www.w3.org/TR/sparql11-http-rdf-update/
>> 
>> what that document does is really explain how the REST(ish) use of HTTP 
>> applies to graph store.  It isn't defining anything new except the naming 
>> scheme for graphs.
>> 
>> In GSP, the app (HTTP) PUT RDF syntax (Turtle, N-triples, JSON-LD) to create 
>> or replace the contents of a graph and POST to create or add to a graph.
>> 
>> HTTP DELETE deletes a web resource as normal.
>> 
>>> 
>>> For Creating a graph do you use an http put or post request?
>>> For deleting a graph do you use an http delete request
>>> 
>>> And the name of the variable to bind the query to.  Using query, update, 
>>> etc as variable names, see commented out lines of code below
>>> Thanks very much,
>> 
>> They don't take variables.
>> 
>> Just do e.g.
>> 
>> INSERT DATA { GRAPH :g { :s :p :o } }
>> 
>> and a graph is created for :g
>> 
>> INSERT
>> { GRAPH ?g { :s :p :o } }
>> WHERE
>> { ... ?g ... }
>> 
>> Whether CREATE is necessary in other situations depends on the storage
>> implementation. In Fuseki, with all the Jena provided storage
>> alternative, it is not needed.
>> 
>> It's possible other storage layers need graphs creating beforehand. I
>> don't know of any. In a quad store, it's fairly irrelevant distinction.
>> 
>>> 
>>> Any guidance would be much appreciated
>>> 
>>> Arthur
>> 
>>      Hope that makes it clearer,
>>      Andy
>> 
>>> For context, here is the node.js code that I am using to call fuseki, with 
>>> commented out variations of httpreq that I have tried
>>> 
>>> //http://localhost:3000/graph/create?graphName=http://testGraph
>>> app.get('/api/graph/create', function(req, res){
>>>   var update = "CREATE SILENT GRAPH <?:graphName>";
>>>   var graphName = req.param("graphName");
>>>   update = update.replaceAll("?:"+"graphName", graphName);
>>>           //httpreq.post(endpoint.getUpdateURL(), {parameters: {update: 
>>> update}}, function (geterr, getres){
>>>           //httpreq.post(endpoint.getGraphURL(), {parameters: {update: 
>>> update}}, function (geterr, getres){
>>>       httpreq.put(endpoint.getGraphURL(), {parameters: {query: update}}, 
>>> function (geterr, getres){
>>>           if (geterr) return console.log(geterr);
>>>         res.send(endpoint.getGraphURL()+"   "+ update+"   "+ graphName);
>>>       });
>>>   });
>>> 
>>> //http://localhost:3000/graph/delete?graphName=http://testGraph
>> 
>> If you are using the default naming /delete and /create don't exist as 
>> services.
>> 
>>> 
>>> app.get('/graph/delete', function(req, res) {
>>>    var update = "DELETE SILENT GRAPH <?:graphName>";
>>>    var graphName = req.param("graphName");
>>>    update = update.replaceAll("?:" + "graphName", graphName);
>>>    //httpreq.post(endpoint.getUpdateURL(), {parameters: {update: update}}, 
>>> function(geterr, getres) {
>>>    httpreq.delete(endpoint.getGraphURL(), {parameters: {graph: update}}, 
>>> function(geterr, getres) {
>>>        if (geterr)
>>>            return console.log(geterr);
>>>        console.log(update);
>>>        res.send(endpoint.getGraphURL());
>>>    });
>>> });
>> 
>> 
>> If you want security, you can either front Fuseki with httpd/nginx (that's 
>> advisable anyway for any java web container), or wait for Fuseki2.
>> 
>>      Andy
> 

Reply via email to